diff --git a/driver/driver.go b/driver/driver.go index 82cf21c..9b128b7 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -23,7 +23,7 @@ const g5kReferenceEnvironmentName string = "debian10-x64-std" type Driver struct { *drivers.BaseDriver - G5kAPI *api.Client + // Persistent fields G5kJobID int G5kUsername string G5kPassword string @@ -38,6 +38,9 @@ type Driver struct { ExternalSSHPublicKeys []string G5kKeepAllocatedResourceAtDeletion bool G5kNodeHostname string + + // Ephemeral fields + g5kAPI *api.Client } // NewDriver creates and returns a new instance of the driver @@ -203,7 +206,9 @@ func (d *Driver) SetConfigFromFlags(opts drivers.DriverOptions) error { func (d *Driver) GetIP() (string, error) { if d.IPAddress == "" { if d.G5kNodeHostname == "" { - job, err := d.G5kAPI.GetJob(d.G5kJobID) + d.g5kAPI = api.NewClient(d.G5kUsername, d.G5kPassword, d.G5kSite) + + job, err := d.g5kAPI.GetJob(d.G5kJobID) if err != nil { return "", err } @@ -267,7 +272,9 @@ func (d *Driver) GetURL() (string, error) { // GetState returns the state that the host is in (running, stopped, etc) func (d *Driver) GetState() (state.State, error) { - job, err := d.G5kAPI.GetJob(d.G5kJobID) + d.g5kAPI = api.NewClient(d.G5kUsername, d.G5kPassword, d.G5kSite) + + job, err := d.g5kAPI.GetJob(d.G5kJobID) if err != nil { return state.None, err } @@ -320,10 +327,8 @@ func (d *Driver) PreCreateCheck() error { return err } - // create API client - d.G5kAPI = api.NewClient(d.G5kUsername, d.G5kPassword, d.G5kSite) + d.g5kAPI = api.NewClient(d.G5kUsername, d.G5kPassword, d.G5kSite) - // load driver SSH public key if err := d.loadDriverSSHPublicKey(); err != nil { return err } @@ -359,6 +364,8 @@ func (d *Driver) PreCreateCheck() error { // Create wait for the job to be running, deploy the OS image and copy the ssh keys func (d *Driver) Create() error { + d.g5kAPI = api.NewClient(d.G5kUsername, d.G5kPassword, d.G5kSite) + // wait for job to be in 'running' state if err := d.waitUntilJobIsReady(); err != nil { return err @@ -381,10 +388,12 @@ func (d *Driver) Create() error { // Remove delete the resources reservation func (d *Driver) Remove() error { + d.g5kAPI = api.NewClient(d.G5kUsername, d.G5kPassword, d.G5kSite) + // keep the resource allocated if the user asked for it if !d.G5kKeepAllocatedResourceAtDeletion { log.Infof("Deallocating resource... (Job ID: '%d')", d.G5kJobID) - return d.G5kAPI.KillJob(d.G5kJobID) + return d.g5kAPI.KillJob(d.G5kJobID) } return nil @@ -392,20 +401,28 @@ func (d *Driver) Remove() error { // Kill perform a hard power-off on the node func (d *Driver) Kill() error { + d.g5kAPI = api.NewClient(d.G5kUsername, d.G5kPassword, d.G5kSite) + return d.changeNodePowerStatus("off", "hard") } // Start perform a soft power-on on the node func (d *Driver) Start() error { + d.g5kAPI = api.NewClient(d.G5kUsername, d.G5kPassword, d.G5kSite) + return d.changeNodePowerStatus("on", "soft") } // Stop perform a soft power-off on the node func (d *Driver) Stop() error { + d.g5kAPI = api.NewClient(d.G5kUsername, d.G5kPassword, d.G5kSite) + return d.changeNodePowerStatus("off", "soft") } // Restart perform a soft reboot on the node func (d *Driver) Restart() error { + d.g5kAPI = api.NewClient(d.G5kUsername, d.G5kPassword, d.G5kSite) + return d.rebootNode("soft") } diff --git a/driver/g5k.go b/driver/g5k.go index 31efa47..0f6c751 100644 --- a/driver/g5k.go +++ b/driver/g5k.go @@ -25,7 +25,7 @@ func (d *Driver) waitUntilJobIsReady() error { log.Info("Waiting for job to run...") // refresh job state - for job, err := d.G5kAPI.GetJob(d.G5kJobID); job.State != "running"; job, err = d.G5kAPI.GetJob(d.G5kJobID) { + for job, err := d.g5kAPI.GetJob(d.G5kJobID); job.State != "running"; job, err = d.g5kAPI.GetJob(d.G5kJobID) { // check if GetJob returned an error if err != nil { return err @@ -66,7 +66,7 @@ func (d *Driver) makeJobSubmission() error { } // submit new Job request - jobID, err := d.G5kAPI.SubmitJob(api.JobRequest{ + jobID, err := d.g5kAPI.SubmitJob(api.JobRequest{ Resources: fmt.Sprintf("nodes=1,walltime=%s", d.G5kWalltime), Command: jobCommand, Properties: d.G5kResourceProperties, @@ -88,7 +88,7 @@ func (d *Driver) makeJobReservation() error { jobTypes := []string{"deploy"} // submit new Job request - jobID, err := d.G5kAPI.SubmitJob(api.JobRequest{ + jobID, err := d.g5kAPI.SubmitJob(api.JobRequest{ Resources: fmt.Sprintf("nodes=1,walltime=%s", d.G5kWalltime), Command: jobCommand, Properties: d.G5kResourceProperties, @@ -111,7 +111,7 @@ func (d *Driver) waitUntilWorkflowIsDone(operation string, wid string, node stri for { // get operation workflow - workflow, err := d.G5kAPI.GetOperationWorkflow(operation, wid) + workflow, err := d.g5kAPI.GetOperationWorkflow(operation, wid) if err != nil { return err } @@ -148,7 +148,7 @@ func (d *Driver) deployImageToNode() error { } // get job informations - job, err := d.G5kAPI.GetJob(d.G5kJobID) + job, err := d.g5kAPI.GetJob(d.G5kJobID) if err != nil { return fmt.Errorf("Error when getting job (id: '%d') informations: %s", d.G5kJobID, err.Error()) } @@ -175,7 +175,7 @@ func (d *Driver) deployImageToNode() error { sshAuthorizedKeysBase64 := base64.StdEncoding.EncodeToString([]byte(GenerateSSHAuthorizedKeys(d.DriverSSHPublicKey, d.ExternalSSHPublicKeys))) // submit deployment operation to kadeploy - op, err := d.G5kAPI.SubmitDeployment(api.DeploymentOperation{ + op, err := d.g5kAPI.SubmitDeployment(api.DeploymentOperation{ Nodes: []string{node}, Environment: api.DeploymentOperationEnvironment{ Kind: "database", @@ -217,7 +217,7 @@ func (d *Driver) getNodePowerState() (string, error) { return "", fmt.Errorf("Failed to get the node hostname: %s", err.Error()) } - op, err := d.G5kAPI.RequestPowerStatus(node) + op, err := d.g5kAPI.RequestPowerStatus(node) if err != nil { return "", fmt.Errorf("Failed to request power status: %s", err.Error()) } @@ -227,7 +227,7 @@ func (d *Driver) getNodePowerState() (string, error) { } // get nodes states for the workflow - states, err := d.G5kAPI.GetOperationStates("power", op.WID) + states, err := d.g5kAPI.GetOperationStates("power", op.WID) if err != nil { return "", err } @@ -259,7 +259,7 @@ func (d *Driver) changeNodePowerStatus(status string, level string) error { return fmt.Errorf("Failed to get the node hostname: %s", err.Error()) } - op, err := d.G5kAPI.SubmitPowerOperation(api.PowerOperation{ + op, err := d.g5kAPI.SubmitPowerOperation(api.PowerOperation{ Nodes: []string{node}, Status: status, Level: level, @@ -284,7 +284,7 @@ func (d *Driver) rebootNode(level string) error { return fmt.Errorf("Failed to get the node hostname: %s", err.Error()) } - op, err := d.G5kAPI.SubmitRebootOperation(api.RebootOperation{ + op, err := d.g5kAPI.SubmitRebootOperation(api.RebootOperation{ Kind: "simple", Nodes: []string{node}, Level: level,