1
// Copyright 2012-2016 Canonical Ltd.
2
// Licensed under the LGPLv3, see LICENCE file for details.
5
This is an example on how the Go library gomaasapi can be used to interact with
7
Note that this is a provided only as an example and that real code should probably do something more sensible with errors than ignoring them or panicking.
16
"github.com/juju/gomaasapi"
24
fmt.Println("Warning: this will create a node on the MAAS server; it should be deleted at the end of the run but if something goes wrong, that test node might be left over. You've been warned.")
25
fmt.Print("Enter API key: ")
26
_, err := fmt.Scanf("%s", &apiKey)
30
fmt.Print("Enter API URL: ")
31
_, err = fmt.Scanf("%s", &apiURL)
36
fmt.Print("Enter API version: ")
37
_, err = fmt.Scanf("%s", &apiVersion)
43
func checkError(err error) {
52
// Create API server endpoint.
53
authClient, err := gomaasapi.NewAuthenticatedClient(apiURL, apiKey, apiVersion)
55
maas := gomaasapi.NewMAAS(*authClient)
61
fmt.Println("All done.")
64
// ManipulateFiles exercises the /api/1.0/files/ API endpoint. Most precisely,
65
// it uploads a files and then fetches it, making sure the received content
66
// is the same as the one that was sent.
67
func ManipulateFiles(maas *gomaasapi.MAASObject) {
68
files := maas.GetSubObject("files")
69
fileContent := []byte("test file content")
70
fileName := "filename"
71
filesToUpload := map[string][]byte{"file": fileContent}
74
fmt.Println("Uploading a file...")
75
_, err := files.CallPostFiles("add", url.Values{"filename": {fileName}}, filesToUpload)
77
fmt.Println("File sent.")
80
fmt.Println("Fetching the file...")
81
fileResult, err := files.CallGet("get", url.Values{"filename": {fileName}})
83
receivedFileContent, err := fileResult.GetBytes()
85
if bytes.Compare(receivedFileContent, fileContent) != 0 {
86
panic("Received content differs from the content sent!")
88
fmt.Println("Got file.")
90
// Fetch list of files.
91
listFiles, err := files.CallGet("list", url.Values{})
93
listFilesArray, err := listFiles.GetArray()
95
fmt.Printf("We've got %v file(s)\n", len(listFilesArray))
98
fmt.Println("Deleting the file...")
99
fileObject, err := listFilesArray[0].GetMAASObject()
101
errDelete := fileObject.Delete()
102
checkError(errDelete)
105
listFiles, err = files.CallGet("list", url.Values{})
107
listFilesArray, err = listFiles.GetArray()
109
fmt.Printf("We've got %v file(s)\n", len(listFilesArray))
112
// ManipulateFiles exercises the /api/1.0/nodes/ API endpoint. Most precisely,
113
// it lists the existing nodes, creates a new node, updates it and then
115
func ManipulateNodes(maas *gomaasapi.MAASObject) {
116
nodeListing := maas.GetSubObject("nodes")
119
fmt.Println("Fetching list of nodes...")
120
listNodeObjects, err := nodeListing.CallGet("list", url.Values{})
122
listNodes, err := listNodeObjects.GetArray()
124
fmt.Printf("Got list of %v nodes\n", len(listNodes))
125
for index, nodeObj := range listNodes {
126
node, err := nodeObj.GetMAASObject()
128
hostname, err := node.GetField("hostname")
130
fmt.Printf("Node #%d is named '%v' (%v)\n", index, hostname, node.URL())
134
fmt.Println("Creating a new node...")
135
params := url.Values{"architecture": {"i386/generic"}, "mac_addresses": {"AA:BB:CC:DD:EE:FF"}}
136
newNodeObj, err := nodeListing.CallPost("new", params)
138
newNode, err := newNodeObj.GetMAASObject()
140
newNodeName, err := newNode.GetField("hostname")
142
fmt.Printf("New node created: %s (%s)\n", newNodeName, newNode.URL())
144
// Update the new node.
145
fmt.Println("Updating the new node...")
146
updateParams := url.Values{"hostname": {"mynewname"}}
147
newNodeObj2, err := newNode.Update(updateParams)
149
newNodeName2, err := newNodeObj2.GetField("hostname")
151
fmt.Printf("New node updated, now named: %s\n", newNodeName2)
154
listNodeObjects2, err := nodeListing.CallGet("list", url.Values{})
156
listNodes2, err := listNodeObjects2.GetArray()
158
fmt.Printf("We've got %v nodes\n", len(listNodes2))
160
// Delete the new node.
161
fmt.Println("Deleting the new node...")
162
errDelete := newNode.Delete()
163
checkError(errDelete)
166
listNodeObjects3, err := nodeListing.CallGet("list", url.Values{})
168
listNodes3, err := listNodeObjects3.GetArray()
170
fmt.Printf("We've got %v nodes\n", len(listNodes3))