Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,11 @@ type ErrDefault401 struct {
ErrUnexpectedResponseCode
}

// ErrDefault403 is the default error type returned on a 403 HTTP response code.
type ErrDefault403 struct {
ErrUnexpectedResponseCode
}

// ErrDefault404 is the default error type returned on a 404 HTTP response code.
type ErrDefault404 struct {
ErrUnexpectedResponseCode
Expand Down Expand Up @@ -108,6 +113,9 @@ func (e ErrDefault400) Error() string {
func (e ErrDefault401) Error() string {
return "Authentication failed"
}
func (e ErrDefault403) Error() string {
return "Action Forbidden"
}
func (e ErrDefault404) Error() string {
return "Resource not found"
}
Expand Down Expand Up @@ -141,6 +149,12 @@ type Err401er interface {
Error401(ErrUnexpectedResponseCode) error
}

// Err403er is the interface resource error types implement to override the error message
// from a 403 error.
type Err403er interface {
Error403(ErrUnexpectedResponseCode) error
}

// Err404er is the interface resource error types implement to override the error message
// from a 404 error.
type Err404er interface {
Expand Down
55 changes: 55 additions & 0 deletions openstack/cce/v3/clusters/doc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
Package Clusters enables management and retrieval of Clusters
CCE service.

Example to List Clusters

listOpts:=clusters.ListOpts{}
allClusters,err:=clusters.List(client,listOpts)
if err != nil {
panic(err)
}

for _, cluster := range allClusters {
fmt.Printf("%+v\n", cluster)
}

Example to Create a cluster

createOpts:=clusters.CreateOpts{Kind:"Cluster",
ApiVersion:"v3",
Metadata:clusters.CreateMetaData{Name:"test-cluster"},
Spec:clusters.Spec{Type: "VirtualMachine",
Flavor: "cce.s1.small",
Version:"v1.7.3-r10",
HostNetwork:clusters.HostNetworkSpec{VpcId:"3b9740a0-b44d-48f0-84ee-42eb166e54f7",
SubnetId:"3e8e5957-649f-477b-9e5b-f1f75b21c045",},
ContainerNetwork:clusters.ContainerNetworkSpec{Mode:"overlay_l2"},
},
}
cluster,err := clusters.Create(client,createOpts).Extract()
if err != nil {
panic(err)
}

Example to Update a cluster

updateOpts := clusters.UpdateOpts{Spec:clusters.UpdateSpec{Description:"test"}}

clusterID := "4e8e5957-649f-477b-9e5b-f1f75b21c03c"

cluster,err := clusters.Update(client,clusterID,updateOpts).Extract()
if err != nil {
panic(err)
}

Example to Delete a cluster

clusterID := "4e8e5957-649f-477b-9e5b-f1f75b21c03c"

err := clusters.Delete(client,clusterID).ExtractErr()
if err != nil {
panic(err)
}
*/
package clusters
192 changes: 192 additions & 0 deletions openstack/cce/v3/clusters/requests.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
package clusters

import (
"reflect"

"github.com/huaweicloud/golangsdk"
)

var RequestOpts golangsdk.RequestOpts = golangsdk.RequestOpts{
MoreHeaders: map[string]string{"Content-Type": "application/json"},
}

// ListOpts allows the filtering of list data using given parameters.
type ListOpts struct {
Name string `json:"name"`
ID string `json:"uuid"`
Type string `json:"type"`
VpcID string `json:"vpc"`
Phase string `json:"phase"`
}

// List returns collection of clusters.
func List(client *golangsdk.ServiceClient, opts ListOpts) ([]Clusters, error) {
var r ListResult
_, r.Err = client.Get(rootURL(client), &r.Body, &golangsdk.RequestOpts{
OkCodes: []int{200},
MoreHeaders: RequestOpts.MoreHeaders, JSONBody: nil,
})

allClusters, err := r.ExtractClusters()
if err != nil {
return nil, err
}

return FilterClusters(allClusters, opts), nil
}

func FilterClusters(clusters []Clusters, opts ListOpts) []Clusters {

var refinedClusters []Clusters
var matched bool
m := map[string]FilterStruct{}

if opts.Name != "" {
m["Name"] = FilterStruct{Value: opts.Name, Driller: []string{"Metadata"}}
}
if opts.ID != "" {
m["Id"] = FilterStruct{Value: opts.ID, Driller: []string{"Metadata"}}
}
if opts.Type != "" {
m["Type"] = FilterStruct{Value: opts.Type, Driller: []string{"Spec"}}
}
if opts.VpcID != "" {
m["VpcId"] = FilterStruct{Value: opts.VpcID, Driller: []string{"Spec", "HostNetwork"}}
}
if opts.Phase != "" {
m["Phase"] = FilterStruct{Value: opts.Phase, Driller: []string{"Status"}}
}

if len(m) > 0 && len(clusters) > 0 {
for _, cluster := range clusters {
matched = true

for key, value := range m {
if sVal := GetStructNestedField(&cluster, key, value.Driller); !(sVal == value.Value) {
matched = false
}
}
if matched {
refinedClusters = append(refinedClusters, cluster)
}
}

} else {
refinedClusters = clusters
}

return refinedClusters
}

type FilterStruct struct {
Value string
Driller []string
}

func GetStructNestedField(v *Clusters, field string, structDriller []string) string {
r := reflect.ValueOf(v)
for _, drillField := range structDriller {
f := reflect.Indirect(r).FieldByName(drillField).Interface()
r = reflect.ValueOf(f)
}
f1 := reflect.Indirect(r).FieldByName(field)
return string(f1.String())
}

// CreateOptsBuilder allows extensions to add additional parameters to the
// Create request.
type CreateOptsBuilder interface {
ToClusterCreateMap() (map[string]interface{}, error)
}

// CreateOpts contains all the values needed to create a new cluster
type CreateOpts struct {
// API type, fixed value Cluster
Kind string `json:"kind" required:"true"`
// API version, fixed value v3
ApiVersion string `json:"apiversion" required:"true"`
// Metadata required to create a cluster
Metadata CreateMetaData `json:"metadata" required:"true"`
// specifications to create a cluster
Spec Spec `json:"spec" required:"true"`
}

// Metadata required to create a cluster
type CreateMetaData struct {
// Cluster unique name
Name string `json:"name" required:"true"`
// Cluster tag, key/value pair format
Labels map[string]string `json:"labels,omitempty"`
// Cluster annotation, key/value pair format
Annotations map[string]string `json:"annotations,omitempty"`
}

// ToClusterCreateMap builds a create request body from CreateOpts.
func (opts CreateOpts) ToClusterCreateMap() (map[string]interface{}, error) {
return golangsdk.BuildRequestBody(opts, "")
}

// Create accepts a CreateOpts struct and uses the values to create a new
// logical cluster.
func Create(c *golangsdk.ServiceClient, opts CreateOptsBuilder) (r CreateResult) {
b, err := opts.ToClusterCreateMap()
if err != nil {
r.Err = err
return
}
reqOpt := &golangsdk.RequestOpts{OkCodes: []int{201}}
_, r.Err = c.Post(rootURL(c), b, &r.Body, reqOpt)
return
}

// Get retrieves a particular cluster based on its unique ID.
func Get(c *golangsdk.ServiceClient, id string) (r GetResult) {
_, r.Err = c.Get(resourceURL(c, id), &r.Body, &golangsdk.RequestOpts{
OkCodes: []int{200},
MoreHeaders: RequestOpts.MoreHeaders, JSONBody: nil,
})
return
}

// UpdateOpts contains all the values needed to update a new cluster
type UpdateOpts struct {
Spec UpdateSpec `json:"spec" required:"true"`
}

type UpdateSpec struct {
// Cluster description
Description string `json:"description,omitempty"`
}

// UpdateOptsBuilder allows extensions to add additional parameters to the
// Update request.
type UpdateOptsBuilder interface {
ToClusterUpdateMap() (map[string]interface{}, error)
}

// ToClusterUpdateMap builds an update body based on UpdateOpts.
func (opts UpdateOpts) ToClusterUpdateMap() (map[string]interface{}, error) {
return golangsdk.BuildRequestBody(opts, "")
}

// Update allows clusters to update description.
func Update(c *golangsdk.ServiceClient, id string, opts UpdateOptsBuilder) (r UpdateResult) {
b, err := opts.ToClusterUpdateMap()
if err != nil {
r.Err = err
return
}
_, r.Err = c.Put(resourceURL(c, id), b, &r.Body, &golangsdk.RequestOpts{
OkCodes: []int{200},
})
return
}

// Delete will permanently delete a particular cluster based on its unique ID.
func Delete(c *golangsdk.ServiceClient, id string) (r DeleteResult) {
_, r.Err = c.Delete(resourceURL(c, id), &golangsdk.RequestOpts{
OkCodes: []int{200},
MoreHeaders: RequestOpts.MoreHeaders, JSONBody: nil,
})
return
}
Loading