Skip to content

Commit

Permalink
Merge pull request #151 from HewlettPackard/API800/Logical_Enclosure
Browse files Browse the repository at this point in the history
Api800/logical enclosure
  • Loading branch information
Sowmyahsg authored Feb 7, 2019
2 parents 42747e5 + 0c0fc24 commit d41fe7a
Show file tree
Hide file tree
Showing 3 changed files with 370 additions and 0 deletions.
6 changes: 6 additions & 0 deletions endpoints-support.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,12 @@
| **Interconnect Types** |
|<sub>/rest/interconnect-types</sub> | GET | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
|<sub>/rest/interconnect-types/{id}</sub> | GET | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| **Logical Enclosures** |
|<sub>/rest/logical-enclosures</sub> | GET | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
|<sub>/rest/logical-enclosures</sub> | POST | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
|<sub>/rest/logical-enclosures/{id}</sub> | GET | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
|<sub>/rest/logical-enclosures/{id}</sub> | PUT | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
|<sub>/rest/logical-enclosures/{id}</sub> | DELETE | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| **Logical Interconnect Groups** |
|<sub>/rest/logical-interconnect-groups</sub> | GET | :white_check_mark: | :white_check_mark: | :heavy_multiplication_x: | :heavy_multiplication_x: | :white_check_mark: |
|<sub>/rest/logical-interconnect-groups</sub> | POST | :white_check_mark: | :white_check_mark: | :heavy_multiplication_x: | :heavy_multiplication_x: | :white_check_mark: |
Expand Down
92 changes: 92 additions & 0 deletions examples/logical_enclosure.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package main

import (
"fmt"
"github.com/HewlettPackard/oneview-golang/ov"
"github.com/HewlettPackard/oneview-golang/utils"
"os"
)

func main() {
var (
ClientOV *ov.OVClient
logical_enclosure = "log_enc_66"
logical_enclosure_1 = "log_enclosure77"
logical_enclosure_2 = "log_enclosure88"
logical_enclosure_3 = "log_enclosure88"
scope_name = "new-SD5"
)
ovc := ClientOV.NewOVClient(
os.Getenv("ONEVIEW_OV_USER"),
os.Getenv("ONEVIEW_OV_PASSWORD"),
os.Getenv("ONEVIEW_OV_DOMAIN"),
os.Getenv("ONEVIEW_OV_ENDPOINT"),
false,
800,
"")

fmt.Println("#................... Logical Enclosure by Name ...............#")
log_en, err := ovc.GetLogicalEnclosureByName(logical_enclosure)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(log_en)
}

scope1, err := ovc.GetScopeByName(scope_name)
scope_uri := scope1.URI
scope_Uris := new([]string)
*scope_Uris = append(*scope_Uris, scope_uri.String())

sort := "name:desc"
log_en_list, err := ovc.GetLogicalEnclosures("", "", "", *scope_Uris, sort)
if err != nil {
fmt.Println(err)
} else {
fmt.Println("# ................... Logical Enclosures List .................#")
for i := 0; i < len(log_en_list.Members); i++ {
fmt.Println(log_en_list.Members[i].Name)
}
}

enclosureUris := new([]utils.Nstring)
*enclosureUris = append(*enclosureUris, utils.NewNstring("/rest/enclosures/0000000000A66101"))
*enclosureUris = append(*enclosureUris, utils.NewNstring("/rest/enclosures/0000000000A66102"))
*enclosureUris = append(*enclosureUris, utils.NewNstring("/rest/enclosures/0000000000A66103"))

logicalEnclosure := ov.LogicalEnclosure{Name: "log_enclosure77",
EnclosureUris: *enclosureUris,
EnclosureGroupUri: utils.NewNstring("/rest/enclosure-groups/e48e8024-5e35-48ea-9bb9-0e4b3c69fb91")}

er := ovc.CreateLogicalEnclosure(logicalEnclosure)
if er != nil {
fmt.Println("............... Logical Enclosure Creation Failed:", err)
} else {
fmt.Println(".... Logical Enclosure Created Success")
}

