This repository has been archived by the owner on Mar 28, 2019. It is now read-only.
/
disk_creator.go
54 lines (43 loc) · 1.68 KB
/
disk_creator.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package disks
import (
"fmt"
boshlog "github.com/cloudfoundry/bosh-utils/logger"
"github.com/oracle/bosh-oracle-cpi/oci"
"github.com/oracle/bosh-oracle-cpi/oci/client"
"github.com/oracle/bosh-oracle-cpi/oci/resource"
"oracle/oci/core/client/blockstorage"
"oracle/oci/core/models"
)
type diskCreator struct {
connector client.Connector
logger boshlog.Logger
location resource.Location
}
func NewCreator(c client.Connector, l boshlog.Logger, loc resource.Location) Creator {
return &diskCreator{connector: c, logger: l, location: loc}
}
type CreatorFactory func(client.Connector, boshlog.Logger, resource.Location) Creator
func (dc *diskCreator) CreateVolume(name string, sizeinMB int64) (*resource.Volume, error) {
ad := dc.location.AvailabilityDomain()
cid := dc.location.CompartmentID()
details := models.CreateVolumeDetails{AvailabilityDomain: &ad, CompartmentID: &cid,
DisplayName: name, SizeInMBs: sizeinMB}
p := blockstorage.NewCreateVolumeParams().WithCreateVolumeDetails(&details)
res, err := dc.connector.CoreSevice().Blockstorage.CreateVolume(p)
if err != nil {
return nil, fmt.Errorf("Error creating volume. Reason: %s", oci.CoreModelErrorMsg(err))
}
var volume *resource.Volume
if err = dc.waitUntilProvisioned(res.Payload, func(v *models.Volume) {
volume = resource.NewVolume(*v.DisplayName, *v.ID)
}); err != nil {
return nil, err
}
dc.logger.Debug(diskOperationsLogTag, "Created volume %v", volume)
return volume, nil
}
func (dc *diskCreator) waitUntilProvisioned(v *models.Volume, acceptor func(*models.Volume)) error {
waiter := &volumeAvailableWaiter{connector: dc.connector, logger: dc.logger,
availableHandler: acceptor}
return waiter.WaitFor(v)
}