github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/provider/oracle/provider.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package oracle 5 6 import ( 7 "github.com/juju/clock" 8 "github.com/juju/errors" 9 oci "github.com/juju/go-oracle-cloud/api" 10 "github.com/juju/jsonschema" 11 "github.com/juju/loggo" 12 "github.com/juju/schema" 13 14 "github.com/juju/juju/cloud" 15 "github.com/juju/juju/environs" 16 "github.com/juju/juju/environs/config" 17 "github.com/juju/juju/environs/context" 18 ) 19 20 var logger = loggo.GetLogger("juju.provider.oracle") 21 22 const ( 23 providerType = "oracle" 24 ) 25 26 // EnvironProvider type implements environs.EnvironProvider interface 27 type EnvironProvider struct{} 28 29 var _ environs.CloudEnvironProvider = (*EnvironProvider)(nil) 30 31 // CloudSchema is defined on the environs.EnvironProvider interface. 32 func (e EnvironProvider) CloudSchema() *jsonschema.Schema { 33 return nil 34 } 35 36 // Ping implements environs.EnvironProvider. 37 func (e *EnvironProvider) Ping(ctx context.ProviderCallContext, endpoint string) error { 38 return nil 39 } 40 41 // PrepareConfig is defined on the environs.EnvironProvider interface. 42 func (e EnvironProvider) PrepareConfig(args environs.PrepareConfigParams) (*config.Config, error) { 43 if err := e.validateCloudSpec(args.Cloud); err != nil { 44 return nil, errors.Annotatef(err, "validating cloud spec") 45 } 46 // Set the default block-storage source. 47 attrs := make(map[string]interface{}) 48 if _, ok := args.Config.StorageDefaultBlockSource(); !ok { 49 attrs[config.StorageDefaultBlockSourceKey] = oracleStorageProviderType 50 } 51 if len(attrs) == 0 { 52 return args.Config, nil 53 } 54 return args.Config.Apply(attrs) 55 } 56 57 // validateCloudSpec validates the given configuration against the oracle cloud spec 58 func (e EnvironProvider) validateCloudSpec(spec environs.CloudSpec) error { 59 if err := spec.Validate(); err != nil { 60 return errors.Trace(err) 61 } 62 if spec.Credential == nil { 63 return errors.NotValidf("missing credentials") 64 } 65 66 // validate the authentication type 67 if authType := spec.Credential.AuthType(); authType != cloud.UserPassAuthType { 68 return errors.NotSupportedf("%q auth-type ", authType) 69 } 70 71 if _, ok := spec.Credential.Attributes()["identity-domain"]; !ok { 72 return errors.NotFoundf("identity-domain in the credentials") 73 } 74 75 return nil 76 } 77 78 // Version is part of the EnvironProvider interface. 79 func (EnvironProvider) Version() int { 80 return 0 81 } 82 83 // Open is defined on the environs.EnvironProvider interface. 84 func (e *EnvironProvider) Open(params environs.OpenParams) (environs.Environ, error) { 85 logger.Debugf("opening model %q", params.Config.Name()) 86 if err := e.validateCloudSpec(params.Cloud); err != nil { 87 return nil, errors.Annotatef(err, "validating cloud spec") 88 } 89 90 cli, err := oci.NewClient(oci.Config{ 91 Username: params.Cloud.Credential.Attributes()["username"], 92 Password: params.Cloud.Credential.Attributes()["password"], 93 Endpoint: params.Cloud.Endpoint, 94 Identify: params.Cloud.Credential.Attributes()["identity-domain"], 95 }) 96 if err != nil { 97 return nil, errors.Trace(err) 98 } 99 100 if err = cli.Authenticate(); err != nil { 101 return nil, errors.Trace(err) 102 } 103 104 return NewOracleEnviron(e, params, cli, clock.WallClock) 105 } 106 107 // Validate is defined on the config.Validator interface. 108 func (e EnvironProvider) Validate(cfg, old *config.Config) (valid *config.Config, err error) { 109 if err := config.Validate(cfg, old); err != nil { 110 return nil, err 111 } 112 newAttrs, err := cfg.ValidateUnknownAttrs( 113 schema.Fields{}, schema.Defaults{}, 114 ) 115 if err != nil { 116 return nil, err 117 } 118 119 return cfg.Apply(newAttrs) 120 } 121 122 var credentials = map[cloud.AuthType]cloud.CredentialSchema{ 123 cloud.UserPassAuthType: {{ 124 "username", cloud.CredentialAttr{ 125 Description: "account username", 126 }, 127 }, { 128 "password", cloud.CredentialAttr{ 129 Description: "account password", 130 Hidden: true, 131 }, 132 }, { 133 "identity-domain", cloud.CredentialAttr{ 134 Description: "indetity domain of the oracle account", 135 }, 136 }}, 137 } 138 139 // CredentialSchemas is defined on the environs.ProviderCredentials interface. 140 func (e EnvironProvider) CredentialSchemas() map[cloud.AuthType]cloud.CredentialSchema { 141 return credentials 142 } 143 144 // DetectCredentials is defined on the environs.ProviderCredentials interface. 145 func (e EnvironProvider) DetectCredentials() (*cloud.CloudCredential, error) { 146 return nil, errors.NotFoundf("credentials") 147 } 148 149 // FinalizeCredential is defined on the environs.ProviderCredentials interface. 150 func (e EnvironProvider) FinalizeCredential( 151 cfx environs.FinalizeCredentialContext, 152 params environs.FinalizeCredentialParams, 153 ) (*cloud.Credential, error) { 154 155 return ¶ms.Credential, nil 156 }