mirror of
https://github.com/linuxkit/linuxkit.git
synced 2025-07-19 09:16:29 +00:00
Merge pull request #2302 from dave-tucker/mdgcp
linuxkit: Better GCP disk handling
This commit is contained in:
commit
73b516f09b
@ -178,7 +178,7 @@ func (g GCPClient) DeleteImage(name string) error {
|
||||
}
|
||||
|
||||
// CreateInstance creates and starts an instance on GCP
|
||||
func (g GCPClient) CreateInstance(name, image, zone, machineType string, diskSize int, replace bool) error {
|
||||
func (g GCPClient) CreateInstance(name, image, zone, machineType string, disks Disks, replace bool) error {
|
||||
if replace {
|
||||
if err := g.DeleteInstance(name, zone, true); err != nil {
|
||||
return err
|
||||
@ -197,19 +197,7 @@ func (g GCPClient) CreateInstance(name, image, zone, machineType string, diskSiz
|
||||
sshKey := new(string)
|
||||
*sshKey = fmt.Sprintf("moby:%s moby", string(ssh.MarshalAuthorizedKey(k)))
|
||||
|
||||
diskName := name + "-systemdisk"
|
||||
diskOp, err := g.compute.Disks.Insert(g.projectName, zone, &compute.Disk{Name: diskName, SizeGb: int64(diskSize)}).Do()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := g.pollZoneOperationStatus(diskOp.Name, zone); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
instanceObj := &compute.Instance{
|
||||
MachineType: fmt.Sprintf("zones/%s/machineTypes/%s", zone, machineType),
|
||||
Name: name,
|
||||
Disks: []*compute.AttachedDisk{
|
||||
instanceDisks := []*compute.AttachedDisk{
|
||||
{
|
||||
AutoDelete: true,
|
||||
Boot: true,
|
||||
@ -217,12 +205,39 @@ func (g GCPClient) CreateInstance(name, image, zone, machineType string, diskSiz
|
||||
SourceImage: fmt.Sprintf("global/images/%s", image),
|
||||
},
|
||||
},
|
||||
{
|
||||
}
|
||||
|
||||
for i, disk := range disks {
|
||||
var diskName string
|
||||
if disk.Path != "" {
|
||||
diskName = disk.Path
|
||||
} else {
|
||||
diskName = fmt.Sprintf("%s-disk-%d", name, i)
|
||||
}
|
||||
var diskSizeGb int64
|
||||
if disk.Size == 0 {
|
||||
diskSizeGb = int64(1)
|
||||
} else {
|
||||
diskSizeGb = int64(convertMBtoGB(disk.Size))
|
||||
}
|
||||
diskOp, err := g.compute.Disks.Insert(g.projectName, zone, &compute.Disk{Name: diskName, SizeGb: diskSizeGb}).Do()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := g.pollZoneOperationStatus(diskOp.Name, zone); err != nil {
|
||||
return err
|
||||
}
|
||||
instanceDisks = append(instanceDisks, &compute.AttachedDisk{
|
||||
AutoDelete: true,
|
||||
Boot: false,
|
||||
Source: fmt.Sprintf("zones/%s/disks/%s", zone, diskName),
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
instanceObj := &compute.Instance{
|
||||
MachineType: fmt.Sprintf("zones/%s/machineTypes/%s", zone, machineType),
|
||||
Name: name,
|
||||
Disks: instanceDisks,
|
||||
NetworkInterfaces: []*compute.NetworkInterface{
|
||||
{
|
||||
Network: "global/networks/default",
|
||||
|
@ -22,7 +22,6 @@ const (
|
||||
familyVar = "CLOUDSDK_IMAGE_FAMILY" // non-standard
|
||||
publicVar = "CLOUDSDK_IMAGE_PUBLIC" // non-standard
|
||||
nameVar = "CLOUDSDK_IMAGE_NAME" // non-standard
|
||||
diskSizeVar = "CLOUDSDK_DISK_SIZE" // non-standard
|
||||
)
|
||||
|
||||
// Process the run arguments and execute run
|
||||
@ -41,7 +40,9 @@ func runGcp(args []string) {
|
||||
machineFlag := flags.String("machine", defaultMachine, "GCP Machine Type")
|
||||
keysFlag := flags.String("keys", "", "Path to Service Account JSON key file")
|
||||
projectFlag := flags.String("project", "", "GCP Project Name")
|
||||
diskSizeFlag := flags.Int("disk-size", 0, "Size of system disk in GB")
|
||||
var disks Disks
|
||||
flags.Var(&disks, "disk", "Disk config, may be repeated. [file=]diskName[,size=1G]")
|
||||
|
||||
skipCleanup := flags.Bool("skip-cleanup", false, "Don't remove images or VMs")
|
||||
|
||||
if err := flags.Parse(args); err != nil {
|
||||
@ -60,14 +61,13 @@ func runGcp(args []string) {
|
||||
machine := getStringValue(machineVar, *machineFlag, defaultMachine)
|
||||
keys := getStringValue(keysVar, *keysFlag, "")
|
||||
project := getStringValue(projectVar, *projectFlag, "")
|
||||
diskSize := getIntValue(diskSizeVar, *diskSizeFlag, defaultDiskSize)
|
||||
|
||||
client, err := NewGCPClient(keys, project)
|
||||
if err != nil {
|
||||
log.Fatalf("Unable to connect to GCP")
|
||||
}
|
||||
|
||||
if err = client.CreateInstance(name, name, zone, machine, diskSize, true); err != nil {
|
||||
if err = client.CreateInstance(name, name, zone, machine, disks, true); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
|
@ -135,6 +135,18 @@ func getDiskSizeMB(s string) (int, error) {
|
||||
return 1024 * i, nil
|
||||
}
|
||||
|
||||
func convertMBtoGB(i int) int {
|
||||
if i < 1024 {
|
||||
return 1
|
||||
}
|
||||
|
||||
if i%1024 == 0 {
|
||||
return i / 1024
|
||||
}
|
||||
|
||||
return (i + (1024 - i%1024)) / 1024
|
||||
}
|
||||
|
||||
// DiskConfig is the config for a disk
|
||||
type DiskConfig struct {
|
||||
Path string
|
||||
|
Loading…
Reference in New Issue
Block a user