Skip to content

Commit a059023

Browse files
authored
Add powervs network create and delete cmd (#1159)
* add delete network cmd Signed-off-by: Yussuf Shaikh <[email protected]> * add powervs network create cmd Signed-off-by: Yussuf Shaikh <[email protected]> * misc review changes Signed-off-by: Yussuf Shaikh <[email protected]> --------- Signed-off-by: Yussuf Shaikh <[email protected]>
1 parent 16e8328 commit a059023

File tree

6 files changed

+215
-30
lines changed

6 files changed

+215
-30
lines changed

cmd/capibmadm/cmd/powervs/network/create.go

Lines changed: 86 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,50 +17,119 @@ limitations under the License.
1717
package network
1818

1919
import (
20+
"context"
2021
"fmt"
22+
"strings"
2123

2224
"github.com/spf13/cobra"
2325

26+
v "github.com/IBM-Cloud/power-go-client/clients/instance"
27+
"github.com/IBM-Cloud/power-go-client/power/models"
28+
2429
logf "sigs.k8s.io/cluster-api/cmd/clusterctl/log"
2530

31+
"sigs.k8s.io/cluster-api-provider-ibmcloud/cmd/capibmadm/clients/iam"
32+
"sigs.k8s.io/cluster-api-provider-ibmcloud/cmd/capibmadm/clients/powervs"
2633
"sigs.k8s.io/cluster-api-provider-ibmcloud/cmd/capibmadm/options"
34+
"sigs.k8s.io/cluster-api-provider-ibmcloud/cmd/capibmadm/utils"
2735
)
2836

2937
type networkCreateOptions struct {
30-
name string
31-
dnsServers []string
38+
name string
39+
private bool
40+
public bool
41+
cidr string
42+
dnsServers []string
43+
gateway string
44+
jumbo bool
45+
ipAddressRanges []string
3246
}
3347

3448
// CreateCommand function to create PowerVS network.
3549
func CreateCommand() *cobra.Command {
3650
cmd := &cobra.Command{
37-
Use: "create NETWORK_NAME",
51+
Use: "create",
3852
Short: "Create PowerVS network",
3953
Example: `
40-
# Create PowerVS network with name capi-network
54+
# Create PowerVS network
4155
export IBMCLOUD_API_KEY=<api-key>
42-
capibmadm powervs network create capi-network --service-instance-id <service-instance-id>`,
56+
Public network: capibmadm powervs network create --public --service-instance-id <service-instance-id> --zone <zone>
57+
Private network: capibmadm powervs network create --private --cidr <cidr> --service-instance-id <service-instance-id> --zone <zone>
58+
Private network with ip address ranges: capibmadm powervs network create --private --cidr <cidr> --ip-ranges <start-ip>-<end-ip>,<start-ip>-<end-ip> --service-instance-id <service-instance-id> --zone <zone>
59+
`,
4360
}
4461

4562
var netCreateOption networkCreateOptions
46-
cmd.Flags().StringSliceVar(&netCreateOption.dnsServers, "dns-servers", []string{"8.8.8.8", "9.9.9.9"}, "Comma separated list of DNS Servers to use for this network")
63+
cmd.Flags().StringVar(&netCreateOption.name, "name", "", "The name of the network")
64+
cmd.Flags().BoolVar(&netCreateOption.public, "public", true, "Public (pub-vlan) network type")
65+
cmd.Flags().BoolVar(&netCreateOption.private, "private", false, "Private (vlan) network type")
66+
cmd.Flags().StringVar(&netCreateOption.cidr, "cidr", "", "The network CIDR. Required for private network type")
67+
cmd.Flags().StringVar(&netCreateOption.name, "gateway", "", "The gateway ip address")
68+
cmd.Flags().StringSliceVar(&netCreateOption.dnsServers, "dns-servers", []string{"8.8.8.8", "9.9.9.9"}, "Comma separated list of DNS Servers to use")
69+
cmd.Flags().StringSliceVar(&netCreateOption.ipAddressRanges, "ip-ranges", []string{}, "Comma separated IP Address Ranges")
70+
cmd.Flags().BoolVar(&netCreateOption.jumbo, "jumbo", false, "Enable MTU Jumbo Network")
71+
72+
// both cannot be provided, default is public
73+
cmd.MarkFlagsMutuallyExclusive("private", "public")
74+
// cidr is required for private vlan
75+
cmd.MarkFlagsRequiredTogether("private", "cidr")
4776

4877
cmd.RunE = func(cmd *cobra.Command, args []string) error {
49-
if len(args) < 1 {
50-
return fmt.Errorf("network name is not provided")
51-
}
52-
netCreateOption.name = args[0]
53-
if err := createNetwork(netCreateOption); err != nil {
54-
return err
55-
}
56-
return nil
78+
return createNetwork(cmd.Context(), netCreateOption)
5779
}
5880
return cmd
5981
}
6082

61-
func createNetwork(netCreateOption networkCreateOptions) error {
83+
func createNetwork(ctx context.Context, netCreateOption networkCreateOptions) error {
6284
log := logf.Log
63-
log.Info("Creating Power VS network", "name", netCreateOption.name, "service-instance-id", options.GlobalOptions.ServiceInstanceID, "dns-servers", netCreateOption.dnsServers)
64-
//TODO: add network creation logic here
85+
log.Info("Creating PowerVS network", "service-instance-id", options.GlobalOptions.ServiceInstanceID, "zone", options.GlobalOptions.PowerVSZone)
86+
87+
accountID, err := utils.GetAccountID(ctx, iam.GetIAMAuth())
88+
if err != nil {
89+
return err
90+
}
91+
sess, err := powervs.NewPISession(accountID, options.GlobalOptions.PowerVSZone, options.GlobalOptions.Debug)
92+
if err != nil {
93+
return err
94+
}
95+
96+
networkClient := v.NewIBMPINetworkClient(ctx, sess, options.GlobalOptions.ServiceInstanceID)
97+
98+
// default is public network
99+
ntype := "pub-vlan"
100+
if netCreateOption.private {
101+
ntype = "vlan"
102+
}
103+
104+
body := &models.NetworkCreate{
105+
Name: netCreateOption.name,
106+
Type: &ntype,
107+
Cidr: netCreateOption.cidr,
108+
DNSServers: netCreateOption.dnsServers,
109+
Gateway: netCreateOption.gateway,
110+
Jumbo: netCreateOption.jumbo,
111+
}
112+
113+
var ipAddressRanges []*models.IPAddressRange
114+
for _, ipRange := range netCreateOption.ipAddressRanges {
115+
if ipRange != "" {
116+
ipAddresses := strings.Split(ipRange, "-")
117+
if len(ipAddresses) != 2 {
118+
return fmt.Errorf("failed to read ip range, provide a range of IP addresses \"startIP-endIP\"")
119+
}
120+
ipAddressRanges = append(ipAddressRanges, &models.IPAddressRange{
121+
StartingIPAddress: &ipAddresses[0],
122+
EndingIPAddress: &ipAddresses[1],
123+
})
124+
}
125+
}
126+
body.IPAddressRanges = ipAddressRanges
127+
128+
network, err := networkClient.Create(body)
129+
if err != nil {
130+
return fmt.Errorf("failed to create a network, err: %v", err)
131+
}
132+
log.Info("Successfully created a network", "networkID", *network.NetworkID)
133+
65134
return nil
66135
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/*
2+
Copyright 2023 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package network
18+
19+
import (
20+
"context"
21+
22+
"github.com/spf13/cobra"
23+
24+
v "github.com/IBM-Cloud/power-go-client/clients/instance"
25+
26+
logf "sigs.k8s.io/cluster-api/cmd/clusterctl/log"
27+
28+
"sigs.k8s.io/cluster-api-provider-ibmcloud/cmd/capibmadm/clients/iam"
29+
"sigs.k8s.io/cluster-api-provider-ibmcloud/cmd/capibmadm/clients/powervs"
30+
"sigs.k8s.io/cluster-api-provider-ibmcloud/cmd/capibmadm/options"
31+
"sigs.k8s.io/cluster-api-provider-ibmcloud/cmd/capibmadm/utils"
32+
)
33+
34+
// DeleteCommand function to delete network.
35+
func DeleteCommand() *cobra.Command {
36+
cmd := &cobra.Command{
37+
Use: "delete",
38+
Short: "Delete PowerVS network",
39+
Example: `
40+
# Delete PowerVS network
41+
export IBMCLOUD_API_KEY=<api-key>
42+
capibmadm powervs network delete --network <network-name/network-id> --service-instance-id <service-instance-id> --zone <zone>`,
43+
}
44+
45+
var networkID string
46+
cmd.Flags().StringVar(&networkID, "network", "", "Network ID or Name")
47+
_ = cmd.MarkFlagRequired("network")
48+
49+
cmd.RunE = func(cmd *cobra.Command, args []string) error {
50+
return deleteNetwork(cmd.Context(), networkID)
51+
}
52+
return cmd
53+
}
54+
55+
func deleteNetwork(ctx context.Context, networkID string) error {
56+
log := logf.Log
57+
log.Info("Deleting PowerVS network", "service-instance-id", options.GlobalOptions.ServiceInstanceID, "zone", options.GlobalOptions.PowerVSZone)
58+
59+
accountID, err := utils.GetAccountID(ctx, iam.GetIAMAuth())
60+
if err != nil {
61+
return err
62+
}
63+
sess, err := powervs.NewPISession(accountID, options.GlobalOptions.PowerVSZone, options.GlobalOptions.Debug)
64+
if err != nil {
65+
return err
66+
}
67+
68+
networkClient := v.NewIBMPINetworkClient(ctx, sess, options.GlobalOptions.ServiceInstanceID)
69+
70+
if err = networkClient.Delete(networkID); err != nil {
71+
return err
72+
}
73+
74+
log.Info("Successfully deleted a network", "network", networkID)
75+
return nil
76+
}

cmd/capibmadm/cmd/powervs/network/list.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,7 @@ func ListCommand() *cobra.Command {
4444
export IBMCLOUD_API_KEY=<api-key>
4545
capibmadm powervs network list --service-instance-id <service-instance-id> --zone <zone>`,
4646
RunE: func(cmd *cobra.Command, args []string) error {
47-
if err := listNetwork(cmd.Context()); err != nil {
48-
return err
49-
}
50-
return nil
47+
return listNetwork(cmd.Context())
5148
},
5249
}
5350

cmd/capibmadm/cmd/powervs/network/network.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ func Commands() *cobra.Command {
2929

3030
cmd.AddCommand(CreateCommand())
3131
cmd.AddCommand(ListCommand())
32+
cmd.AddCommand(DeleteCommand())
3233

3334
return cmd
3435
}

docs/book/src/topics/capibmadm/powervs/index.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
# capibmadm powervs `<commands>`
22

33

4-
## 1. Power VS commands
4+
## 1. PowerVS commands
55
- [key](./key.md)
66
- [create](/topics/capibmadm/powervs/key.html#1-capibmadm-powervs-key-create)
77
- [delete](/topics/capibmadm/powervs/key.html#2-capibmadm-powervs-key-delete)
88
- [list](/topics/capibmadm/powervs/key.html#3-capibmadm-powervs-key-list)
99
- [network](./network.md)
1010
- [create](/topics/capibmadm/powervs/network.html#1-capibmadm-powervs-network-create)
11-
- [list](/topics/capibmadm/powervs/network.html#2-capibmadm-powervs-network-list)
11+
- [delete](/topics/capibmadm/powervs/network.html#2-capibmadm-powervs-network-delete)
12+
- [list](/topics/capibmadm/powervs/network.html#3-capibmadm-powervs-network-list)
1213
- [port](./port.md)
1314
- [create](/topics/capibmadm/powervs/port.html#1-capibmadm-powervs-port-create)
1415
- [delete](/topics/capibmadm/powervs/port.html#2-capibmadm-powervs-port-delete)

docs/book/src/topics/capibmadm/powervs/network.md

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,74 @@
1-
## Power VS Network Commands
1+
## PowerVS Network Commands
22

33
### 1. capibmadm powervs network create
44

55
#### Usage:
6-
Create Power VS network.
6+
Create PowerVS network.
77

88
#### Environmental Variable:
9-
IBMCLOUD_API_KEY: IBM Cloud api key.
9+
IBMCLOUD_API_KEY: IBM Cloud API key.
1010

1111
#### Arguments:
12-
--service-instance-id: Power VS service instance id.
12+
--service-instance-id: PowerVS service instance id.
13+
14+
--cidr: The network CIDR. Required for private network type.
15+
16+
--name: The name of the network.
17+
18+
--public: Public (pub-vlan) network type (default true)
19+
20+
--private: Private (vlan) network type (default false)
21+
22+
--gateway: The gateway ip address.
1323

1424
--dns-servers: Comma separated list of DNS Servers to use for this network, Defaults to 8.8.8.8, 9.9.9.9.
1525

26+
--ip-ranges: Comma separated IP Address Ranges.
27+
28+
--jumbo: Enable MTU Jumbo Network.
29+
30+
1631
#### Example:
1732
```shell
1833
export IBMCLOUD_API_KEY=<api-key>
19-
capibmadm powervs network create <network-name> --service-instance-id <service-instance-id>
34+
# Public network:
35+
capibmadm powervs network create --public --service-instance-id <service-instance-id> --zone <zone>
36+
# Private network:
37+
capibmadm powervs network create --private --cidr <cidr> --service-instance-id <service-instance-id> --zone <zone>
38+
# Private network with ip address ranges:
39+
capibmadm powervs network create --private --cidr <cidr> --ip-ranges <start-ip>-<end-ip>,<start-ip>-<end-ip> --service-instance-id <service-instance-id> --zone <zone>
2040
```
2141

2242

43+
### 2. capibmadm powervs network delete
44+
45+
#### Usage:
46+
Delete PowerVS network.
47+
48+
#### Environmental Variable:
49+
IBMCLOUD_API_KEY: IBM Cloud API key.
50+
51+
#### Arguments:
52+
--service-instance-id: PowerVS service instance id.
53+
54+
--zone: PowerVS service instance zone.
55+
56+
--network: Network ID or Name.
57+
58+
#### Example:
59+
```shell
60+
export IBMCLOUD_API_KEY=<api-key>
61+
capibmadm powervs network delete --network <network-name/network-id> --service-instance-id <service-instance-id> --zone <zone>
62+
```
63+
2364

24-
### 2. capibmadm powervs network list
65+
### 3. capibmadm powervs network list
2566

2667
#### Usage:
2768
List PowerVS networks.
2869

2970
#### Environmental Variable:
30-
IBMCLOUD_API_KEY: IBM Cloud api key.
71+
IBMCLOUD_API_KEY: IBM Cloud API key.
3172

3273
#### Arguments:
3374
--service-instance-id: PowerVS service instance id.

0 commit comments

Comments
 (0)