func CreateVirtualGuestTemplate(stemcell bslcstem.Stemcell, cloudProps VMCloudProperties) (sldatatypes.SoftLayer_Virtual_Guest_Template, error) { virtualGuestTemplate := sldatatypes.SoftLayer_Virtual_Guest_Template{ Hostname: cloudProps.Hostname, Domain: cloudProps.Domain, StartCpus: cloudProps.StartCpus, MaxMemory: cloudProps.MaxMemory, Datacenter: sldatatypes.Datacenter{ Name: cloudProps.Datacenter.Name, }, BlockDeviceTemplateGroup: &sldatatypes.BlockDeviceTemplateGroup{ GlobalIdentifier: stemcell.Uuid(), }, SshKeys: cloudProps.SshKeys, HourlyBillingFlag: cloudProps.HourlyBillingFlag, LocalDiskFlag: cloudProps.LocalDiskFlag, DedicatedAccountHostOnlyFlag: cloudProps.DedicatedAccountHostOnlyFlag, BlockDevices: cloudProps.BlockDevices, NetworkComponents: cloudProps.NetworkComponents, PrivateNetworkOnlyFlag: cloudProps.PrivateNetworkOnlyFlag, PrimaryNetworkComponent: &cloudProps.PrimaryNetworkComponent, PrimaryBackendNetworkComponent: &cloudProps.PrimaryBackendNetworkComponent, } return virtualGuestTemplate, nil }
func (c SoftLayerCreator) Create(agentID string, stemcell bslcstem.Stemcell, cloudProps VMCloudProperties, networks Networks, env Environment) (VM, error) { virtualGuestTemplate := sldatatypes.SoftLayer_Virtual_Guest_Template{ Hostname: agentID, Domain: cloudProps.Domain, StartCpus: cloudProps.StartCpus, MaxMemory: cloudProps.MaxMemory, Datacenter: sldatatypes.Datacenter{ Name: cloudProps.Datacenter.Name, }, BlockDeviceTemplateGroup: &sldatatypes.BlockDeviceTemplateGroup{ GlobalIdentifier: stemcell.Uuid(), }, SshKeys: cloudProps.SshKeys, HourlyBillingFlag: true, // Needed for ephemeral disk LocalDiskFlag: true, } virtualGuestService, err := c.softLayerClient.GetSoftLayer_Virtual_Guest_Service() if err != nil { return SoftLayerVM{}, bosherr.WrapError(err, "Creating VirtualGuestService from SoftLayer client") } virtualGuest, err := virtualGuestService.CreateObject(virtualGuestTemplate) if err != nil { return SoftLayerVM{}, bosherr.WrapError(err, "Creating VirtualGuest from SoftLayer client") } //TODO: need to find or ensure the name for the ephemeral disk for SoftLayer VG disks := DisksSpec{Ephemeral: "/dev/xvdc"} agentEnv := NewAgentEnvForVM(agentID, strconv.Itoa(virtualGuest.Id), networks, disks, env, c.agentOptions) metadata, err := json.Marshal(agentEnv) if err != nil { return SoftLayerVM{}, bosherr.WrapError(err, "Marshalling agent environment metadata") } err = bslcommon.ConfigureMetadataOnVirtualGuest(c.softLayerClient, virtualGuest.Id, string(metadata), bslcommon.TIMEOUT, bslcommon.POLLING_INTERVAL) if err != nil { return SoftLayerVM{}, bosherr.WrapError(err, fmt.Sprintf("Configuring metadata on VirtualGuest `%d`", virtualGuest.Id)) } err = bslcommon.AttachEphemeralDiskToVirtualGuest(c.softLayerClient, virtualGuest.Id, cloudProps.EphemeralDiskSize, bslcommon.TIMEOUT, bslcommon.POLLING_INTERVAL) if err != nil { return SoftLayerVM{}, bosherr.WrapError(err, fmt.Sprintf("Attaching ephemeral disk to VirtualGuest `%d`", virtualGuest.Id)) } agentEnvService := c.agentEnvServiceFactory.New(virtualGuest.Id) vm := NewSoftLayerVM(virtualGuest.Id, c.softLayerClient, util.GetSshClient(), agentEnvService, c.logger) return vm, nil }
func (c SoftLayerCreator) CreateNewVM(agentID string, stemcell bslcstem.Stemcell, cloudProps VMCloudProperties, networks Networks, env Environment) (VM, error) { virtualGuestTemplate, err := CreateVirtualGuestTemplate(stemcell, cloudProps) if err != nil { return SoftLayerVM{}, bosherr.WrapError(err, "Creating virtual guest template") } virtualGuestService, err := c.softLayerClient.GetSoftLayer_Virtual_Guest_Service() if err != nil { return SoftLayerVM{}, bosherr.WrapError(err, "Creating VirtualGuestService from SoftLayer client") } virtualGuest, err := virtualGuestService.CreateObject(virtualGuestTemplate) if err != nil { return SoftLayerVM{}, bosherr.WrapError(err, "Creating VirtualGuest from SoftLayer client") } if cloudProps.EphemeralDiskSize == 0 { err = bslcommon.WaitForVirtualGuestLastCompleteTransaction(c.softLayerClient, virtualGuest.Id, "Service Setup") if err != nil { return SoftLayerVM{}, bosherr.WrapErrorf(err, "Waiting for VirtualGuest `%d` has Service Setup transaction complete", virtualGuest.Id) } } else { err = bslcommon.AttachEphemeralDiskToVirtualGuest(c.softLayerClient, virtualGuest.Id, cloudProps.EphemeralDiskSize, c.logger) if err != nil { return SoftLayerVM{}, bosherr.WrapError(err, fmt.Sprintf("Attaching ephemeral disk to VirtualGuest `%d`", virtualGuest.Id)) } } virtualGuest, err = bslcommon.GetObjectDetailsOnVirtualGuest(c.softLayerClient, virtualGuest.Id) if err != nil { return SoftLayerVM{}, bosherr.WrapErrorf(err, "Cannot get details from virtual guest with id: %d.", virtualGuest.Id) } softlayerFileService := NewSoftlayerFileService(util.GetSshClient(), virtualGuest, c.logger, c.uuidGenerator, c.fs) agentEnvService := c.agentEnvServiceFactory.New(softlayerFileService, strconv.Itoa(virtualGuest.Id)) if len(cloudProps.BoshIp) == 0 { // update /etc/hosts file of bosh-init vm c.updateEtcHostsOfBoshInit(fmt.Sprintf("%s %s", virtualGuest.PrimaryBackendIpAddress, virtualGuest.FullyQualifiedDomainName)) // Update mbus url setting for bosh director: construct mbus url with new director ip mbus, err := c.parseMbusURL(c.agentOptions.Mbus, virtualGuest.PrimaryBackendIpAddress) if err != nil { return SoftLayerVM{}, bosherr.WrapErrorf(err, "Cannot construct mbus url.") } c.agentOptions.Mbus = mbus } else { // Update mbus url setting mbus, err := c.parseMbusURL(c.agentOptions.Mbus, cloudProps.BoshIp) if err != nil { return SoftLayerVM{}, bosherr.WrapErrorf(err, "Cannot construct mbus url.") } c.agentOptions.Mbus = mbus // Update blobstore setting switch c.agentOptions.Blobstore.Type { case BlobstoreTypeDav: davConf := DavConfig(c.agentOptions.Blobstore.Options) c.updateDavConfig(&davConf, cloudProps.BoshIp) } } agentEnv := CreateAgentUserData(agentID, cloudProps, networks, env, c.agentOptions) if err != nil { return SoftLayerVM{}, bosherr.WrapErrorf(err, "Cannot agent env for virtual guest with id: %d.", virtualGuest.Id) } err = agentEnvService.Update(agentEnv) if err != nil { return SoftLayerVM{}, bosherr.WrapError(err, "Updating VM's agent env") } vm := NewSoftLayerVM(virtualGuest.Id, c.softLayerClient, util.GetSshClient(), agentEnvService, c.logger) if strings.ToUpper(common.GetOSEnvVariable("OS_RELOAD_ENABLED", "TRUE")) == "TRUE" && !strings.Contains(cloudProps.VmNamePrefix, "-worker") { db, err := bslcvmpool.OpenDB(bslcvmpool.SQLITE_DB_FILE_PATH) if err != nil { return SoftLayerVM{}, bosherr.WrapError(err, "Opening DB") } vmInfoDB := bslcvmpool.NewVMInfoDB(vm.ID(), virtualGuestTemplate.Hostname+"."+virtualGuestTemplate.Domain, "t", stemcell.Uuid(), agentID, c.logger, db) err = vmInfoDB.InsertVMInfo(bslcvmpool.DB_RETRY_TIMEOUT, bslcvmpool.DB_RETRY_INTERVAL) if err != nil { return SoftLayerVM{}, bosherr.WrapError(err, "Failed to insert the record into VM pool DB") } } return vm, nil }