github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/provider/oracle/storage_volumes_test.go (about)

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package oracle_test
     5  
     6  import (
     7  	"errors"
     8  
     9  	"github.com/juju/clock"
    10  	"github.com/juju/go-oracle-cloud/api"
    11  	"github.com/juju/go-oracle-cloud/response"
    12  	jc "github.com/juju/testing/checkers"
    13  	gc "gopkg.in/check.v1"
    14  	"gopkg.in/juju/names.v2"
    15  
    16  	"github.com/juju/juju/environs"
    17  	"github.com/juju/juju/environs/context"
    18  	"github.com/juju/juju/provider/oracle"
    19  	oracletesting "github.com/juju/juju/provider/oracle/testing"
    20  	"github.com/juju/juju/storage"
    21  	"github.com/juju/juju/testing"
    22  )
    23  
    24  type oracleVolumeSource struct {
    25  	testing.BaseSuite
    26  
    27  	callCtx context.ProviderCallContext
    28  }
    29  
    30  var _ = gc.Suite(&oracleVolumeSource{})
    31  
    32  func (s *oracleVolumeSource) SetUpTest(c *gc.C) {
    33  	s.BaseSuite.SetUpTest(c)
    34  	oracletesting.DefaultFakeStorageAPI.ResetCalls()
    35  	// Reset name from changes in environ_test SetUpTest()
    36  	// not required here.
    37  	oracletesting.DefaultEnvironAPI.FakeInstance.All.Result[0].Name = "/Compute-a432100/sgiulitti@cloudbase.com/0/ebc4ce91-56bb-4120-ba78-13762597f837"
    38  	s.callCtx = context.NewCloudCallContext()
    39  }
    40  
    41  func (o *oracleVolumeSource) NewVolumeSource(
    42  	c *gc.C,
    43  	fakestorage *oracletesting.FakeStorageAPI,
    44  	fakeenv *oracletesting.FakeEnvironAPI,
    45  ) storage.VolumeSource {
    46  
    47  	var client oracle.EnvironAPI
    48  	if fakeenv == nil {
    49  		client = &api.Client{}
    50  	} else {
    51  		client = fakeenv
    52  	}
    53  
    54  	environ, err := oracle.NewOracleEnviron(
    55  		&oracle.EnvironProvider{},
    56  		environs.OpenParams{
    57  			Config: testing.ModelConfig(c),
    58  		},
    59  		client,
    60  		&advancingClock,
    61  	)
    62  	c.Assert(err, gc.IsNil)
    63  	c.Assert(environ, gc.NotNil)
    64  	source, err := oracle.NewOracleVolumeSource(environ,
    65  		"controller-uuid",
    66  		"some-uuid-things-with-magic",
    67  		fakestorage,
    68  		clock.WallClock,
    69  	)
    70  	c.Assert(err, gc.IsNil)
    71  	c.Assert(source, gc.NotNil)
    72  	return source
    73  }
    74  
    75  func (o *oracleVolumeSource) TestCreateVolumesWithEmptyParams(c *gc.C) {
    76  	source := o.NewVolumeSource(c, oracletesting.DefaultFakeStorageAPI, nil)
    77  	result, err := source.CreateVolumes(o.callCtx, nil)
    78  	c.Assert(err, gc.IsNil)
    79  	c.Assert(result, gc.NotNil)
    80  }
    81  
    82  func (o *oracleVolumeSource) TestCreateVolumes(c *gc.C) {
    83  	source := o.NewVolumeSource(c, oracletesting.DefaultFakeStorageAPI, nil)
    84  	results, err := source.CreateVolumes(o.callCtx, []storage.VolumeParams{
    85  		{
    86  			Size:     uint64(10000),
    87  			Provider: oracle.DefaultTypes[0],
    88  		},
    89  	})
    90  	c.Assert(err, gc.IsNil)
    91  	c.Assert(results, gc.HasLen, 1)
    92  	c.Assert(results[0].Error, jc.ErrorIsNil)
    93  }
    94  
    95  func (o *oracleVolumeSource) TestCreateVolumesAlreadyExists(c *gc.C) {
    96  	source := o.NewVolumeSource(c, &oracletesting.FakeStorageAPI{
    97  		FakeComposer: oracletesting.FakeComposer{
    98  			Compose: "/Compute-acme/jack.jones@example.com/allowed_video_servers",
    99  		},
   100  		FakeStorageVolume: oracletesting.FakeStorageVolume{
   101  			StorageVolume: response.StorageVolume{
   102  				Name: "foo",
   103  				Size: 123 * 1024 * 1024,
   104  				Tags: []string{
   105  					"juju-model-uuid=some-uuid-things-with-magic",
   106  				},
   107  			},
   108  			CreateErr: &api.ErrStatusConflict{},
   109  		},
   110  	}, nil)
   111  	volumeTag := names.NewVolumeTag("666")
   112  	results, err := source.CreateVolumes(o.callCtx, []storage.VolumeParams{{
   113  		Tag:      volumeTag,
   114  		Size:     uint64(10000),
   115  		Provider: oracle.DefaultTypes[0],
   116  	}})
   117  	c.Assert(err, jc.ErrorIsNil)
   118  	c.Assert(results, gc.HasLen, 1)
   119  	c.Assert(results[0].Error, jc.ErrorIsNil)
   120  	c.Assert(results[0].Volume, jc.DeepEquals, &storage.Volume{
   121  		volumeTag,
   122  		storage.VolumeInfo{
   123  			VolumeId:   "foo",
   124  			Size:       123,
   125  			Persistent: true,
   126  		},
   127  	})
   128  }
   129  
   130  func (o *oracleVolumeSource) TestCreateVolumeError(c *gc.C) {
   131  	fake := &oracletesting.FakeStorageAPI{
   132  		FakeComposer: oracletesting.FakeComposer{
   133  			Compose: "/Compute-acme/jack.jones@example.com/allowed_video_servers",
   134  		},
   135  		FakeStorageVolume: oracletesting.FakeStorageVolume{
   136  			CreateErr: errors.New("FakeStorageVolumeErr"),
   137  		},
   138  	}
   139  	source := o.NewVolumeSource(c, fake, nil)
   140  	results, err := source.CreateVolumes(o.callCtx, []storage.VolumeParams{
   141  		{
   142  			Size:     uint64(10000),
   143  			Provider: oracle.DefaultTypes[0],
   144  		},
   145  	})
   146  	c.Assert(err, gc.IsNil)
   147  	c.Assert(results, gc.HasLen, 1)
   148  	c.Assert(results[0].Error, gc.NotNil)
   149  	c.Assert(results[0].Error, gc.ErrorMatches, "FakeStorageVolumeErr")
   150  }
   151  
   152  func (o *oracleVolumeSource) TestListVolumes(c *gc.C) {
   153  	source := o.NewVolumeSource(c, oracletesting.DefaultFakeStorageAPI, nil)
   154  	volumes, err := source.ListVolumes(o.callCtx)
   155  	c.Assert(err, gc.IsNil)
   156  	c.Assert(volumes, gc.NotNil)
   157  }
   158  
   159  func (o *oracleVolumeSource) TestListVolumesWithErrors(c *gc.C) {
   160  	for _, fake := range []*oracletesting.FakeStorageAPI{
   161  		{
   162  			FakeComposer: oracletesting.FakeComposer{
   163  				Compose: "/Compute-acme/jack.jones@example.com/allowed_video_servers",
   164  			},
   165  			FakeStorageVolume: oracletesting.FakeStorageVolume{
   166  				AllErr: errors.New("FakeStorageVolumeErr"),
   167  			},
   168  		},
   169  	} {
   170  		source := o.NewVolumeSource(c, fake, nil)
   171  		_, err := source.ListVolumes(o.callCtx)
   172  		c.Assert(err, gc.NotNil)
   173  	}
   174  }
   175  
   176  func (o *oracleVolumeSource) TestDescribeVolumes(c *gc.C) {
   177  	source := o.NewVolumeSource(c, oracletesting.DefaultFakeStorageAPI, nil)
   178  	volumes, err := source.DescribeVolumes(o.callCtx, []string{})
   179  	c.Assert(err, gc.IsNil)
   180  	c.Assert(volumes, gc.NotNil)
   181  
   182  	volumes, err = source.DescribeVolumes(o.callCtx, []string{"JujuTools_storage"})
   183  	c.Assert(err, gc.IsNil)
   184  	c.Assert(volumes, gc.NotNil)
   185  }
   186  
   187  func (o *oracleVolumeSource) TestDescribeVolumesWithErrors(c *gc.C) {
   188  	for _, fake := range []*oracletesting.FakeStorageAPI{
   189  		{
   190  			FakeComposer: oracletesting.FakeComposer{
   191  				Compose: "/Compute-acme/jack.jones@example.com/allowed_video_servers",
   192  			},
   193  			FakeStorageVolume: oracletesting.FakeStorageVolume{
   194  				AllErr: errors.New("FakeStorageVolumeErr"),
   195  			},
   196  		},
   197  	} {
   198  		source := o.NewVolumeSource(c, fake, nil)
   199  		_, err := source.DescribeVolumes(o.callCtx, []string{"JujuTools_storage"})
   200  		c.Assert(err, gc.NotNil)
   201  	}
   202  }
   203  
   204  func (o *oracleVolumeSource) TestDestroyVolumes(c *gc.C) {
   205  	source := o.NewVolumeSource(c, oracletesting.DefaultFakeStorageAPI, nil)
   206  	errs, err := source.DestroyVolumes(o.callCtx, []string{"foo"})
   207  	c.Assert(err, gc.IsNil)
   208  	c.Assert(errs, jc.DeepEquals, []error{nil})
   209  }
   210  
   211  func (o *oracleVolumeSource) TestDestroyVolumesWithErrors(c *gc.C) {
   212  	for _, fake := range []*oracletesting.FakeStorageAPI{
   213  		{
   214  			FakeComposer: oracletesting.FakeComposer{
   215  				Compose: "/Compute-acme/jack.jones@example.com/allowed_video_servers",
   216  			},
   217  			FakeStorageVolume: oracletesting.FakeStorageVolume{
   218  				DeleteErr: errors.New("FakeStorageVolumeErr"),
   219  			},
   220  		},
   221  	} {
   222  		source := o.NewVolumeSource(c, fake, nil)
   223  		errs, err := source.DestroyVolumes(o.callCtx, []string{"JujuTools_storage"})
   224  		c.Assert(err, gc.IsNil)
   225  		for _, val := range errs {
   226  			c.Assert(val, gc.NotNil)
   227  		}
   228  	}
   229  }
   230  
   231  func (o *oracleVolumeSource) TestReleaseVolumes(c *gc.C) {
   232  	o.PatchValue(
   233  		&oracletesting.DefaultFakeStorageAPI.StorageVolume.Tags,
   234  		[]string{"abc", "juju-model-uuid=foo", "bar=baz"},
   235  	)
   236  
   237  	source := o.NewVolumeSource(c, oracletesting.DefaultFakeStorageAPI, nil)
   238  	errs, err := source.ReleaseVolumes(o.callCtx, []string{"foo"})
   239  	c.Assert(err, gc.IsNil)
   240  	c.Assert(errs, jc.DeepEquals, []error{nil})
   241  
   242  	oracletesting.DefaultFakeStorageAPI.FakeStorageVolume.CheckCallNames(
   243  		c, "StorageVolumeDetails", "UpdateStorageVolume",
   244  	)
   245  	updateCall := oracletesting.DefaultFakeStorageAPI.FakeStorageVolume.Calls()[1]
   246  	arg0 := updateCall.Args[0].(api.StorageVolumeParams)
   247  	c.Assert(arg0.Tags, jc.DeepEquals, []string{"abc", "bar=baz"})
   248  }
   249  
   250  func (o *oracleVolumeSource) TestReleaseVolumesUnchanged(c *gc.C) {
   251  	// Volume has no tags, which means there's no update required.
   252  	o.PatchValue(
   253  		&oracletesting.DefaultFakeStorageAPI.StorageVolume.Tags,
   254  		[]string{},
   255  	)
   256  
   257  	source := o.NewVolumeSource(c, oracletesting.DefaultFakeStorageAPI, nil)
   258  	errs, err := source.ReleaseVolumes(o.callCtx, []string{"foo"})
   259  	c.Assert(err, gc.IsNil)
   260  	c.Assert(errs, jc.DeepEquals, []error{nil})
   261  
   262  	oracletesting.DefaultFakeStorageAPI.FakeStorageVolume.CheckCallNames(
   263  		c, "StorageVolumeDetails",
   264  	)
   265  }
   266  
   267  func (o *oracleVolumeSource) TestImportVolume(c *gc.C) {
   268  	// Volume has no tags, which means there's no update required.
   269  	o.PatchValue(
   270  		&oracletesting.DefaultFakeStorageAPI.StorageVolume.Tags,
   271  		[]string{"abc"},
   272  	)
   273  
   274  	source := o.NewVolumeSource(c, oracletesting.DefaultFakeStorageAPI, nil)
   275  	c.Assert(source, gc.Implements, new(storage.VolumeImporter))
   276  
   277  	info, err := source.(storage.VolumeImporter).ImportVolume(o.callCtx, "foo", map[string]string{"bar": "baz"})
   278  	c.Assert(err, gc.IsNil)
   279  	c.Assert(info, jc.DeepEquals, storage.VolumeInfo{
   280  		VolumeId:   "/Compute-a432100/sgiulitti@cloudbase.com/JujuTools_storage",
   281  		Size:       10,
   282  		Persistent: true,
   283  	})
   284  
   285  	oracletesting.DefaultFakeStorageAPI.FakeStorageVolume.CheckCallNames(
   286  		c, "StorageVolumeDetails", "UpdateStorageVolume",
   287  	)
   288  	updateCall := oracletesting.DefaultFakeStorageAPI.FakeStorageVolume.Calls()[1]
   289  	arg0 := updateCall.Args[0].(api.StorageVolumeParams)
   290  	c.Assert(arg0.Tags, jc.DeepEquals, []string{"abc", "bar=baz"})
   291  }
   292  
   293  func (o *oracleVolumeSource) TestValidateVolumeParamsWithError(c *gc.C) {
   294  	source := o.NewVolumeSource(c, nil, nil)
   295  	err := source.ValidateVolumeParams(
   296  		storage.VolumeParams{
   297  			Size: uint64(3921739812739812739),
   298  		},
   299  	)
   300  	c.Assert(err, gc.NotNil)
   301  }
   302  
   303  func (o *oracleVolumeSource) TestValidateVolumeParams(c *gc.C) {
   304  	source := o.NewVolumeSource(c, nil, nil)
   305  	err := source.ValidateVolumeParams(
   306  		storage.VolumeParams{
   307  			Size: uint64(9999),
   308  		},
   309  	)
   310  	c.Assert(err, gc.IsNil)
   311  }
   312  
   313  func (o *oracleVolumeSource) TestAttachVolumes(c *gc.C) {
   314  	source := o.NewVolumeSource(c, oracletesting.DefaultFakeStorageAPI, oracletesting.DefaultEnvironAPI)
   315  	_, err := source.AttachVolumes(o.callCtx, []storage.VolumeAttachmentParams{
   316  		{
   317  			AttachmentParams: storage.AttachmentParams{
   318  				Provider:   oracle.DefaultTypes[0],
   319  				InstanceId: "0",
   320  				ReadOnly:   false,
   321  			},
   322  			VolumeId: "1",
   323  		},
   324  	})
   325  	c.Assert(err, gc.IsNil)
   326  }
   327  
   328  func (o *oracleVolumeSource) TestDetachVolumes(c *gc.C) {
   329  	source := o.NewVolumeSource(c, oracletesting.DefaultFakeStorageAPI, nil)
   330  	errs, err := source.DetachVolumes(o.callCtx, []storage.VolumeAttachmentParams{
   331  		{
   332  			AttachmentParams: storage.AttachmentParams{
   333  				Provider:   oracle.DefaultTypes[0],
   334  				InstanceId: "JujuTools_storage",
   335  				ReadOnly:   false,
   336  			},
   337  			VolumeId: "1",
   338  		},
   339  	})
   340  	c.Assert(err, gc.IsNil)
   341  	c.Assert(errs, gc.NotNil)
   342  }
   343  
   344  func (o *oracleVolumeSource) TestDetachVolumesWithErrors(c *gc.C) {
   345  	source := o.NewVolumeSource(c, &oracletesting.FakeStorageAPI{
   346  		FakeComposer: oracletesting.FakeComposer{
   347  			Compose: "/Compute-acme/jack.jones@example.com/allowed_video_servers",
   348  		},
   349  		FakeStorageAttachment: oracletesting.FakeStorageAttachment{
   350  			AllErr: errors.New("FakeStorageAttachmentErr"),
   351  		}}, oracletesting.DefaultEnvironAPI)
   352  	_, err := source.DetachVolumes(o.callCtx, []storage.VolumeAttachmentParams{
   353  		{
   354  			AttachmentParams: storage.AttachmentParams{
   355  				Provider:   oracle.DefaultTypes[0],
   356  				InstanceId: "JujuTools_storage",
   357  				ReadOnly:   false,
   358  			},
   359  			VolumeId: "1",
   360  		},
   361  	})
   362  	c.Assert(err, gc.NotNil)
   363  
   364  	source = o.NewVolumeSource(c, &oracletesting.FakeStorageAPI{
   365  		FakeComposer: oracletesting.FakeComposer{
   366  			Compose: "/Compute-acme/jack.jones@example.com/allowed_video_servers",
   367  		},
   368  		FakeStorageAttachment: oracletesting.FakeStorageAttachment{
   369  			All: response.AllStorageAttachments{
   370  				Result: []response.StorageAttachment{
   371  					{
   372  						Account:             nil,
   373  						Hypervisor:          nil,
   374  						Index:               1,
   375  						Instance_name:       "/Compute-a432100/sgiulitti@cloudbase.com/JujuTools/ebc4ce91-56bb-4120-ba78-13762597f837",
   376  						Storage_volume_name: "/Compute-a432100/sgiulitti@cloudbase.com/JujuTools_storage",
   377  						Name:                "/Compute-a432100/sgiulitti@cloudbase.com/JujuTools/ebc4ce91-56bb-4120-ba78-13762597f837/1f90e657-f852-45ad-afbf-9a94f640a7ae",
   378  						Readonly:            false,
   379  						State:               "attached",
   380  						Uri:                 "https://compute.uscom-central-1.oraclecloud.com/storage/attachment/Compute-a432100/sgiulitti%40cloudbase.com/JujuTools/ebc4ce91-56bb-4120-ba78-13762597f837/1f90e657-f852-45ad-afbf-9a94f640a7ae",
   381  					},
   382  				},
   383  			},
   384  			DeleteErr: errors.New("FakeStorageAttachmentErr")}}, oracletesting.DefaultEnvironAPI)
   385  	results, err := source.DetachVolumes(o.callCtx, []storage.VolumeAttachmentParams{
   386  		{
   387  			AttachmentParams: storage.AttachmentParams{
   388  				Provider:   oracle.DefaultTypes[0],
   389  				InstanceId: "JujuTools_storage",
   390  				ReadOnly:   false,
   391  			},
   392  			VolumeId: "1",
   393  		},
   394  	})
   395  
   396  	c.Assert(err, gc.IsNil)
   397  	for _, val := range results {
   398  		c.Assert(val, gc.NotNil)
   399  	}
   400  }