github.com/1and1/oneandone-cloudserver-sdk-go@v1.4.1/vpns.go (about) 1 package oneandone 2 3 import ( 4 "encoding/base64" 5 "io/ioutil" 6 "net/http" 7 ) 8 9 type VPN struct { 10 Identity 11 descField 12 typeField 13 CreationDate string `json:"creation_date,omitempty"` 14 State string `json:"state,omitempty"` 15 IPs []string `json:"ips,omitempty"` 16 Datacenter *Datacenter `json:"datacenter,omitempty"` 17 ApiPtr 18 } 19 20 type configZipFile struct { 21 Base64String string `json:"config_zip_file"` 22 } 23 24 // GET /vpns 25 func (api *API) ListVPNs(args ...interface{}) ([]VPN, error) { 26 url, err := processQueryParams(createUrl(api, vpnPathSegment), args...) 27 if err != nil { 28 return nil, err 29 } 30 result := []VPN{} 31 err = api.Client.Get(url, &result, http.StatusOK) 32 if err != nil { 33 return nil, err 34 } 35 for _, vpn := range result { 36 vpn.api = api 37 } 38 return result, nil 39 } 40 41 // POST /vpns 42 func (api *API) CreateVPN(name string, description string, datacenter_id string) (string, *VPN, error) { 43 res := new(VPN) 44 url := createUrl(api, vpnPathSegment) 45 req := struct { 46 Name string `json:"name"` 47 Description string `json:"description,omitempty"` 48 DatacenterId string `json:"datacenter_id,omitempty"` 49 }{Name: name, Description: description, DatacenterId: datacenter_id} 50 err := api.Client.Post(url, &req, &res, http.StatusAccepted) 51 if err != nil { 52 return "", nil, err 53 } 54 res.api = api 55 return res.Id, res, nil 56 } 57 58 // GET /vpns/{vpn_id} 59 func (api *API) GetVPN(vpn_id string) (*VPN, error) { 60 result := new(VPN) 61 url := createUrl(api, vpnPathSegment, vpn_id) 62 err := api.Client.Get(url, &result, http.StatusOK) 63 if err != nil { 64 return nil, err 65 } 66 result.api = api 67 return result, nil 68 } 69 70 // PUT /vpns/{vpn_id} 71 func (api *API) ModifyVPN(vpn_id string, name string, description string) (*VPN, error) { 72 result := new(VPN) 73 url := createUrl(api, vpnPathSegment, vpn_id) 74 req := struct { 75 Name string `json:"name,omitempty"` 76 Description string `json:"description,omitempty"` 77 }{Name: name, Description: description} 78 err := api.Client.Put(url, &req, &result, http.StatusOK) 79 if err != nil { 80 return nil, err 81 } 82 result.api = api 83 return result, nil 84 } 85 86 // DELETE /vpns/{vpn_id} 87 func (api *API) DeleteVPN(vpn_id string) (*VPN, error) { 88 result := new(VPN) 89 url := createUrl(api, vpnPathSegment, vpn_id) 90 err := api.Client.Delete(url, nil, &result, http.StatusAccepted) 91 if err != nil { 92 return nil, err 93 } 94 result.api = api 95 return result, nil 96 } 97 98 // GET /vpns/{vpn_id}/configuration_file 99 // Returns VPN configuration files (in a zip arhive) as a base64 encoded string 100 func (api *API) GetVPNConfigFile(filepath string, vpn_id string) (string, error) { 101 result := new(configZipFile) 102 url := createUrl(api, vpnPathSegment, vpn_id, "configuration_file") 103 err := api.Client.Get(url, &result, http.StatusOK) 104 if err != nil { 105 return "", err 106 } 107 filestring, err := base64.StdEncoding.DecodeString(result.Base64String) 108 d1 := []byte(filestring) 109 fileErr := ioutil.WriteFile(filepath+".zip", d1, 0644) 110 check(fileErr) 111 112 return result.Base64String, nil 113 } 114 115 func check(e error) { 116 if e != nil { 117 panic(e) 118 } 119 } 120 121 func (vpn *VPN) GetState() (string, error) { 122 in, err := vpn.api.GetVPN(vpn.Id) 123 if in == nil { 124 return "", err 125 } 126 return in.State, err 127 }