log_enc, _ := ovc.GetLogicalEnclosureByName(logical_enclosure_1)
log_enc.Name = logical_enclosure_2
err = ovc.UpdateLogicalEnclosure(log_enc)
if err != nil {
fmt.Println(err)
} else {
fmt.Println("#.................... Logical Enclosure after Updating ...........#")
log_en_after_update, err := ovc.GetLogicalEnclosures("", "", "", *scope_Uris, sort)
if err != nil {
fmt.Println(err)
} else {
for i := 0; i < len(log_en_after_update.Members); i++ {
fmt.Println(log_en_after_update.Members[i].Name)
}
}
}

err = ovc.DeleteLogicalEnclosure(logical_enclosure_3)
if err != nil {
fmt.Println(err)
} else {
fmt.Println("#...................... Deleted Logical Enclosure Successfully .....#")
}

}
272 changes: 272 additions & 0 deletions ov/logical_enclosure.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,272 @@
package ov

import (
"encoding/json"
"fmt"
"github.com/HewlettPackard/oneview-golang/rest"
"github.com/HewlettPackard/oneview-golang/utils"
"github.com/docker/machine/libmachine/log"
)

type LogicalEnclosure struct {
AmbientTemperatureMode string `json:"ambientTemperatureMode,omitempty"` // "ambientTemperatureMode": "Standard",
Category string `json:"category,omitempty"` // "category": "logical-enclosures",
Created string `json:"created,omitempty"` // "created": "20150831T154835.250Z",
DeleteFailed bool `json:"deleteFailed,omitempty"` // "deleteFailed": true,
DeploymentManagerSettings *DeploymentManagerSettings `json:"deploymentManagerSettings,omitempty"` // "deploymentManagerSettings": "",
Description utils.Nstring `json:"description,omitempty"` // "description": "Logical Enclosure 1",
Etag string `json:"eTag,omitempty"` // "eTag": "1441036118675/8",
EnclosureGroupUri utils.Nstring `json:"enclosureGroupUri,omitempty"` // "enclosureGroupUri": "/rest/enclosure-groups/9b8f7ec0-52b3-475e-84f4-c4eac51c2c20",
EnclosureUris []utils.Nstring `json:"enclosureUris,omitempty"` // "enclosureUris":""
Enclosures map[string]Enclosures `json:"enclosures,omitempty"` // "enclosures":"[]",
Firmware *LogicalEnclosureFirmware `json:"firmware,omitempty"` // "firmware":"",
IpAddressingMode string `json:"ipAddressingMode,omitempty"` // "ipAddressingMode":"DHCP",
Ipv4Ranges []Ipv4Ranges `json:"ipv4Ranges,omitempty"` //"ipv4Ranges":"[]"
LogicalInterconnectUris []utils.Nstring `json:"logicalInterconnectUris,omitempty"` //"logicalInterconnectUris":"[]",
Modified string `json:"modified,omitempty"` // "modified": "20150831T154835.25Z",
Name string `json:"name,omitempty"` // "name": "Ethernet Network 1",
PowerMode string `json:"powerMode,omitempty"` // "powerMode": "RedundantPowerFeed",
ScalingState string `json:"scalingState,omitempty"` // "scalingState": "Growing",
ScopesUri utils.Nstring `json:"scopesUri,omitempty"` // "scopesUri":
State string `json:"state,omitempty"` // "state": "Creating",
Status string `json:"status,omitempty"` // "status": "Critical",
Type string `json:"type,omitempty"` // "type": "LogicalEnclosureV4",
URI utils.Nstring `json:"uri,omitempty"` // "uri": "/rest/logical-enclosures/e2f0031b-52bd-4223-9ac1-d91cb519d548"

}

type LogicalEnclosureList struct {
Total int `json:"total,omitempty"` // "total": 1,
Count int `json:"count,omitempty"` // "count": 1,
Start int `json:"start,omitempty"` // "start": 0,
PrevPageURI utils.Nstring `json:"prevPageUri,omitempty"` // "prevPageUri": null,
NextPageURI utils.Nstring `json:"nextPageUri,omitempty"` // "nextPageUri": null,
URI utils.Nstring `json:"uri,omitempty"` // "uri": "/rest/ethernet-networks?filter=connectionTemplateUri%20matches%7769cae0-b680-435b-9b87-9b864c81657fsort=name:asc"
Members []LogicalEnclosure `json:"members,omitempty"` // "members":[]
}

