github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/api/controller/caasmodeloperator/client.go (about)

     1  // Copyright 2020 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package caasmodeloperator
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/version/v2"
     9  
    10  	"github.com/juju/juju/api/base"
    11  	apiwatcher "github.com/juju/juju/api/watcher"
    12  	"github.com/juju/juju/core/resources"
    13  	"github.com/juju/juju/core/watcher"
    14  	"github.com/juju/juju/docker"
    15  	"github.com/juju/juju/rpc/params"
    16  )
    17  
    18  // Client is a caas model operator facade client
    19  type Client struct {
    20  	facade base.FacadeCaller
    21  }
    22  
    23  // NewClient returns a client used to access the CAAS Operator Provisioner API.
    24  func NewClient(caller base.APICaller) *Client {
    25  	facadeCaller := base.NewFacadeCaller(caller, "CAASModelOperator")
    26  	return &Client{
    27  		facade: facadeCaller,
    28  	}
    29  }
    30  
    31  // ModelOperatorProvisioningInfo represents return api information for
    32  // provisioning a caas model operator
    33  type ModelOperatorProvisioningInfo struct {
    34  	APIAddresses []string
    35  	ImageDetails resources.DockerImageDetails
    36  	Version      version.Number
    37  }
    38  
    39  // ModelOperatorProvisioningInfo returns the information needed for a given model
    40  // when provisioning into a caas env
    41  func (c *Client) ModelOperatorProvisioningInfo() (ModelOperatorProvisioningInfo, error) {
    42  	var result params.ModelOperatorInfo
    43  	if err := c.facade.FacadeCall("ModelOperatorProvisioningInfo", nil, &result); err != nil {
    44  		return ModelOperatorProvisioningInfo{}, err
    45  	}
    46  	d := result.ImageDetails
    47  	imageRepo := resources.DockerImageDetails{
    48  		RegistryPath: d.RegistryPath,
    49  		ImageRepoDetails: docker.ImageRepoDetails{
    50  			Repository:    d.Repository,
    51  			ServerAddress: d.ServerAddress,
    52  			BasicAuthConfig: docker.BasicAuthConfig{
    53  				Username: d.Username,
    54  				Password: d.Password,
    55  				Auth:     docker.NewToken(d.Auth),
    56  			},
    57  			TokenAuthConfig: docker.TokenAuthConfig{
    58  				IdentityToken: docker.NewToken(d.IdentityToken),
    59  				RegistryToken: docker.NewToken(d.RegistryToken),
    60  				Email:         d.Email,
    61  			},
    62  		},
    63  	}
    64  
    65  	return ModelOperatorProvisioningInfo{
    66  		APIAddresses: result.APIAddresses,
    67  		ImageDetails: imageRepo,
    68  		Version:      result.Version,
    69  	}, nil
    70  }
    71  
    72  // SetPasswords sets the supplied passwords on their corresponding models
    73  func (c *Client) SetPassword(password string) error {
    74  	var result params.ErrorResults
    75  	modelTag, modelCon := c.facade.RawAPICaller().ModelTag()
    76  	if !modelCon {
    77  		return errors.New("not a model connection")
    78  	}
    79  
    80  	args := params.EntityPasswords{
    81  		Changes: []params.EntityPassword{{
    82  			Tag:      modelTag.String(),
    83  			Password: password,
    84  		}},
    85  	}
    86  	err := c.facade.FacadeCall("SetPasswords", args, &result)
    87  	if err != nil {
    88  		return errors.Trace(err)
    89  	}
    90  	return result.OneError()
    91  }
    92  
    93  // WatchModelOperatorProvisioningInfo provides a watcher for changes that affect the
    94  // information returned by ModelOperatorProvisioningInfo.
    95  func (c *Client) WatchModelOperatorProvisioningInfo() (watcher.NotifyWatcher, error) {
    96  	var result params.NotifyWatchResult
    97  	if err := c.facade.FacadeCall("WatchModelOperatorProvisioningInfo", nil, &result); err != nil {
    98  		return nil, err
    99  	}
   100  	if result.Error != nil {
   101  		return nil, result.Error
   102  	}
   103  	return apiwatcher.NewNotifyWatcher(c.facade.RawAPICaller(), result), nil
   104  }