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 &params.Credential, nil
   156  }