github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/component/all/payload.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 "github.com/juju/cmd" 8 "github.com/juju/errors" 9 10 "github.com/juju/juju/api/base" 11 "github.com/juju/juju/cmd/juju/commands" 12 "github.com/juju/juju/cmd/modelcmd" 13 "github.com/juju/juju/payload" 14 "github.com/juju/juju/payload/api/client" 15 internalclient "github.com/juju/juju/payload/api/private/client" 16 "github.com/juju/juju/payload/context" 17 "github.com/juju/juju/payload/status" 18 unitercontext "github.com/juju/juju/worker/uniter/runner/context" 19 "github.com/juju/juju/worker/uniter/runner/jujuc" 20 ) 21 22 type payloads struct{} 23 24 func (c payloads) registerForServer() error { 25 c.registerHookContext() 26 return nil 27 } 28 29 func (c payloads) registerForClient() error { 30 c.registerPublicCommands() 31 // needed for hook-tool 32 c.registerHookContextCommands() 33 return nil 34 } 35 36 type facadeCaller struct { 37 base.FacadeCaller 38 closeFunc func() error 39 } 40 41 func (c facadeCaller) Close() error { 42 return c.closeFunc() 43 } 44 45 func (payloads) newListAPIClient(cmd *status.ListCommand) (status.ListAPI, error) { 46 apiCaller, err := cmd.NewAPIRoot() 47 if err != nil { 48 return nil, errors.Trace(err) 49 } 50 caller := base.NewFacadeCallerForVersion(apiCaller, "Payloads", 1) 51 52 listAPI := client.NewPublicClient(&facadeCaller{ 53 FacadeCaller: caller, 54 closeFunc: apiCaller.Close, 55 }) 56 return listAPI, nil 57 } 58 59 func (c payloads) registerPublicCommands() { 60 if !markRegistered(payload.ComponentName, "public-commands") { 61 return 62 } 63 64 commands.RegisterEnvCommand(func() modelcmd.ModelCommand { 65 return status.NewListCommand(c.newListAPIClient) 66 }) 67 } 68 69 func (c payloads) registerHookContext() { 70 if !markRegistered(payload.ComponentName, "hook-context") { 71 return 72 } 73 74 unitercontext.RegisterComponentFunc(payload.ComponentName, 75 func(config unitercontext.ComponentConfig) (jujuc.ContextComponent, error) { 76 hctxClient := c.newUnitFacadeClient(config.APICaller) 77 // TODO(ericsnow) Pass the unit's tag through to the component? 78 component, err := context.NewContextAPI(hctxClient, config.DataDir) 79 if err != nil { 80 return nil, errors.Trace(err) 81 } 82 return component, nil 83 }, 84 ) 85 86 c.registerHookContextCommands() 87 } 88 89 type payloadsHookContext struct { 90 jujuc.Context 91 } 92 93 // Component implements context.HookContext. 94 func (c payloadsHookContext) Component(name string) (context.Component, error) { 95 found, err := c.Context.Component(name) 96 if err != nil { 97 return nil, errors.Trace(err) 98 } 99 compCtx, ok := found.(context.Component) 100 if !ok && found != nil { 101 return nil, errors.Errorf("wrong component context type registered: %T", found) 102 } 103 return compCtx, nil 104 } 105 106 func (payloads) newUnitFacadeClient(caller base.APICaller) context.APIClient { 107 facadeCaller := base.NewFacadeCallerForVersion(caller, "PayloadsHookContext", 1) 108 return internalclient.NewUnitFacadeClient(facadeCaller) 109 } 110 111 func (payloads) registerHookContextCommands() { 112 if !markRegistered(payload.ComponentName, "hook-context-commands") { 113 return 114 } 115 116 jujuc.RegisterCommand(context.RegisterCmdName, func(ctx jujuc.Context) (cmd.Command, error) { 117 compCtx := payloadsHookContext{ctx} 118 cmd, err := context.NewRegisterCmd(compCtx) 119 if err != nil { 120 return nil, errors.Trace(err) 121 } 122 return cmd, nil 123 }) 124 125 jujuc.RegisterCommand(context.StatusSetCmdName, func(ctx jujuc.Context) (cmd.Command, error) { 126 compCtx := payloadsHookContext{ctx} 127 cmd, err := context.NewStatusSetCmd(compCtx) 128 if err != nil { 129 return nil, errors.Trace(err) 130 } 131 return cmd, nil 132 }) 133 134 jujuc.RegisterCommand(context.UnregisterCmdName, func(ctx jujuc.Context) (cmd.Command, error) { 135 compCtx := payloadsHookContext{ctx} 136 cmd, err := context.NewUnregisterCmd(compCtx) 137 if err != nil { 138 return nil, errors.Trace(err) 139 } 140 return cmd, nil 141 }) 142 }