Skip to content

Commit b75ce85

Browse files
authored
Merge pull request #16 from VeritasOS/feature/netbackup-go-module
Feature/netbackup go module
2 parents b7a7244 + 7889a21 commit b75ce85

5 files changed

Lines changed: 379 additions & 0 deletions

File tree

snippets/go/README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# NetBackup package for GO language
2+
3+
This package gives a wrapper to call NetBackup APIs.
4+
There are few raw functions that can be used generically to
5+
call NetBackup APIs.
6+
There are also some specific call that creates the URL, calls the API, parse the output and return back the data.
7+
8+
9+
## Building and executing sample program
10+
Pre-requisites:
11+
- NetBackup 8.1.1 or higher
12+
- Go version 1.10.2
13+
14+
Use the following commands to build and execute the sample program
15+
```sh
16+
$ cd netbackup
17+
$ # Build sample program for fetching server mappings
18+
$ go build example/get_nb_mapping.go
19+
$ ./get_nb_mapping
20+
21+
$ # Build sample program for fetching catalog images
22+
$ go build example/get_nb_images.go
23+
$ ./get_nb_images
24+
25+
$ # Build sample program for fetching backup jobs
26+
$ go build example/get_nb_jobs.go
27+
$ ./get_nb_jobs
28+
```
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package main
2+
import (
3+
"bufio"
4+
"fmt"
5+
"netbackup"
6+
"os"
7+
)
8+
func main() {
9+
fmt.Printf("Welcome to sample Go program to call NetBackup APIs\n")
10+
scanner := bufio.NewScanner(os.Stdin)
11+
fmt.Printf("Enter the server to connect: ")
12+
scanner.Scan()
13+
server := scanner.Text()
14+
fmt.Printf("Enter username for server:")
15+
scanner.Scan()
16+
username := scanner.Text()
17+
fmt.Printf("Enter password for server:")
18+
scanner.Scan()
19+
password := scanner.Text()
20+
fmt.Printf("Enter domain name for server:")
21+
scanner.Scan()
22+
domain := scanner.Text()
23+
fmt.Printf("Enter domain type <unixpwd/nt>:")
24+
scanner.Scan()
25+
domainType := scanner.Text()
26+
fmt.Printf("Calling NetBackup Login\n")
27+
fmt.Printf("-----------------------\n")
28+
jwt := netbackup.Login(username, password, domain, domainType, server)
29+
fmt.Printf("-----------------------\n")
30+
fmt.Printf("Netbackup Images List using jwt\n")
31+
fmt.Printf("-----------------------\n")
32+
netbackup.ImagesList(jwt, server)
33+
fmt.Printf("-----------------------\n")
34+
}

