// NewKeyManagerAPI creates a new server-side keyupdater API end point. func NewKeyManagerAPI(st *state.State, resources *common.Resources, authorizer common.Authorizer) (*KeyManagerAPI, error) { // Only clients and environment managers can access the key manager service. if !authorizer.AuthClient() && !authorizer.AuthEnvironManager() { return nil, common.ErrPerm } // TODO(wallyworld) - replace stub with real canRead function // For now, only admins can read authorised ssh keys. canRead := func(_ string) bool { return authorizer.GetAuthTag() == adminUser } // TODO(wallyworld) - replace stub with real canWrite function // For now, only admins can write authorised ssh keys for users. // Machine agents can write the juju-system-key. canWrite := func(user string) bool { // Are we a machine agent writing the Juju system key. if user == config.JujuSystemKey { _, ismachinetag := authorizer.GetAuthTag().(names.MachineTag) return ismachinetag } // Are we writing the auth key for a user. if _, err := st.User(user); err != nil { return false } return authorizer.GetAuthTag() == adminUser } return &KeyManagerAPI{ state: st, resources: resources, authorizer: authorizer, canRead: canRead, canWrite: canWrite}, nil }
func NewUserManagerAPI( st *state.State, resources *common.Resources, authorizer common.Authorizer, ) (*UserManagerAPI, error) { if !authorizer.AuthClient() { return nil, common.ErrPerm } resource, ok := resources.Get("createLocalLoginMacaroon").(common.ValueResource) if !ok { return nil, errors.NotFoundf("userAuth resource") } createLocalLoginMacaroon, ok := resource.Value.(func(names.UserTag) (*macaroon.Macaroon, error)) if !ok { return nil, errors.NotValidf("userAuth resource") } return &UserManagerAPI{ state: st, authorizer: authorizer, createLocalLoginMacaroon: createLocalLoginMacaroon, check: common.NewBlockChecker(st), }, nil }
// NewControllerAPI creates a new api server endpoint for managing // environments. func NewControllerAPI( st *state.State, resources *common.Resources, authorizer common.Authorizer, ) (*ControllerAPI, error) { if !authorizer.AuthClient() { return nil, errors.Trace(common.ErrPerm) } // Since we know this is a user tag (because AuthClient is true), // we just do the type assertion to the UserTag. apiUser, _ := authorizer.GetAuthTag().(names.UserTag) isAdmin, err := st.IsControllerAdministrator(apiUser) if err != nil { return nil, errors.Trace(err) } // The entire end point is only accessible to controller administrators. if !isAdmin { return nil, errors.Trace(common.ErrPerm) } return &ControllerAPI{ state: st, authorizer: authorizer, apiUser: apiUser, resources: resources, }, nil }
// NewAPI creates a new instance of the Backups API facade. func NewAPI(st *state.State, resources *common.Resources, authorizer common.Authorizer) (*API, error) { if !authorizer.AuthClient() { return nil, errors.Trace(common.ErrPerm) } // Get the backup paths. dataDir, err := extractResourceValue(resources, "dataDir") if err != nil { return nil, errors.Trace(err) } logsDir, err := extractResourceValue(resources, "logDir") if err != nil { return nil, errors.Trace(err) } paths := backups.Paths{ DataDir: dataDir, LogsDir: logsDir, } // Build the API. machineID, err := extractResourceValue(resources, "machineID") if err != nil { return nil, errors.Trace(err) } b := API{ st: st, paths: &paths, machineID: machineID, } return &b, nil }
// NewActionAPI returns an initialized ActionAPI func NewActionAPI(st *state.State, resources *common.Resources, authorizer common.Authorizer) (*ActionAPI, error) { if !authorizer.AuthClient() { return nil, common.ErrPerm } return &ActionAPI{ state: st, resources: resources, authorizer: authorizer, }, nil }
// NewMetricsManagerAPI creates a new API endpoint for calling metrics manager functions. func NewMetricsManagerAPI( st *state.State, resources *common.Resources, authorizer common.Authorizer, ) (*MetricsManagerAPI, error) { if !authorizer.AuthClient() { return nil, common.ErrPerm } return &MetricsManagerAPI{state: st}, nil }
// NewHighAvailabilityAPI creates a new server-side highavailability API end point. func NewHighAvailabilityAPI(st *state.State, resources *common.Resources, authorizer common.Authorizer) (*HighAvailabilityAPI, error) { // Only clients and environment managers can access the high availability service. if !authorizer.AuthClient() && !authorizer.AuthModelManager() { return nil, common.ErrPerm } return &HighAvailabilityAPI{ state: st, resources: resources, authorizer: authorizer, }, nil }
// NewClient creates a new instance of the Client Facade. func NewClient(st *state.State, resources *common.Resources, authorizer common.Authorizer) (*Client, error) { if !authorizer.AuthClient() { return nil, common.ErrPerm } return &Client{api: &API{ state: st, auth: authorizer, resources: resources, statusSetter: common.NewStatusSetter(st, common.AuthAlways()), }}, nil }
// newAPIWithBacking creates a new server-side Spaces API facade with // the given Backing. func newAPIWithBacking(backing networkingcommon.NetworkBacking, resources *common.Resources, authorizer common.Authorizer) (API, error) { // Only clients can access the Spaces facade. if !authorizer.AuthClient() { return nil, common.ErrPerm } return &spacesAPI{ backing: backing, resources: resources, authorizer: authorizer, }, nil }
// NewImageManagerAPI creates a new server-side imagemanager API end point. func NewImageManagerAPI(st *state.State, resources *common.Resources, authorizer common.Authorizer) (*ImageManagerAPI, error) { // Only clients can access the image manager service. if !authorizer.AuthClient() { return nil, common.ErrPerm } return &ImageManagerAPI{ state: getState(st), resources: resources, authorizer: authorizer, check: common.NewBlockChecker(st), }, nil }
// newPublicFacade is passed into common.RegisterStandardFacade // in registerPublicFacade. func (resources) newPublicFacade(st *corestate.State, _ *common.Resources, authorizer common.Authorizer) (*server.Facade, error) { if !authorizer.AuthClient() { return nil, common.ErrPerm } rst, err := st.Resources() //rst, err := state.NewState(&resourceState{raw: st}) if err != nil { return nil, errors.Trace(err) } return server.NewFacade(rst), nil }
func newClientAllWatcher(st *state.State, resources *common.Resources, auth common.Authorizer, id string) (interface{}, error) { if !auth.AuthClient() { return nil, common.ErrPerm } watcher, ok := resources.Get(id).(*state.Multiwatcher) if !ok { return nil, common.ErrUnknownWatcher } return &srvClientAllWatcher{ watcher: watcher, id: id, resources: resources, }, nil }
// createAPI returns a new image metadata API facade. func createAPI( st metadataAcess, resources *common.Resources, authorizer common.Authorizer, ) (*API, error) { if !authorizer.AuthClient() && !authorizer.AuthModelManager() { return nil, common.ErrPerm } return &API{ metadata: st, authorizer: authorizer, }, nil }
// NewAPI returns a new charm annotator API facade. func NewAPI( st *state.State, resources *common.Resources, authorizer common.Authorizer, ) (*API, error) { if !authorizer.AuthClient() { return nil, common.ErrPerm } return &API{ access: getState(st), authorizer: authorizer, }, nil }
func NewUserManagerAPI( st *state.State, resources *common.Resources, authorizer common.Authorizer, ) (*UserManagerAPI, error) { if !authorizer.AuthClient() { return nil, common.ErrPerm } return &UserManagerAPI{ state: st, authorizer: authorizer, }, nil }
func checkAuth(authorizer common.Authorizer, st *state.State) error { if !authorizer.AuthClient() { return errors.Trace(common.ErrPerm) } // Type assertion is fine because AuthClient is true. apiUser := authorizer.GetAuthTag().(names.UserTag) if isAdmin, err := st.IsControllerAdministrator(apiUser); err != nil { return errors.Trace(err) } else if !isAdmin { // The entire facade is only accessible to controller administrators. return errors.Trace(common.ErrPerm) } return nil }
// NewAPI returns a new service API facade. func NewAPI( st *state.State, resources *common.Resources, authorizer common.Authorizer, ) (*API, error) { if !authorizer.AuthClient() { return nil, common.ErrPerm } return &API{ state: st, authorizer: authorizer, check: common.NewBlockChecker(st), }, nil }
// NewClient creates a new instance of the Client Facade. func NewClient(st *state.State, resources *common.Resources, authorizer common.Authorizer) (*Client, error) { if !authorizer.AuthClient() { return nil, common.ErrPerm } urlGetter := common.NewToolsURLGetter(st.EnvironUUID(), st) return &Client{ api: &API{ state: st, auth: authorizer, resources: resources, statusSetter: common.NewStatusSetter(st, common.AuthAlways()), toolsFinder: common.NewToolsFinder(st, st, urlGetter), }, check: common.NewBlockChecker(st)}, nil }
// NewEnvironmentManagerAPI creates a new api server endpoint for managing // environments. func NewEnvironmentManagerAPI( st *state.State, resources *common.Resources, authorizer common.Authorizer, ) (*EnvironmentManagerAPI, error) { if !authorizer.AuthClient() { return nil, common.ErrPerm } urlGetter := common.NewToolsURLGetter(st.EnvironUUID(), st) return &EnvironmentManagerAPI{ state: getState(st), authorizer: authorizer, toolsFinder: common.NewToolsFinder(st, st, urlGetter), }, nil }
// createAPI returns a new storage API facade. func createAPI( st storageAccess, pm poolmanager.PoolManager, resources *common.Resources, authorizer common.Authorizer, ) (*API, error) { if !authorizer.AuthClient() { return nil, common.ErrPerm } return &API{ storage: st, poolManager: pm, authorizer: authorizer, }, nil }
// NewAPI creates a new instance of the Backups API facade. func NewAPI(st *state.State, resources *common.Resources, authorizer common.Authorizer) (*API, error) { if !authorizer.AuthClient() { return nil, errors.Trace(common.ErrPerm) } stor, err := newBackupsStorage(st) if err != nil { return nil, errors.Trace(err) } b := API{ st: st, backups: backups.NewBackups(stor), } return &b, nil }
// NewClient creates a new instance of the Client Facade. func NewClient(st *state.State, resources *common.Resources, authorizer common.Authorizer) (*Client, error) { if !authorizer.AuthClient() { return nil, common.ErrPerm } apiState := getState(st) urlGetter := common.NewToolsURLGetter(apiState.ModelUUID(), apiState) client := &Client{ api: &API{ stateAccessor: apiState, auth: authorizer, resources: resources, statusSetter: common.NewStatusSetter(st, common.AuthAlways()), toolsFinder: common.NewToolsFinder(st, st, urlGetter), }, check: common.NewBlockChecker(st)} return client, nil }
// NewMachineManagerAPI creates a new server-side MachineManager API facade. func NewMachineManagerAPI( st *state.State, resources *common.Resources, authorizer common.Authorizer, ) (*MachineManagerAPI, error) { if !authorizer.AuthClient() { return nil, common.ErrPerm } s := getState(st) return &MachineManagerAPI{ st: s, authorizer: authorizer, check: common.NewBlockChecker(s), }, nil }
// NewClient creates a new instance of the Client Facade. func NewClient(st *state.State, resources *common.Resources, authorizer common.Authorizer) (*Client, error) { if !authorizer.AuthClient() { return nil, common.ErrPerm } env, err := st.Environment() if err != nil { return nil, err } urlGetter := common.NewToolsURLGetter(env.UUID(), st) return &Client{api: &API{ state: st, auth: authorizer, resources: resources, statusSetter: common.NewStatusSetter(st, common.AuthAlways()), toolsFinder: common.NewToolsFinder(st, st, urlGetter), }}, nil }
// NewPublicFacade provides the public API facade for resources. It is // passed into common.RegisterStandardFacade. func NewPublicFacade(st *corestate.State, _ *common.Resources, authorizer common.Authorizer) (*server.Facade, error) { if !authorizer.AuthClient() { return nil, common.ErrPerm } rst, err := st.Resources() if err != nil { return nil, errors.Trace(err) } newClient := func() (server.CharmStore, error) { return newCharmStoreClient(st) } facade, err := server.NewFacade(rst, newClient) if err != nil { return nil, errors.Trace(err) } return facade, nil }
// NewPublicFacade provides the public API facade for resources. It is // passed into common.RegisterStandardFacade. func NewPublicFacade(st *corestate.State, _ *common.Resources, authorizer common.Authorizer) (*server.Facade, error) { if !authorizer.AuthClient() { return nil, common.ErrPerm } rst, err := st.Resources() if err != nil { return nil, errors.Trace(err) } newClient := func(cURL *charm.URL, csMac *macaroon.Macaroon) (server.CharmStore, error) { opener := newCharmstoreOpener(cURL, csMac) return opener.newClient(), nil } facade, err := server.NewFacade(rst, newClient) if err != nil { return nil, errors.Trace(err) } return facade, nil }
// NewKeyManagerAPI creates a new server-side keyupdater API end point. func NewKeyManagerAPI(st *state.State, resources *common.Resources, authorizer common.Authorizer) (*KeyManagerAPI, error) { // Only clients and environment managers can access the key manager service. if !authorizer.AuthClient() && !authorizer.AuthEnvironManager() { return nil, common.ErrPerm } env, err := st.Environment() if err != nil { return nil, errors.Trace(err) } // For gccgo interface comparisons, we need a Tag. owner := names.Tag(env.Owner()) // TODO(wallyworld) - replace stub with real canRead function // For now, only admins can read authorised ssh keys. canRead := func(user string) bool { // Are we a machine agent operating as the system identity? if user == config.JujuSystemKey { _, ismachinetag := authorizer.GetAuthTag().(names.MachineTag) return ismachinetag } return authorizer.GetAuthTag() == owner } // TODO(wallyworld) - replace stub with real canWrite function // For now, only admins can write authorised ssh keys for users. // Machine agents can write the juju-system-key. canWrite := func(user string) bool { // Are we a machine agent writing the Juju system key. if user == config.JujuSystemKey { _, ismachinetag := authorizer.GetAuthTag().(names.MachineTag) return ismachinetag } // No point looking to see if the user exists as we are not // yet storing keys on the user. return authorizer.GetAuthTag() == owner } return &KeyManagerAPI{ state: st, resources: resources, authorizer: authorizer, canRead: canRead, canWrite: canWrite, check: common.NewBlockChecker(st), }, nil }
// NewModelManagerAPI creates a new api server endpoint for managing // models. func NewModelManagerAPI(st Backend, authorizer common.Authorizer) (*ModelManagerAPI, error) { if !authorizer.AuthClient() { return nil, common.ErrPerm } // Since we know this is a user tag (because AuthClient is true), // we just do the type assertion to the UserTag. apiUser, _ := authorizer.GetAuthTag().(names.UserTag) // Pretty much all of the user manager methods have special casing for admin // users, so look once when we start and remember if the user is an admin. isAdmin, err := st.IsControllerAdministrator(apiUser) if err != nil { return nil, errors.Trace(err) } urlGetter := common.NewToolsURLGetter(st.ModelUUID(), st) return &ModelManagerAPI{ state: st, authorizer: authorizer, toolsFinder: common.NewToolsFinder(st, st, urlGetter), apiUser: apiUser, isAdmin: isAdmin, }, nil }
func NewUserManagerAPI( st *state.State, resources *common.Resources, authorizer common.Authorizer, ) (*UserManagerAPI, error) { if !authorizer.AuthClient() { return nil, common.ErrPerm } // Since we know this is a user tag (because AuthClient is true), // we just do the type assertion to the UserTag. apiUser, _ := authorizer.GetAuthTag().(names.UserTag) // Pretty much all of the user manager methods have special casing for admin // users, so look once when we start and remember if the user is an admin. isAdmin, err := st.IsControllerAdministrator(apiUser) if err != nil { return nil, errors.Trace(err) } resource, ok := resources.Get("createLocalLoginMacaroon").(common.ValueResource) if !ok { return nil, errors.NotFoundf("userAuth resource") } createLocalLoginMacaroon, ok := resource.Value.(func(names.UserTag) (*macaroon.Macaroon, error)) if !ok { return nil, errors.NotValidf("userAuth resource") } return &UserManagerAPI{ state: st, authorizer: authorizer, createLocalLoginMacaroon: createLocalLoginMacaroon, check: common.NewBlockChecker(st), apiUser: apiUser, isAdmin: isAdmin, }, nil }
// NewAPI creates a new instance of the Backups API facade. func NewAPI(st *state.State, resources *common.Resources, authorizer common.Authorizer) (*API, error) { if !authorizer.AuthClient() { return nil, errors.Trace(common.ErrPerm) } // For now, backup operations are only permitted on the controller environment. if !st.IsStateServer() { return nil, errors.New("backups are not supported for hosted environments") } // Get the backup paths. dataDir, err := extractResourceValue(resources, "dataDir") if err != nil { return nil, errors.Trace(err) } logsDir, err := extractResourceValue(resources, "logDir") if err != nil { return nil, errors.Trace(err) } paths := backups.Paths{ DataDir: dataDir, LogsDir: logsDir, } // Build the API. machineID, err := extractResourceValue(resources, "machineID") if err != nil { return nil, errors.Trace(err) } b := API{ st: st, paths: &paths, machineID: machineID, } return &b, nil }