func (st *State) constraintsValidator() (constraints.Validator, error) { // Default behaviour is to simply use a standard validator with // no model specific behaviour built in. var validator constraints.Validator if st.policy != nil { var err error validator, err = st.policy.ConstraintsValidator() if errors.IsNotImplemented(err) { validator = constraints.NewValidator() } else if err != nil { return nil, err } else if validator == nil { return nil, errors.New("policy returned nil constraints validator without an error") } } else { validator = constraints.NewValidator() } // Add supported architectures gleaned from cloud image // metadata to the validator's vocabulary. model, err := st.Model() if err != nil { return nil, errors.Annotate(err, "getting model") } if region := model.CloudRegion(); region != "" { cfg, err := st.ModelConfig() if err != nil { return nil, errors.Trace(err) } arches, err := st.CloudImageMetadataStorage.SupportedArchitectures( cloudimagemetadata.MetadataFilter{ Stream: cfg.AgentStream(), Region: region, }, ) if err != nil { return nil, errors.Annotate(err, "querying supported architectures") } if len(arches) != 0 { validator.UpdateVocabulary(constraints.Arch, arches) } } return validator, nil }