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  }