/
create_blank_vhd.go
116 lines (94 loc) · 2.88 KB
/
create_blank_vhd.go
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
package main
import (
"fmt"
"log"
"os/exec"
"github.com/Azure/azure-sdk-for-go/storage"
docopt "github.com/docopt/docopt-go"
)
var isVerbose = false
func main() {
usage := `
Usage:
create_blank_vhd STORAGE_ACCOUNT_NAME STORAGE_ACCOUNT_KEY CONTAINER_NAME VHD_NAME [VHD_SIZE] [--verbose]
Arguments:
STORAGE_ACCOUNT_NAME Azure storage account name
STORAGE_ACCOUNT_KEY Azure storage account key
CONTAINER_NAME Name of blob container to store VHD
VHD_NAME Name of VHD to create. Must end in .vhd extension
Options:
-h --help Show this help message and exit
--vhd_size N Optional parameter denoting size in bytes of VHD (Default: 10G).
Suffixes "k" or "K" (kilobyte, 1024) "M" (megabyte, 1024k)
"G" (gigabyte, 1024M) and T (terabyte, 1024G) are supported.
--verbose Output logs (Default: false)
`
args, _ := docopt.Parse(usage, nil, true, "", false)
strgAccountName := args["STORAGE_ACCOUNT_NAME"].(string)
strgAccountKey := args["STORAGE_ACCOUNT_KEY"].(string)
containerName := args["CONTAINER_NAME"].(string)
vhdName := args["VHD_NAME"].(string)
vhdSize := args["VHD_SIZE"]
isVerbose = args["--verbose"].(bool)
if vhdSize == nil {
vhdSize = "10G"
}
var cmdName string
var cmdArgs []string
var err error
// Create raw disk
cmdName = "qemu-img"
cmdArgs = []string{"create", "-f", "raw", "image.raw", vhdSize.(string)}
if _, err = execCommand("Create raw disk", cmdName, cmdArgs); err != nil {
log.Fatal(err)
}
// Format disk as ext4
cmdName = "mkfs.ext4"
cmdArgs = []string{"-F", "./image.raw"}
if _, err = execCommand("Format disk", cmdName, cmdArgs); err != nil {
log.Fatal(err)
}
// Convert to vhd
cmdName = "qemu-img"
cmdArgs = []string{"convert", "-f", "raw", "-o", "subformat=fixed,force_size", "-O", "vpc", "image.raw", "image.vhd"}
if _, err = execCommand("Convert to vhd", cmdName, cmdArgs); err != nil {
log.Fatal(err)
}
// Upload
cmdName = "azure-vhd-utils"
cmdArgs = []string{
"upload",
"--localvhdpath=image.vhd",
"--stgaccountname=" + strgAccountName,
"--stgaccountkey=" + strgAccountKey,
"--containername=" + containerName,
"--blobname=" + vhdName,
}
if _, err = execCommand("Upload", cmdName, cmdArgs); err != nil {
log.Fatal(err)
}
// Get Blob Url
client, err := storage.NewBasicClient(strgAccountName, strgAccountKey)
if err != nil {
print(err)
log.Fatal(err)
}
url := client.GetBlobService().GetBlobURL(containerName, vhdName)
fmt.Print(url)
return
}
func execCommand(friendlyName string, cmdName string, cmdArgs []string) (string, error) {
print("--- " + friendlyName + " ---")
stdOut, err := exec.Command(cmdName, cmdArgs...).Output()
if err != nil {
print(err)
return "", err
}
print(string(stdOut))
return string(stdOut), nil
}
func print(message interface{}) {
if isVerbose {
fmt.Println(message)
}
}