Skip to content

Commit 944f595

Browse files
suruchimalewarsanthosh-vrts
authored andcommitted
Sample code for NetBackup Storage APIs (#30)
1 parent f8435b9 commit 944f595

File tree

85 files changed

+7058
-1
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

85 files changed

+7058
-1
lines changed

recipes/perl/storage/README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
### NetBackup API Code Samples for perl
2+
3+
This directory contains code samples to invoke NetBackup REST APIs using perl.
4+
5+
#### Disclaimer
6+
7+
These scripts are only meant to be used as a reference. If you intend to use them in production, use it at your own risk.
8+
9+
#### Pre-requisites:
10+
11+
- NetBackup 8.2 or higher
12+
- Perl 5.20.2 or higher
13+
14+
#### Executing the recipes in perl
15+
16+
Use the following commands to run the perl samples.
17+
- `perl configure_storage_unit_cloud_end_to_end.pl -nbmaster <masterServer> -username <username> -password <password> -sts_payload <pathToInputPayloadForStorageServer> -dp_payload <pathToInputPayloadForDiskPool> -stu_payload <pathToInputPayloadForStorageUnit> [-domainName <domainName>] [-domainType <domainType>]`
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
#!/usr/bin/env perl
2+
3+
use LWP::UserAgent;
4+
use LWP::Protocol::https;
5+
print "LWP::UserAgent: ".LWP::UserAgent->VERSION,"\n";
6+
print "LWP::Protocol::https: ".LWP::Protocol::https->VERSION,"\n";
7+
use JSON;
8+
use Getopt::Long qw(GetOptions);
9+
use storage;
10+
11+
# This script consists of the helper functions to excute NetBackup APIs to create storage unit.
12+
# 1) Login to Netbackup
13+
# 2) Create storage server
14+
# 3) Create disk Pool
15+
# 4) Create storage unit
16+
17+
#
18+
# The token is the key to the NetBackup AuthN/AuthZ scheme. You must login and get a token
19+
# and use this token in your Authorization header for all subsequent requests. Token validity
20+
# is fixed at 24 hours
21+
#
22+
my $token;
23+
24+
my $protocol = "https";
25+
my $port = "1556";
26+
my $nbmaster;
27+
my $username;
28+
my $password;
29+
my $sts_payload;
30+
my $dp_payload;
31+
my $stu_payload;
32+
my $domainName;
33+
my $domainType;
34+
my $base_url;
35+
36+
37+
# subroutines for printing usage and library information required to run the script.
38+
sub print_usage {
39+
print("\n\nUsage:");
40+
print("\nperl configure_storage_unit_cloud_end_to_end.pl -nbmaster <masterServer> -username <username> -password <password> -sts_payload <pathToInputPayloadForStorageServer> -dp_payload <pathToInputPayloadForDiskPool> -stu_payload <pathToInputPayloadForStorageUnit> [-domainName <domainName>] [-domainType <domainType>]\n\n\n");
41+
}
42+
43+
sub print_disclaimer {
44+
print("--------------------------------------------------------\n");
45+
print("-- This script requires Perl 5.20.2 or later --\n");
46+
print("--------------------------------------------------------\n");
47+
print("Executing this library requires some additional libraries like \n\t'LWP' \n\t'JSON'\ \n\t'Getopt'\ \n\n");
48+
print("You can specify the 'nbmaster', 'username', 'password', 'sts_payload', 'dp_payload', 'stu_payload', 'domainName' and 'domainType' as command-line parameters\n");
49+
print_usage();
50+
}
51+
52+
# subroutine to process user input
53+
sub user_input {
54+
GetOptions(
55+
'nbmaster=s' => \$nbmaster,
56+
'username=s' => \$username,
57+
'password=s' => \$password,
58+
'sts_payload=s' => \$sts_payload,
59+
'dp_payload=s' => \$dp_payload,
60+
'stu_payload=s' => \$stu_payload,
61+
'domainName=s' => \$domainName,
62+
'domainType=s' => \$domainType,
63+
) or die print_usage();
64+
65+
if ($nbmaster eq "") {
66+
print("Please provide the value for 'nbmaster'");
67+
exit;
68+
}
69+
70+
if ($username eq "") {
71+
print("Please provide the value for 'username'");
72+
exit;
73+
}
74+
75+
if ($password eq "") {
76+
print("Please provide the value for 'password'");
77+
exit;
78+
}
79+
if ($sts_payload eq "") {
80+
print("Please provide the value for 'sts_payload'");
81+
exit;
82+
}
83+
84+
if ($dp_payload eq "") {
85+
print("Please provide the value for 'dp_payload'");
86+
exit;
87+
}
88+
89+
if ($stu_payload eq "") {
90+
print("Please provide the value for 'stu_payload'");
91+
exit;
92+
}
93+
94+
$base_url = "$protocol://$nbmaster:$port/netbackup";
95+
}
96+
97+
sub storage_api_automation {
98+
my $token = storage::perform_login($nbmaster, $username, $password, $domain_name, $domain_type);
99+
storage::post_storage_server($nbmaster, $token, $sts_payload);
100+
storage::post_disk_pool($nbmaster, $token, $dp_payload);
101+
storage::post_storage_unit($nbmaster, $token, $stu_payload);
102+
103+
}
104+
105+
print_disclaimer();
106+
107+
user_input();
108+
109+
storage_api_automation();

recipes/perl/storage/storage.pm

Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
#!/usr/bin/env perl
2+
3+
package storage;
4+
5+
use JSON;
6+
use warnings;
7+
use LWP::UserAgent;
8+
use HTTP::Request;
9+
use LWP::Protocol::https;
10+
11+
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
12+
$CONTENT_TYPE = "application/vnd.netbackup+json;version=3.0";
13+
$PROTOCOL = "https://";
14+
$NB_PORT = 1556;
15+
16+
my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0, verify_peer => 0});
17+
18+
19+
sub send_http_request {
20+
my $url = $_[0];
21+
my $request_type = $_[1];
22+
my $token = $_[2];
23+
my $body = $_[3];
24+
my $accept = $_[4];
25+
my $content_type = $_[5];
26+
27+
if (not defined $url or not defined $request_type){
28+
print "Error: url and request type are required fields";
29+
return undef;
30+
}
31+
32+
print "Unencoded URL is $url\n";
33+
# assume string is un-encoded, and '%' is a literal that needs to be replaced by '%25'.
34+
# All other types of encoding are handled gracefully by the LWP module except literal percent
35+
$url =~ s/%/%25/;
36+
37+
# determine correct request type
38+
my $req;
39+
if (uc($request_type) eq "GET" ){
40+
$req = HTTP::Request->new(GET => $url);
41+
}
42+
elsif ((uc($request_type) eq "POST")){
43+
$req = HTTP::Request->new(POST => $url);
44+
}
45+
elsif ((uc($request_type) eq "DELETE")){
46+
$req = HTTP::Request->new(DELETE => $url);
47+
}
48+
elsif ((uc($request_type) eq "PUT")) {
49+
$req = HTTP::Request->new(PUT => $url);
50+
}
51+
elsif ((uc($request_type) eq "PATCH")){
52+
$req = HTTP::Request->new(PATCH => $url);
53+
}
54+
else {
55+
print "Unrecognized request type [$request_type]. If this is a valid HTTP request type, please update me";
56+
return undef;
57+
}
58+
59+
# print encoded url to the screen
60+
print "Encoded URL is ${$req->uri}\n";
61+
62+
if (defined $token) {
63+
$req->header('Authorization' => $token);
64+
}
65+
if (defined $accept) {
66+
$req->header('Accept' => $accept);
67+
}
68+
if (defined $content_type){
69+
$req->header('Content-Type' => $content_type);
70+
}
71+
if (defined $body){
72+
$req->content($body);
73+
}
74+
75+
my $resp = $ua->request($req);
76+
if ($resp->is_success) {
77+
my $json_results;
78+
if (defined($resp->content) && $resp->content ne "") {
79+
$json_results = decode_json($resp->content);
80+
}
81+
else {
82+
$json_results = "";
83+
}
84+
return $json_results;
85+
}
86+
else {
87+
print "HTTP error code: ", $resp->code, "\n";
88+
print "HTTP response content: ", $resp->content, "\n";
89+
return undef;
90+
}
91+
}
92+
93+
sub perform_login {
94+
my @argument_list = @_;
95+
my $master_server = $argument_list[0];
96+
my $username = $argument_list[1];
97+
my $password = $argument_list[2];
98+
99+
my $token;
100+
101+
# domainName and domainType are optional
102+
my $domainName = "";
103+
my $domainType = "";
104+
if (@argument_list >= 4) {
105+
$domainName = $argument_list[3];
106+
}
107+
if (@argument_list == 5) {
108+
$domainType = $argument_list[4];
109+
}
110+
111+
# Construct url
112+
my $url = "https://$master_server:1556/netbackup/login";
113+
114+
# Construct request body
115+
my $post_data;
116+
if (not $domainName and not $domainType) {
117+
$post_data = qq({ "userName": "$username", "password": "$password" });
118+
}
119+
else {
120+
$post_data = qq({ "domainType": "$domainType", "domainName": "$domainName", "userName": "$username", "password": "$password" });
121+
}
122+
123+
print "\n\n**************************************************************";
124+
print "\n\n Making POST Request to login to get token \n\n";
125+
126+
my $json_results = send_http_request($url, "post", undef, $post_data, undef, "application/json");
127+
128+
if (defined $json_results){
129+
$token = $json_results->{"token"};
130+
}
131+
return $token;
132+
}
133+
134+
# Create a storage server
135+
sub post_storage_server {
136+
my $arguments_count = scalar(@_);
137+
if ($arguments_count != 3) {
138+
print "ERROR :: Incorrect number of arguments passed to post_storage_server()\n";
139+
print "Usage : post_storage_server( <Master Server Hostname>, <Token>, <Payload>) \n";
140+
return;
141+
}
142+
143+
my $master_server = $_[0];
144+
my $token = $_[1];
145+
my $filename = $_[2];
146+
my $url = "$PROTOCOL$master_server:$NB_PORT/netbackup/storage/storage-servers";
147+
open(my $fh, '<:encoding(UTF-8)', $filename)
148+
or die "Could not open file '$filename' $!";
149+
150+
my $payload = "";
151+
while (my $row = <$fh>) {
152+
chomp $row;
153+
$payload .= $row;
154+
}
155+
print "payload: $payload\n";
156+
157+
my $json = send_http_request($url, "POST", $token, $payload, undef, $CONTENT_TYPE);
158+
159+
if (defined $json) {
160+
print "Successfully completed POST Storage Server Request.\n";
161+
162+
my $pretty = JSON->new->pretty->encode($json);
163+
return $pretty;
164+
}
165+
else {
166+
print "ERROR :: POST Storage Server Request Failed!\n";
167+
}
168+
}
169+
170+
171+
# Create a storage unit
172+
sub post_storage_unit {
173+
my $arguments_count = scalar(@_);
174+
if ($arguments_count != 3) {
175+
print "ERROR :: Incorrect number of arguments passed to post_storage_unit()\n";
176+
print "Usage : post_storage_server( <Master Server Hostname>, <Token>, <Payload>) \n";
177+
return;
178+
}
179+
180+
my $master_server = $_[0];
181+
my $token = $_[1];
182+
my $filename = $_[2];
183+
my $url = "$PROTOCOL$master_server:$NB_PORT/netbackup/storage/storage-units";
184+
open(my $fh, '<:encoding(UTF-8)', $filename)
185+
or die "Could not open file '$filename' $!";
186+
187+
my $payload = "";
188+
while (my $row = <$fh>) {
189+
chomp $row;
190+
$payload .= $row;
191+
}
192+
print "payload: $payload\n";
193+
194+
my $json = send_http_request($url, "POST", $token, $payload, undef, $CONTENT_TYPE);
195+
196+
if (defined $json) {
197+
print "Successfully completed POST Storage Unit Request.\n";
198+
199+
my $pretty = JSON->new->pretty->encode($json);
200+
return $pretty;
201+
}
202+
else {
203+
print "ERROR :: POST Storage Unit Request Failed!\n";
204+
}
205+
}
206+
207+
# Create a Disk Pool
208+
sub post_disk_pool {
209+
my $arguments_count = scalar(@_);
210+
if ($arguments_count != 3) {
211+
print "ERROR :: Incorrect number of arguments passed to post_disk_pool()\n";
212+
print "Usage : post_storage_server( <Master Server Hostname>, <Token>, <Payload>) \n";
213+
return;
214+
}
215+
216+
my $master_server = $_[0];
217+
my $token = $_[1];
218+
my $filename = $_[2];
219+
my $url = "$PROTOCOL$master_server:$NB_PORT/netbackup/storage/disk-pools";
220+
open(my $fh, '<:encoding(UTF-8)', $filename)
221+
or die "Could not open file '$filename' $!";
222+
223+
my $payload = "";
224+
while (my $row = <$fh>) {
225+
chomp $row;
226+
$payload .= $row;
227+
}
228+
print "payload: $payload\n";
229+
230+
my $json = send_http_request($url, "POST", $token, $payload, undef, $CONTENT_TYPE);
231+
232+
if (defined $json) {
233+
print "Successfully completed POST Disk Pool Request.\n";
234+
235+
my $pretty = JSON->new->pretty->encode($json);
236+
return $pretty;
237+
}
238+
else {
239+
print "ERROR :: POST Disk Pool Request Failed!\n";
240+
}
241+
}
242+
243+
1;
244+
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
### NetBackup API Code Samples for PowerShell
2+
3+
This directory contains code samples to invoke NetBackup REST APIs using PowerShell.
4+
5+
#### Disclaimer
6+
7+
These scripts are only meant to be used as a reference. If you intend to use them in production, use it at your own risk.
8+
9+
#### Executing the recipes in PowerShell
10+
11+
Pre-requisites:
12+
- NetBackup 8.1.2 or higher
13+
- PowerShell 4.0 or higher
14+
- NetBackup 8.2 or higher is required for configuring storage API
15+
16+
Use the following commands to run the PowerShell samples.
17+
- `.\configure_storage_unit_end_to_end.ps1 -nbmaster <masterServer> -username <username> -password <password> [-domainName <domainName> -domainType <domainType>]`

0 commit comments

Comments
 (0)