github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/component/all/resource.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package all 5 6 import ( 7 jujucmd "github.com/juju/cmd" 8 "github.com/juju/errors" 9 "gopkg.in/juju/names.v2" 10 11 "github.com/juju/juju/api/base" 12 "github.com/juju/juju/apiserver/facades/controller/charmrevisionupdater" 13 "github.com/juju/juju/resource" 14 internalclient "github.com/juju/juju/resource/api/private/client" 15 "github.com/juju/juju/resource/context" 16 contextcmd "github.com/juju/juju/resource/context/cmd" 17 "github.com/juju/juju/resource/resourceadapters" 18 unitercontext "github.com/juju/juju/worker/uniter/runner/context" 19 "github.com/juju/juju/worker/uniter/runner/jujuc" 20 ) 21 22 // resources exposes the registration methods needed 23 // for the top-level component machinery. 24 type resources struct{} 25 26 // RegisterForServer is the top-level registration method 27 // for the component in a jujud context. 28 func (r resources) registerForServer() error { 29 r.registerState() 30 r.registerAgentWorkers() 31 r.registerHookContext() 32 return nil 33 } 34 35 // RegisterForClient is the top-level registration method 36 // for the component in a "juju" command context. 37 func (r resources) registerForClient() error { 38 // needed for hook-tool 39 r.registerHookContextCommands() 40 return nil 41 } 42 43 // registerAgentWorkers adds the resources workers to the agents. 44 func (r resources) registerAgentWorkers() { 45 if !markRegistered(resource.ComponentName, "agent-workers") { 46 return 47 } 48 49 charmrevisionupdater.RegisterLatestCharmHandler("resources", resourceadapters.NewLatestCharmHandler) 50 } 51 52 // registerState registers the state functionality for resources. 53 func (resources) registerState() { 54 if !markRegistered(resource.ComponentName, "state") { 55 return 56 } 57 } 58 59 func (r resources) registerHookContext() { 60 if markRegistered(resource.ComponentName, "hook-context") == false { 61 return 62 } 63 64 unitercontext.RegisterComponentFunc( 65 resource.ComponentName, 66 func(config unitercontext.ComponentConfig) (jujuc.ContextComponent, error) { 67 unitID := names.NewUnitTag(config.UnitName).String() 68 hctxClient, err := r.newUnitFacadeClient(unitID, config.APICaller) 69 if err != nil { 70 return nil, errors.Trace(err) 71 } 72 // TODO(ericsnow) Pass the unit's tag through to the component? 73 return context.NewContextAPI(hctxClient, config.DataDir), nil 74 }, 75 ) 76 77 r.registerHookContextCommands() 78 } 79 80 func (r resources) registerHookContextCommands() { 81 if markRegistered(resource.ComponentName, "hook-context-commands") == false { 82 return 83 } 84 85 jujuc.RegisterCommand( 86 contextcmd.GetCmdName, 87 func(ctx jujuc.Context) (jujucmd.Command, error) { 88 compCtx, err := ctx.Component(resource.ComponentName) 89 if err != nil { 90 return nil, errors.Trace(err) 91 } 92 cmd, err := contextcmd.NewGetCmd(compCtx) 93 if err != nil { 94 return nil, errors.Trace(err) 95 } 96 return cmd, nil 97 }, 98 ) 99 } 100 101 func (r resources) newUnitFacadeClient(unitName string, caller base.APICaller) (context.APIClient, error) { 102 103 facadeCaller := base.NewFacadeCallerForVersion(caller, context.HookContextFacade, 1) 104 httpClient, err := caller.HTTPClient() 105 if err != nil { 106 return nil, errors.Trace(err) 107 } 108 unitHTTPClient := internalclient.NewUnitHTTPClient(httpClient, unitName) 109 110 return internalclient.NewUnitFacadeClient(facadeCaller, unitHTTPClient), nil 111 }