This repository has been archived by the owner on Oct 25, 2022. It is now read-only.
/
digitalocean.go
124 lines (115 loc) · 2.59 KB
/
digitalocean.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
117
118
119
120
121
122
123
124
package digitalocean
import (
"encoding/json"
"fmt"
"io/ioutil"
"strconv"
"github.com/docker/machine/drivers/digitalocean"
"github.com/docker/machine/libmachine"
"github.com/gofn/gofn/iaas"
"github.com/gofrs/uuid"
)
// Provider definition, represents a concrete implementation of an iaas
type Provider struct {
iaas.Provider
}
type driverConfig struct {
Driver struct {
DropletID int `json:"DropletID"`
DropletName string `json:"DropletName"`
IPAddress string `json:"IPAddress"`
Image string `json:"Image"`
SSHKeyID int `json:"SSHKeyID"`
} `json:"Driver"`
}
func getConfig(machineDir, hostName string) (config *driverConfig, err error) {
configPath := fmt.Sprintf("%s/%s/config.json", machineDir, hostName)
raw, err := ioutil.ReadFile(configPath)
if err != nil {
return
}
err = json.Unmarshal(raw, &config)
if err != nil {
return
}
return
}
func New(token string, opts ...iaas.ProviderOpts) (p *Provider, err error) {
p = &Provider{}
for _, opt := range opts {
if err = opt(&p.Provider); err != nil {
p = nil
return
}
}
var uid uuid.UUID
uid, err = uuid.NewV4()
if err != nil {
p = nil
return
}
name := fmt.Sprintf("gofn-%s", uid.String())
if p.Name == "" {
p.Name = name
}
clientPath := "/tmp/" + p.Name
if p.ClientPath == "" {
p.ClientPath = clientPath
}
p.Client = libmachine.NewClient(p.ClientPath, p.ClientPath+"/certs")
driver := digitalocean.NewDriver(p.Name, clientPath)
driver.AccessToken = token
if p.ImageSlug != "" {
driver.Image = p.ImageSlug
}
if p.Region != "" {
driver.Region = p.Region
}
if p.Size != "" {
driver.Size = p.Size
}
if p.KeyID != 0 {
driver.SSHKeyID = p.KeyID
}
data, err := json.Marshal(driver)
if err != nil {
p = nil
return
}
p.Host, err = p.Client.NewHost(driver.DriverName(), data)
if err != nil {
p = nil
return
}
return
}
// CreateMachine on digitalocean
func (do *Provider) CreateMachine() (machine *iaas.Machine, err error) {
err = do.Client.Create(do.Host)
if err != nil {
return
}
config, err := getConfig(do.Client.GetMachinesDir(), do.Name)
if err != nil {
return
}
machine = &iaas.Machine{
ID: strconv.Itoa(config.Driver.DropletID),
IP: config.Driver.IPAddress,
Image: config.Driver.Image,
Kind: "digitalocean",
Name: config.Driver.DropletName,
SSHKeysID: []int{config.Driver.SSHKeyID},
CertsDir: do.ClientPath + "/certs",
}
return
}
// DeleteMachine Shutdown and Delete a droplet
func (do *Provider) DeleteMachine() (err error) {
err = do.Host.Driver.Remove()
defer do.Client.Close()
if err != nil {
return
}
return
}