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 }