Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support to list PER enabled DCs/Zones #542

Merged
merged 1 commit into from
Jan 12, 2024
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
10 changes: 6 additions & 4 deletions cmd/get/events/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,14 @@ package events

import (
"fmt"
"time"

"github.com/spf13/cobra"
"k8s.io/klog/v2"

"github.com/ppc64le-cloud/pvsadm/pkg"
"github.com/ppc64le-cloud/pvsadm/pkg/client"
"github.com/ppc64le-cloud/pvsadm/pkg/utils"
"github.com/spf13/cobra"
"k8s.io/klog/v2"
"time"
)

var (
Expand All @@ -34,7 +36,7 @@ var Cmd = &cobra.Command{
Long: `Get the PowerVS events`,
PreRunE: func(cmd *cobra.Command, args []string) error {
if pkg.Options.InstanceID == "" && pkg.Options.InstanceName == "" {
return fmt.Errorf("--instance-name or --instance-name required")
return fmt.Errorf("--instance-id or --instance-name required")
}
return nil
},
Expand Down
2 changes: 2 additions & 0 deletions cmd/get/get.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"github.com/spf13/cobra"

"github.com/ppc64le-cloud/pvsadm/cmd/get/events"
"github.com/ppc64le-cloud/pvsadm/cmd/get/peravailability"
"github.com/ppc64le-cloud/pvsadm/cmd/get/ports"
"github.com/ppc64le-cloud/pvsadm/pkg"
)
Expand All @@ -31,6 +32,7 @@ var Cmd = &cobra.Command{

func init() {
Cmd.AddCommand(events.Cmd)
Cmd.AddCommand(peravailability.Cmd)
Cmd.AddCommand(ports.Cmd)
Cmd.PersistentFlags().StringVarP(&pkg.Options.InstanceID, "instance-id", "i", "", "Instance ID of the PowerVS instance")
Cmd.PersistentFlags().StringVarP(&pkg.Options.InstanceName, "instance-name", "n", "", "Instance name of the PowerVS")
Expand Down
75 changes: 75 additions & 0 deletions cmd/get/peravailability/peravailability.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
// Copyright 2021 IBM Corp
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package peravailability

import (
"fmt"
"sort"

"github.com/spf13/cobra"
"k8s.io/klog/v2"

"github.com/ppc64le-cloud/pvsadm/pkg"
"github.com/ppc64le-cloud/pvsadm/pkg/client"
)

const powerEdgeRouter = "power-edge-router"

var Cmd = &cobra.Command{
Use: "per-availability",
Short: "List regions that support PER",
Long: "List regions that support Power Edge Router (PER)",
PreRunE: func(cmd *cobra.Command, args []string) error {
if pkg.Options.InstanceID == "" && pkg.Options.InstanceName == "" {
return fmt.Errorf("--instance-id or --instance-name required")
}
return nil
},
RunE: func(cmd *cobra.Command, args []string) error {
var perEnabledRegions = []string{}
opt := pkg.Options
c, err := client.NewClientWithEnv(opt.APIKey, opt.Environment, opt.Debug)
if err != nil {
klog.Errorf("failed to create a session with IBM cloud: %v", err)
return err
}

pvmclient, err := client.NewPVMClientWithEnv(c, opt.InstanceID, opt.InstanceName, opt.Environment)
if err != nil {
return err
}
ret, err := pvmclient.DatacenterClient.GetAll()
if err != nil {
return err
}
supportsPER := false
for _, datacenter := range ret.Datacenters {
if datacenter.Capabilities[powerEdgeRouter] {
perEnabledRegions = append(perEnabledRegions, *datacenter.Location.Region)
if pvmclient.Zone == *datacenter.Location.Region {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of checking here, once perEnabledRegions is populated, you can check outside the for loop only once.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The current design will avoid an additional round of iteration on perEnabledRegions as the membership is validated within the same loop. Hope this is ok.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes understood, I think the current code looks good to me!

supportsPER = true
}
}
}
if !supportsPER {
klog.Infof("%s, where the current instance is present does not support PER.", pvmclient.Zone)
} else {
klog.Infof("%s, where the current instance is present supports PER.", pvmclient.Zone)
}
sort.Strings(perEnabledRegions)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any reason behind the sorting?

Copy link
Contributor Author

@kishen-v kishen-v Jan 11, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just for improved readability, where datacenters of the same region stay grouped. 🙂

dal10 eu-de-1 eu-de-2 mad02 mad04 sao04 wdc06 wdc07

klog.Infoln("The following zones/datacenters have support for PER:", perEnabledRegions, ".", "More information at https://cloud.ibm.com/docs/overview?topic=overview-locations")
return nil
},
}
44 changes: 44 additions & 0 deletions pkg/client/datacenter/datacenter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Copyright 2021 IBM Corp
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package datacenter

import (
"context"

"github.com/IBM-Cloud/power-go-client/clients/instance"
"github.com/IBM-Cloud/power-go-client/ibmpisession"
"github.com/IBM-Cloud/power-go-client/power/models"
)

type Client struct {
client *instance.IBMPIDatacentersClient
instanceID string
}

func NewClient(sess *ibmpisession.IBMPISession, powerinstanceid string) *Client {
c := &Client{
instanceID: powerinstanceid,
}
c.client = instance.NewIBMPIDatacenterClient(context.Background(), sess, powerinstanceid)
return c
}

func (c *Client) Get(id string) (*models.Datacenter, error) {
return c.client.Get(id)
}

func (c *Client) GetAll() (*models.Datacenters, error) {
return c.client.GetAll()
}
32 changes: 18 additions & 14 deletions pkg/client/pvmclient.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import (
"github.com/IBM/go-sdk-core/v5/core"

"github.com/ppc64le-cloud/pvsadm/pkg"
"github.com/ppc64le-cloud/pvsadm/pkg/client/datacenter"
"github.com/ppc64le-cloud/pvsadm/pkg/client/dhcp"
"github.com/ppc64le-cloud/pvsadm/pkg/client/events"
"github.com/ppc64le-cloud/pvsadm/pkg/client/image"
Expand All @@ -41,15 +42,17 @@ type PVMClient struct {
Region string
Zone string

PISession *ibmpisession.IBMPISession
InstanceClient *instance.Client
ImgClient *image.Client
JobClient *job.Client
VolumeClient *volume.Client
NetworkClient *network.Client
EventsClient *events.Client
KeyClient *key.Client
DHCPClient *dhcp.Client
PISession *ibmpisession.IBMPISession

DatacenterClient *datacenter.Client
DHCPClient *dhcp.Client
EventsClient *events.Client
ImgClient *image.Client
InstanceClient *instance.Client
JobClient *job.Client
KeyClient *key.Client
NetworkClient *network.Client
VolumeClient *volume.Client
}

func NewPVMClient(c *Client, instanceID, instanceName, ep string) (*PVMClient, error) {
Expand Down Expand Up @@ -97,13 +100,14 @@ func NewPVMClient(c *Client, instanceID, instanceName, ep string) (*PVMClient, e
return nil, err
}

pvmclient.DatacenterClient = datacenter.NewClient(pvmclient.PISession, instanceID)
pvmclient.DHCPClient = dhcp.NewClient(pvmclient.PISession, instanceID)
pvmclient.EventsClient = events.NewClient(pvmclient.PISession, instanceID)
pvmclient.ImgClient = image.NewClient(pvmclient.PISession, instanceID)
pvmclient.JobClient = job.NewClient(pvmclient.PISession, instanceID)
pvmclient.VolumeClient = volume.NewClient(pvmclient.PISession, instanceID)
pvmclient.InstanceClient = instance.NewClient(pvmclient.PISession, instanceID)
pvmclient.NetworkClient = network.NewClient(pvmclient.PISession, instanceID)
pvmclient.EventsClient = events.NewClient(pvmclient.PISession, instanceID)
pvmclient.JobClient = job.NewClient(pvmclient.PISession, instanceID)
pvmclient.KeyClient = key.NewClient(pvmclient.PISession, instanceID)
pvmclient.DHCPClient = dhcp.NewClient(pvmclient.PISession, instanceID)
pvmclient.NetworkClient = network.NewClient(pvmclient.PISession, instanceID)
pvmclient.VolumeClient = volume.NewClient(pvmclient.PISession, instanceID)
return pvmclient, nil
}