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  }