snippets/go/example/get_nb_jobs.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package main
2+
import (
3+
"bufio"
4+
"fmt"
5+
"netbackup"
6+
"os"
7+
)
8+
func main() {
9+
fmt.Printf("Welcome to sample Go program to call NetBackup APIs\n")
10+
scanner := bufio.NewScanner(os.Stdin)
11+
fmt.Printf("Enter the server to connect: ")
12+
scanner.Scan()
13+
server := scanner.Text()
14+
fmt.Printf("Enter username for server:")
15+
scanner.Scan()
16+
username := scanner.Text()
17+
fmt.Printf("Enter password for server:")
18+
scanner.Scan()
19+
password := scanner.Text()
20+
fmt.Printf("Enter domain name for server:")
21+
scanner.Scan()
22+
domain := scanner.Text()
23+
fmt.Printf("Enter domain type <unixpwd/nt>:")
24+
scanner.Scan()
25+
domainType := scanner.Text()
26+
fmt.Printf("Calling NetBackup Login\n")
27+
fmt.Printf("-----------------------\n")
28+
jwt := netbackup.Login(username, password, domain, domainType, server)
29+
fmt.Printf("-----------------------\n")
30+
fmt.Printf("Netbackup Jobs List using jwt\n")
31+
fmt.Printf("-----------------------\n")
32+
netbackup.JobList(jwt, server)
33+
fmt.Printf("-----------------------\n")
34+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package main
2+
import (
3+
"bufio"
4+
"fmt"
5+
"netbackup"
6+
"os"
7+
)
8+
func main() {
9+
fmt.Printf("Welcome to sample Go program to call NetBackup APIs\n")
10+
scanner := bufio.NewScanner(os.Stdin)
11+
fmt.Printf("Enter the server to connect: ")
12+
scanner.Scan()
13+
server := scanner.Text()
14+
fmt.Printf("Checking connectivity with NetBackup Server[%s]\n", server)
15+
fmt.Printf("-----------------------\n")
16+
fmt.Println(netbackup.Ping(server))
17+
fmt.Printf("-----------------------\n")
18+
fmt.Printf("Enter username for server:")
19+
scanner.Scan()
20+
username := scanner.Text()
21+
fmt.Printf("Enter password for server:")
22+
scanner.Scan()
23+
password := scanner.Text()
24+
fmt.Printf("Enter domain name for server:")
25+
scanner.Scan()
26+
domain := scanner.Text()
27+
fmt.Printf("Enter domain type <unixpwd/nt>:")
28+
scanner.Scan()
29+
domainType := scanner.Text()
30+
fmt.Printf("Calling NetBackup Login\n")
31+
fmt.Printf("-----------------------\n")
32+
jwt := netbackup.Login(username, password, domain, domainType, server)
33+
fmt.Printf("-----------------------\n")
34+
fmt.Printf("Mapping List using jwt\n")
35+
fmt.Printf("-----------------------\n")
36+
netbackup.MappingList(jwt, server)
37+
fmt.Printf("-----------------------\n")
38+
}

snippets/go/netbackup.go

Lines changed: 245 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,245 @@
1+
// Package netbackup provides functions for calling netbackup APIs and
2+
// get there response back in structured formata.
3+
package netbackup
4+
5+
import (
6+
"bytes"
7+
"crypto/tls"
8+
"encoding/json"
9+
"fmt"
10+
"io/ioutil"
11+
"net/http"
12+
"os"
13+
)
14+
15+
// NetBackup structure to directly call raw APIs
16+
// or some predefined APIs
17+
type NetBackup struct {
18+
jwt string
19+
baseURL string
20+
skipVerification bool
21+
}
22+
23+
// ----------------------------------------
24+
//
25+
// Raw functions to call APIs and their helper functions
26+
//
27+
// ----------------------------------------
28+
29+
// Get Raw function to call any GET APIs of NetBackup
30+
func Get(jwt string, url string) (jsonData map[string]interface{}, code int, err error) {
31+
32+
client := getHTTPClient()
33+
req, err := http.NewRequest("GET", url, nil)
34+
if jwt != "" {
35+
req.Header.Add("Authorization", jwt)
36+
}
37+
req.Header.Add("ContentType", "application/vnd.netbackup+json; version=1.0")
38+
39+
response, err := client.Do(req)
40+
if err == nil {
41+
code = response.StatusCode
42+
if code >= 200 && code <= 299 {
43+
data, _ := ioutil.ReadAll(response.Body)
44+
if err := json.Unmarshal(data, &jsonData); err != nil {
45+
panic(err)
46+
}
47+
}
48+
}
49+
defer response.Body.Close()
50+
return jsonData, response.StatusCode, err
51+
}
52+
53+
// Post Raw function to call any POST APIs of NetBackup
54+
func Post(jwt string, url string, reqValue []byte) (jsonData map[string]interface{}, code int, err error) {
55+
56+
client := getHTTPClient()
57+
req, err := http.NewRequest("POST", url, bytes.NewBuffer(reqValue))
58+
if jwt != "" {
59+
req.Header.Add("Authorization", jwt)
60+
}
61+
req.Header.Add("Content-Type", "application/vnd.netbackup+json; version=1.0")
62+
response, err := client.Do(req)
63+
64+
if err == nil {
65+
code = response.StatusCode
66+
if code >= 200 && code <= 299 {
67+
resData, _ := ioutil.ReadAll(response.Body)
68+
if err := json.Unmarshal(resData, &jsonData); err != nil {
69+
panic(err)
70+
}
71+
}
72+
}
73+
defer response.Body.Close()
74+
return jsonData, code, err
75+
}
76+
77+
// ----------------------------------------
78+
//
79+
// Some additional functions that you can directly call to
80+
// achieve some basic functionality.
81+
//
82+
// ----------------------------------------
83+
84+
// Ping function call the netbackup ping API. This can be used
85+
// to check the connectivity to Master server web services
86+
func Ping(server string) string {
87+
var data []byte
88+
url := GetBaseURLString(server) + "/ping"
89+
client := getHTTPClient()
90+
response, err := client.Get(url)
91+
if err != nil {
92+
fmt.Printf("Request Failed %s \n", err)
93+
} else {
94+
data, _ = ioutil.ReadAll(response.Body)
95+
return (string(data))
96+
}
97+
return (string(""))
98+
}
99+
100+
//Login function
101+
func Login(username string, password string, domain string, domainType string, server string) string {
102+
url := GetBaseURLString(server) + "/login"
103+
reqData := map[string]string{"userName": username, "password": password, "domainName": domain, "domainType": domainType}
104+
reqValue, _ := json.Marshal(reqData)
105+
106+
jsonData, code, err := Post("", url, reqValue)
107+
108+
if err != nil {
109+
fmt.Printf("Request Failed %s \n", err)
110+
} else {
111+
fmt.Println(code)
112+
if code != 201 {
113+
fmt.Printf("Wrong response %d \n", code)
114+
return ""
115+
}
116+
}
117+
fmt.Printf("Login succesful. got jwt[%s]", jsonData["token"].(string))
118+
return jsonData["token"].(string)
119+
}
120+
121+
// MappingList Returns list of mappings for the server in JSON format
122+
func MappingList(jwt string, server string) {
123+
url := GetBaseURLString(server) + "/config/hosts"
124+
125+
jsonData, code, err := Get(jwt, url)
126+
if err != nil {
127+
fmt.Printf("Request Failed %s \n", err)
128+
} else {
129+
if code != 200 {
130+
fmt.Printf("Request returned wrong code %d \n", code)
131+
return
132+
}
133+
}
134+
fmt.Println(jsonData)
135+
}
136+
137+
// ImagesList API Returns list of catalog images
138+
func ImagesList(jwt string, server string) {
139+
140+
url := GetBaseURLString(server) + "/catalog/images"
141+
142+
client := getHTTPClient()
143+
req, err := http.NewRequest("GET", url, nil)
144+
if jwt != "" {
145+
req.Header.Add("Authorization", jwt)
146+
}
147+
req.Header.Add("ContentType", "application/vnd.netbackup+json; version=1.0")
148+
149+
//Adding filters in query string
150+
q := req.URL.Query()
151+
q.Add("filter", "policyType eq 'Standard'")
152+
q.Add("page[limit]", "10")
153+
req.URL.RawQuery = q.Encode()
154+
155+
var jsonData map[string]interface{}
156+
157+
response, err := client.Do(req)
158+
if err == nil {
159+
if response.StatusCode >= 200 && response.StatusCode <= 299 {
160+
data, _ := ioutil.ReadAll(response.Body)
161+
if err := json.Unmarshal(data, &jsonData); err != nil {
162+
panic(err)
163+
}
164+
}
165+
}
166+
defer response.Body.Close()
167+
168+
if err != nil {
169+
fmt.Printf("Request Failed %s \n", err)
170+
} else {
171+
if response.StatusCode != 200 {
172+
fmt.Printf("Request returned wrong code %d \n", response.StatusCode)
173+
return
174+
}
175+
}
176+
177+
b, err := json.MarshalIndent(jsonData, "", " ")
178+
if err != nil {
179+
fmt.Println("error:", err)
180+
}
181+
os.Stdout.Write(b)
182+
}
183+
184+
// JobList API Returns list of backup jobs
185+
func JobList(jwt string, server string) {
186+
url := GetBaseURLString(server) + "/admin/jobs"
187+
188+
client := getHTTPClient()
189+
req, err := http.NewRequest("GET", url, nil)
190+
if jwt != "" {
191+
req.Header.Add("Authorization", jwt)
192+
}
193+
req.Header.Add("ContentType", "application/vnd.netbackup+json; version=1.0")
194+
195+
//Adding filters in query string
196+
q := req.URL.Query()
197+
q.Add("filter", "jobType eq 'BACKUP'")
198+
q.Add("page[limit]", "10")
199+
req.URL.RawQuery = q.Encode()
200+
201+
var jsonData map[string]interface{}
202+
203+
response, err := client.Do(req)
204+
if err == nil {
205+
if response.StatusCode >= 200 && response.StatusCode <= 299 {
206+
data, _ := ioutil.ReadAll(response.Body)
207+
if err := json.Unmarshal(data, &jsonData); err != nil {
208+
panic(err)
209+
}
210+
}
211+
}
212+
defer response.Body.Close()
213+
214+
if err != nil {
215+
fmt.Printf("Request Failed %s \n", err)
216+
} else {
217+
if response.StatusCode != 200 {
218+
fmt.Printf("Request returned wrong code %d \n", response.StatusCode)
219+
return
220+
}
221+
}
222+
223+
b, err := json.MarshalIndent(jsonData, "", " ")
224+
if err != nil {
225+
fmt.Println("error:", err)
226+
}
227+
os.Stdout.Write(b)
228+
}
229+
230+
// GetBaseURLString This returns the base URL for netbackup
231+
func GetBaseURLString(server string) string {
232+
return "https://" + server + ":1556/netbackup"
233+
}
234+
235+
func getContentType() string {
236+
return "application/vnd.netbackup+json; version=1.0"
237+
}
238+
239+
func getHTTPClient() http.Client {
240+
tr := &http.Transport{
241+
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
242+
}
243+
client := &http.Client{Transport: tr}
244+
return *client
245+
}

0 commit comments

Comments
 (0)