type DeploymentModeSettings struct {
DeploymentMode string `json:"deploymentMode,omitempty"` //"deploymentMode":"None"
DeploymentNetworkUri utils.Nstring `json:"deploymentNetworkUri,omitempty"` //"deploymentNetworkUri":"/rest/ethernet-networks/e2f0031b-52bd-4223-9ac1-d91cb519d548"
}

type LeOsDeploymentSettings struct {
DeploymentModeSettings *DeploymentModeSettings `json:"deploymentModeSettings,omitempty"`
ManageOSDeployment bool `json:"manageOSDeployment,omitempty"`
}

type DeploymentManagerSettings struct {
DeploymentClusterUri utils.Nstring `json:"deploymentClusterUri,omitempty"` //"deploymentClusterUri":""
OsDeploymentSettings *LeOsDeploymentSettings `json:"osDeploymentSettings,omitempty"` //"OsdeploymentSettings":""
}

type Enclosures struct {
EnclosureUri utils.Nstring `json:"enclosureUri,omitempty"` //"enclosureUri":"",
InterconnectBays []InterconnectBays `json:"interconnectBays,omitempty"` //"interconnectBays":"[]",
}

type InterconnectBays struct {
BayNumber int `json:"bayNumber,omitempty"` //"bayNumber":"3",
LicenseIntents *LicenseIntents `json:"licenseIntents,omitempty"` //"licenseIntent":"",
}

type LicenseIntents struct {
FCUpgrade string `json:"FCUpgrade,omitempty"` //"FCUpgrade":"Automatic",
}

type Ipv4Ranges struct {
DnsServers []string `json:"dnsServers,omitempty"` //"dnsServers":"",
Domain string `json:"domain,omitempty"` //"domain":"",
Gateway string `json:"gateway,omitempty"` //"gateway":"",
IpRangeUri utils.Nstring `json:"ipRangeUri,omitempty"` //"ipRangeUri":"",
Name string `json:"name,omitempty"` //"name":"",
SubnetMask string `json:"subnetMask,omitempty"` //"subnetMask":""
}

type LogicalEnclosureFirmware struct {
FirmwareBaselineUri utils.Nstring `json:"firmwareBaselineUri,omitempty"` //"firmwareBaselineUri":"",
FirmwareUpdateOn string `json:"firmwareUpdateOn,omitempty"` //"firmwareUpdateOn":"EnclosureOnly",
ForceInstallFirmware bool `json:"forceInstallFirmware,omitempty"` //"forceInstallFirmware":true,
LogicalInterconnectUpdateMode string `json:"logicalInterconnectUpdateMode,omitempty"` //"logicalInterconnectUpdateMode":"Parallel",
UpdateFirmwareOnUnmanagedInterconnect bool `json:"updateFirmwareOnUnmanagedInterconnect,omitempty"` //"updateFirmwareOnUnmanagedInterconnect":true,
ValidateIfLIFirmwareUpdateIsNonDisruptive bool `json:"validateIfLIFirmwareUpdateIsNonDisruptive,omitempty"` //"validateIfLIFirmwareUpdateIsNonDisruptive":false,
}

func (c *OVClient) GetLogicalEnclosureByName(name string) (LogicalEnclosure, error) {
var (
logEn LogicalEnclosure
)
scopeUris := []string{}
logEns, err := c.GetLogicalEnclosures("", "", fmt.Sprintf("name matches '%s'", name), scopeUris, "name:asc")
if logEns.Total > 0 {
return logEns.Members[0], err
} else {
return logEn, err
}
}

