-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathvolume.py
More file actions
161 lines (129 loc) · 4.94 KB
/
volume.py
File metadata and controls
161 lines (129 loc) · 4.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#! /usr/bin/python3.11
"""
ONTAP 9.13.1 REST API Python Client Library Scripts
This script performs the following:
- Create a volume
- List all volumes
- Move a volume to another aggregate
- Resize a volume to a new (bigger) size
- Delete a volume
usage: python3.11 volume.py [-h] -c CLUSTER -v VOLUME_NAME -vs VSERVER_NAME -a AGGR_NAME
-rs VOLUME_RESIZE -s VOLUME_SIZE [-u API_USER] [-p API_PASS]
The following arguments are required: -c/--cluster, -v/--volume_name, -vs/--vserver_name,
-a/--aggr_name, -rs/--volume_resize, -s/--volume_size
"""
import argparse
from getpass import getpass
import logging
from netapp_ontap import config, HostConnection, NetAppRestError
from netapp_ontap.resources import Volume
from netapp_ontap.models import VolumeMovement
def create_volume(volume_name: str, vserver_name: str, aggr_name: str, volume_size: int) -> None:
"""Creates a new volume in a SVM"""
data = {
'name': volume_name,
'svm': {'name': vserver_name},
'aggregates': [{'name': aggr_name }],
'size': volume_size
}
volume = Volume(**data)
try:
volume.post()
print("Volume %s created successfully" % volume.name)
except NetAppRestError as err:
print("Error: Volume was not created: %s" % err)
return
def list_volumes(vserver_name: str) -> None:
"""List Volumes in a SVM """
print ("\nList of Volumes:-")
try:
for volume in Volume.get_collection(**{"svm.name": vserver_name}):
volume.get()
print (volume.name)
except NetAppRestError as err:
print("Error: Volume list was not created: %s" % err)
return
def get_volume(volume_name: str) -> None:
"""Get the details of a volume"""
volume = Volume.find(name=volume_name)
try:
volume.get()
print (volume.name)
print("Volume details for %s obtained successfully" % volume.name)
except NetAppRestError as err:
print("Error: Volume details not obtained: %s" % err)
return
def delete_volume(vserver_name: str, volume_name: str) -> None:
"""Delete a volume in a SVM"""
volume = Volume.find(name=volume_name, svm={"name":vserver_name})
if (volume == None):
print ("Error: Volume %s not found!" % volume.name)
return
try:
volume.delete()
print("Volume %s deleted successfully" % volume.name)
except NetAppRestError as err:
print("Error: Volume was not deleted: %s" % err)
return
def resize_volume(vserver_name: str, volume_name: str, volume_resize: int) -> None:
"""Resize a volume in a SVM"""
volume = Volume.find(name=volume_name, svm={"name":vserver_name})
if (volume == None):
print ("Error: Volume %s not found!" % volume.name)
return
volume.size = volume_resize
try:
volume.patch()
print("Volume %s resized successfully" % volume.name)
except NetAppRestError as err:
print("Error: Volume was not resized: %s" % err)
return
def parse_args() -> argparse.Namespace:
"""Parse the command line arguments from the user"""
parser = argparse.ArgumentParser(
description="This script will create a new volume."
)
parser.add_argument(
"-c", "--cluster", required=True, help="API server IP:port details"
)
parser.add_argument(
"-v", "--volume_name", required=True, help="Volume to create or clone from"
)
parser.add_argument(
"-vs", "--vserver_name", required=True, help="SVM to create the volume from"
)
parser.add_argument(
"-a", "--aggr_name", required=True, help="Aggregate to create the volume from"
)
parser.add_argument(
"-rs", "--volume_resize", required=True, help="Volume resize in bytes"
)
parser.add_argument(
"-s", "--volume_size", required=True, help="Size of the volume."
)
parser.add_argument("-u", "--api_user", default="admin", help="API Username")
parser.add_argument("-p", "--api_pass", help="API Password")
parsed_args = parser.parse_args()
# collect the password without echo if not already provided
if not parsed_args.api_pass:
parsed_args.api_pass = getpass()
return parsed_args
if __name__ == "__main__":
logging.basicConfig(
level=logging.INFO,
format="[%(asctime)s] [%(levelname)5s] [%(module)s:%(lineno)s] %(message)s",
)
args = parse_args()
config.CONNECTION = HostConnection(
args.cluster, username=args.api_user, password=args.api_pass, verify=False,
)
# Create a Volume
create_volume(args.volume_name, args.vserver_name, args.aggr_name , args.volume_size)
# List all volumes in the VServer
list_volumes(args.vserver_name)
# Get the volume details
get_volume(args.volume_name)
# Resize a volume
resize_volume(args.vserver_name, args.volume_name, args.volume_resize)
# Delete a volume
delete_volume(args.vserver_name, args.volume_name)