func (vm SoftLayerVM) Delete(agentID string) error { if strings.ToUpper(common.GetOSEnvVariable("OS_RELOAD_ENABLED", "TRUE")) == "FALSE" { return vm.DeleteVM() } err := bslcvmpool.InitVMPoolDB(bslcvmpool.DB_RETRY_TIMEOUT, bslcvmpool.DB_RETRY_INTERVAL, vm.logger) if err != nil { return bosherr.WrapError(err, "Failed to initialize VM pool DB") } db, err := bslcvmpool.OpenDB(bslcvmpool.SQLITE_DB_FILE_PATH) if err != nil { return bosherr.WrapError(err, "Opening DB") } vmInfoDB := bslcvmpool.NewVMInfoDB(vm.id, "", "t", "", "", vm.logger, db) defer vmInfoDB.CloseDB() err = vmInfoDB.QueryVMInfobyID(bslcvmpool.DB_RETRY_TIMEOUT, bslcvmpool.DB_RETRY_INTERVAL) if err != nil { return bosherr.WrapError(err, fmt.Sprintf("Failed to query VM info by given ID %d", vm.id)) } vm.logger.Info(SOFTLAYER_VM_LOG_TAG, fmt.Sprintf("vmInfoDB.vmProperties.id is %d", vmInfoDB.VmProperties.Id)) if vmInfoDB.VmProperties.Id != 0 { if agentID != "" { vm.logger.Info(SOFTLAYER_VM_LOG_TAG, fmt.Sprintf("Release the VM with id %d back to the VM pool", vmInfoDB.VmProperties.Id)) vmInfoDB.VmProperties.InUse = "f" err = vmInfoDB.UpdateVMInfoByID(bslcvmpool.DB_RETRY_TIMEOUT, bslcvmpool.DB_RETRY_INTERVAL) if err != nil { return bosherr.WrapError(err, fmt.Sprintf("Failed to query VM info by given ID %d", vm.id)) } else { return nil } } else { return vm.DeleteVM() } } return nil }
func (c SoftLayerCreator) Create(agentID string, stemcell bslcstem.Stemcell, cloudProps VMCloudProperties, networks Networks, env Environment) (VM, error) { if strings.ToUpper(common.GetOSEnvVariable("OS_RELOAD_ENABLED", "TRUE")) == "FALSE" { return c.CreateNewVM(agentID, stemcell, cloudProps, networks, env) } err := bslcvmpool.InitVMPoolDB(bslcvmpool.DB_RETRY_TIMEOUT, bslcvmpool.DB_RETRY_INTERVAL, c.logger) if err != nil { return SoftLayerVM{}, bosherr.WrapError(err, "Failed to initialize VM pool DB") } if strings.Contains(cloudProps.VmNamePrefix, "-worker") { vm, err := c.CreateNewVM(agentID, stemcell, cloudProps, networks, env) return vm, err } db, err := bslcvmpool.OpenDB(bslcvmpool.SQLITE_DB_FILE_PATH) if err != nil { return SoftLayerVM{}, bosherr.WrapError(err, "Opening DB") } vmInfoDB := bslcvmpool.NewVMInfoDB(0, "", "f", "", agentID, c.logger, db) defer vmInfoDB.CloseDB() err = vmInfoDB.QueryVMInfobyAgentID(bslcvmpool.DB_RETRY_TIMEOUT, bslcvmpool.DB_RETRY_INTERVAL) if err != nil { return SoftLayerVM{}, bosherr.WrapError(err, "Failed to query VM info by given agent ID "+agentID) } if vmInfoDB.VmProperties.Id != 0 { c.logger.Info(SOFTLAYER_VM_CREATOR_LOG_TAG, fmt.Sprintf("OS reload on the server id %d with stemcell %d", vmInfoDB.VmProperties.Id, stemcell.ID())) vm := NewSoftLayerVM(vmInfoDB.VmProperties.Id, c.softLayerClient, util.GetSshClient(), nil, c.logger) bslcommon.TIMEOUT = 24 * time.Hour err = vm.ReloadOS(stemcell) if err != nil { return SoftLayerVM{}, bosherr.WrapError(err, "Failed to reload OS") } err = bslcommon.WaitForVirtualGuestLastCompleteTransaction(c.softLayerClient, vm.ID(), "Service Setup") if err != nil { return SoftLayerVM{}, bosherr.WrapErrorf(err, "Waiting for VirtualGuest `%d` has Service Setup transaction complete", vm.ID()) } virtualGuest, err := bslcommon.GetObjectDetailsOnVirtualGuest(c.softLayerClient, vmInfoDB.VmProperties.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) c.logger.Info(SOFTLAYER_VM_CREATOR_LOG_TAG, fmt.Sprintf("Updated in_use flag to 't' for the VM %d in VM pool", vmInfoDB.VmProperties.Id)) vmInfoDB.VmProperties.InUse = "t" err = vmInfoDB.UpdateVMInfoByID(bslcvmpool.DB_RETRY_TIMEOUT, bslcvmpool.DB_RETRY_INTERVAL) if err != nil { return vm, bosherr.WrapError(err, fmt.Sprintf("Failed to query VM info by given ID %d", vm.ID())) } else { return vm, nil } } vmInfoDB.VmProperties.InUse = "" err = vmInfoDB.QueryVMInfobyAgentID(bslcvmpool.DB_RETRY_TIMEOUT, bslcvmpool.DB_RETRY_INTERVAL) if err != nil { return SoftLayerVM{}, bosherr.WrapError(err, "Failed to query VM info by given agent ID "+agentID) } if vmInfoDB.VmProperties.Id != 0 { return SoftLayerVM{}, bosherr.WrapError(err, "Wrong in_use status in VM with agent ID "+agentID+", Do not create a new VM") } else { return c.CreateNewVM(agentID, stemcell, cloudProps, networks, env) } }
var ( err error ) BeforeEach(func() { common.SetOSEnvVariable("OS_RELOAD_ENABLED", "TRUE") common.SetOSEnvVariable("SQLITE_DB_FOLDER", SQLITE_DB_FOLDER) common.SetOSEnvVariable("SQLITE_DB_FILE", SQLITE_DB_FILE) testhelpers.TIMEOUT = 35 * time.Minute testhelpers.POLLING_INTERVAL = 10 * time.Second err = os.RemoveAll(SQLITE_DB_FOLDER) Expect(err).ToNot(HaveOccurred()) err = bslcvmpool.InitVMPoolDB(bslcvmpool.DB_RETRY_TIMEOUT, bslcvmpool.DB_RETRY_INTERVAL, logger) Expect(err).ToNot(HaveOccurred()) populateDB() }) AfterEach(func() { err = os.RemoveAll(SQLITE_DB_FOLDER) Expect(err).ToNot(HaveOccurred()) }) Context("Manipulate DB concurrently", func() { It("Manipulate DB concurrently", func(done Done) {