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  }