func (c *OVClient) GetLogicalEnclosures(start string, count string, filter string, scopeUris []string, sort string) (LogicalEnclosureList, error) {
var (
uri = "/rest/logical-enclosures"
q map[string]interface{}
logicalEnclosures LogicalEnclosureList
)
q = make(map[string]interface{})
if len(filter) > 0 {
q["filter"] = filter
}

if sort != "" {
q["sort"] = sort
}

if start != "" {
q["start"] = start
}

if count != "" {
q["count"] = count
}

if len(scopeUris) != 0 {
q["scopeUris"] = scopeUris
}

// refresh login
c.RefreshLogin()
c.SetAuthHeaderOptions(c.GetAuthHeaderMap())
// Setup query
if len(q) > 0 {
c.SetQueryString(q)
}

data, err := c.RestAPICall(rest.GET, uri, nil)
if err != nil {
return logicalEnclosures, err
}

log.Debugf("GetLogicalEnclosures %s", data)
if err := json.Unmarshal([]byte(data), &logicalEnclosures); err != nil {
return logicalEnclosures, err
}
return logicalEnclosures, nil
}

func (c *OVClient) CreateLogicalEnclosure(logEn LogicalEnclosure) error {
log.Infof("Initializing creation of logical enclosure for %s.", logEn.Name)
var (
uri = "/rest/logical-enclosures"
t *Task
)
// refresh login
c.RefreshLogin()
c.SetAuthHeaderOptions(c.GetAuthHeaderMap())

t = t.NewProfileTask(c)
t.ResetTask()
log.Debugf("REST : %s \n %+v\n", uri, logEn)
log.Debugf("task -> %+v", t)
data, err := c.RestAPICall(rest.POST, uri, logEn)
if err != nil {
t.TaskIsDone = true
log.Errorf("Error submitting new logical Enclosure request: %s", err)
return err
}

log.Debugf("Response New LogicalEnclosure %s", data)
if err := json.Unmarshal([]byte(data), &t); err != nil {
t.TaskIsDone = true
log.Errorf("Error with task un-marshal: %s", err)
return err
}

err = t.Wait()
if err != nil {
return err
}

return nil
}

func (c *OVClient) DeleteLogicalEnclosure(name string) error {
var (
logEn LogicalEnclosure
err error
t *Task
uri string
)

logEn, err = c.GetLogicalEnclosureByName(name)
if err != nil {
return err
}
if logEn.Name != "" {
t = t.NewProfileTask(c)
t.ResetTask()
log.Debugf("REST : %s \n %+v\n", logEn.URI, logEn)
log.Debugf("task -> %+v", t)
uri = logEn.URI.String()
if uri == "" {
log.Warn("Unable to post delete, no uri found.")
t.TaskIsDone = true
return err
}
data, err := c.RestAPICall(rest.DELETE, uri, nil)
if err != nil {
log.Errorf("Error submitting delete logical Enclosure request: %s", err)
t.TaskIsDone = true
return err
}

log.Debugf("Response delete Logical Enclosure %s", data)
if err := json.Unmarshal([]byte(data), &t); err != nil {
t.TaskIsDone = true
log.Errorf("Error with task un-marshal: %s", err)
return err
}
err = t.Wait()
if err != nil {
return err
}
return nil
} else {
log.Infof("LogicalEnclosure could not be found to delete, %s, skipping delete ...", name)
}
return nil
}

func (c *OVClient) UpdateLogicalEnclosure(logEn LogicalEnclosure) error {
log.Infof("Initializing update of logical enclosure for %s.", logEn.Name)
var (
uri = logEn.URI.String()
t *Task
)
// refresh login
c.RefreshLogin()
c.SetAuthHeaderOptions(c.GetAuthHeaderMap())

t = t.NewProfileTask(c)
t.ResetTask()
log.Debugf("REST : %s \n %+v\n", uri, logEn)
log.Debugf("task -> %+v", t)
data, err := c.RestAPICall(rest.PUT, uri, logEn)
if err != nil {
t.TaskIsDone = true
log.Errorf("Error submitting update logical enclosure request: %s", err)
return err
}

log.Debugf("Response update LogicalEnclosure %s", data)
if err := json.Unmarshal([]byte(data), &t); err != nil {
t.TaskIsDone = true
log.Errorf("Error with task un-marshal: %s", err)
return err
}

err = t.Wait()
if err != nil {
return err
}

return nil
}

0 comments on commit d41fe7a

Please sign in to comment.