github.com/1and1/oneandone-cloudserver-sdk-go@v1.4.1/example/example.go (about)

     1  package main
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"time"
     7  
     8  	"github.com/1and1/oneandone-cloudserver-sdk-go"
     9  )
    10  
    11  func main() {
    12  	//Set an authentication token
    13  	token := oneandone.SetToken("82ee732b8d47e451be5c6ad5b7b56c81")
    14  	//Create an API client
    15  	api := oneandone.New(token, oneandone.BaseUrl)
    16  
    17  	// List server appliances
    18  	saps, err := api.ListServerAppliances()
    19  
    20  	//	printObject(saps)
    21  	//	time.Sleep(time.Second * 10)
    22  
    23  	var sa oneandone.ServerAppliance
    24  	for _, a := range saps {
    25  		if a.Type == "IMAGE" {
    26  			sa = a
    27  		}
    28  	}
    29  
    30  	// Create a server
    31  	req := oneandone.ServerRequest{
    32  		Name:        "Example Server",
    33  		Description: "Example server description.",
    34  		ApplianceId: sa.Id,
    35  		PowerOn:     true,
    36  		ServerType:  "cloud",
    37  		Hardware: oneandone.Hardware{
    38  			Vcores:            1,
    39  			CoresPerProcessor: 1,
    40  			Ram:               2,
    41  			Hdds: []oneandone.Hdd{
    42  				{
    43  					Size:   sa.MinHddSize,
    44  					IsMain: true,
    45  				},
    46  			},
    47  		},
    48  	}
    49  	server_id, server, err := api.CreateServer(&req)
    50  	if err == nil {
    51  		// Wait until server is created and powered on for at most 60 x 10 seconds
    52  		err = api.WaitForState(server, "POWERED_ON", 10, 60)
    53  	}
    54  
    55  	// Get a server
    56  	server, err = api.GetServer(server_id)
    57  
    58  	//	printObject(server)
    59  	//	time.Sleep(time.Second * 10)
    60  
    61  	// Create a load balancer
    62  	lbr := oneandone.LoadBalancerRequest{
    63  		Name:                "Load Balancer Example",
    64  		Description:         "API created load balancer.",
    65  		Method:              "ROUND_ROBIN",
    66  		Persistence:         oneandone.Bool2Pointer(true),
    67  		PersistenceTime:     oneandone.Int2Pointer(1200),
    68  		HealthCheckTest:     "TCP",
    69  		HealthCheckInterval: oneandone.Int2Pointer(40),
    70  		Rules: []oneandone.LoadBalancerRule{
    71  			{
    72  				Protocol:     "TCP",
    73  				PortBalancer: 80,
    74  				PortServer:   80,
    75  				Source:       "0.0.0.0",
    76  			},
    77  		},
    78  	}
    79  	var lb *oneandone.LoadBalancer
    80  	var lb_id string
    81  	lb_id, lb, err = api.CreateLoadBalancer(&lbr)
    82  	if err != nil {
    83  		api.WaitForState(lb, "ACTIVE", 10, 30)
    84  	}
    85  
    86  	// Get a load balancer
    87  	lb, err = api.GetLoadBalancer(lb.Id)
    88  
    89  	//	printObject(lb)
    90  	//	time.Sleep(time.Second * 10)
    91  
    92  	// Assign a load balancer to server's IP
    93  	server, err = api.AssignServerIpLoadBalancer(server.Id, server.Ips[0].Id, lb_id)
    94  
    95  	//	printObject(server)
    96  	//	time.Sleep(time.Second * 10)
    97  
    98  	// Create a firewall policy
    99  	fpr := oneandone.FirewallPolicyRequest{
   100  		Name:        "Firewall Policy Example",
   101  		Description: "API created firewall policy.",
   102  		Rules: []oneandone.FirewallPolicyRule{
   103  			{
   104  				Protocol: "TCP",
   105  				PortFrom: oneandone.Int2Pointer(80),
   106  				PortTo:   oneandone.Int2Pointer(80),
   107  			},
   108  		},
   109  	}
   110  	var fp *oneandone.FirewallPolicy
   111  	var fp_id string
   112  	fp_id, fp, err = api.CreateFirewallPolicy(&fpr)
   113  	if err == nil {
   114  		api.WaitForState(fp, "ACTIVE", 10, 30)
   115  	}
   116  
   117  	// Get a firewall policy
   118  	fp, err = api.GetFirewallPolicy(fp_id)
   119  
   120  	// Add servers IPs to a firewall policy.
   121  	ips := []string{server.Ips[0].Id}
   122  	fp, err = api.AddFirewallPolicyServerIps(fp.Id, ips)
   123  	if err == nil {
   124  		api.WaitForState(fp, "ACTIVE", 10, 60)
   125  	}
   126  
   127  	//	printObject(fp)
   128  	//	time.Sleep(time.Second * 10)
   129  
   130  	//Shutdown a server using 'SOFTWARE' method
   131  	server, err = api.ShutdownServer(server.Id, false)
   132  	if err != nil {
   133  		err = api.WaitForState(server, "POWERED_OFF", 5, 20)
   134  	}
   135  
   136  	//	printObject(server)
   137  	//	time.Sleep(time.Second * 10)
   138  
   139  	// Delete a load balancer
   140  	lb, err = api.DeleteLoadBalancer(lb.Id)
   141  	if err != nil {
   142  		err = api.WaitUntilDeleted(lb)
   143  	}
   144  
   145  	//	printObject(lb)
   146  	//	time.Sleep(time.Second * 10)
   147  
   148  	// Delete a firewall policy
   149  	fp, err = api.DeleteFirewallPolicy(fp.Id)
   150  	if err != nil {
   151  		err = api.WaitUntilDeleted(fp)
   152  	}
   153  
   154  	//	printObject(fp)
   155  	//	time.Sleep(time.Second * 10)
   156  
   157  	// List usages in last 24h
   158  	var usages *oneandone.Usages
   159  	usages, err = api.ListUsages("LAST_24H", nil, nil)
   160  
   161  	printObject(usages)
   162  	//	time.Sleep(time.Second * 10)
   163  
   164  	// List usages in last 5 hours
   165  	n := time.Now()
   166  	ed := time.Date(n.Year(), n.Month(), n.Day(), n.Hour(), n.Minute(), n.Second(), 0, time.UTC)
   167  	sd := ed.Add(-(time.Hour * 5))
   168  	usages, err = api.ListUsages("CUSTOM", &sd, &ed)
   169  
   170  	//	printObject(usages)
   171  	//	time.Sleep(time.Second * 10)
   172  
   173  	//Create a shared storage
   174  	ssr := oneandone.SharedStorageRequest{
   175  		Name:        "Shared Storage Example",
   176  		Description: "API alocated 100 GB disk.",
   177  		Size:        oneandone.Int2Pointer(100),
   178  	}
   179  	var ss *oneandone.SharedStorage
   180  	var ss_id string
   181  	ss_id, ss, err = api.CreateSharedStorage(&ssr)
   182  	if err != nil {
   183  		api.WaitForState(ss, "ACTIVE", 10, 30)
   184  	}
   185  
   186  	//	printObject(ss)
   187  	//	time.Sleep(time.Second * 10)
   188  
   189  	// List shared storages on page 1, 5 results per page and sort by 'name' field.
   190  	// Include only 'name', 'size' and 'minimum_size_allowed' fields in the result.
   191  	var shs []oneandone.SharedStorage
   192  	shs, err = api.ListSharedStorages(1, 5, "name", "", "name,size,minimum_size_allowed")
   193  
   194  	printObject(shs)
   195  	//	time.Sleep(time.Second * 10)
   196  
   197  	// List all shared storages that contain 'example' string
   198  	shs, err = api.ListSharedStorages(0, 0, "", "example", "")
   199  
   200  	//	printObject(shs)
   201  	//	time.Sleep(time.Second * 10)
   202  
   203  	// Delete a shared storage
   204  	ss, err = api.DeleteSharedStorage(ss_id)
   205  	if err == nil {
   206  		err = api.WaitUntilDeleted(ss)
   207  	}
   208  
   209  	//	printObject(ss)
   210  	//	time.Sleep(time.Second * 10)
   211  
   212  	// Delete a server
   213  	server, err = api.DeleteServer(server.Id, false)
   214  	if err == nil {
   215  		err = api.WaitUntilDeleted(server)
   216  	}
   217  
   218  	//	printObject(server)
   219  
   220  	//	The next example illustrates how to create a `TYPO3` application server
   221  	//  of a fixed size with an initial password and a firewall policy that has just been created.
   222  
   223  	// Create a new firewall policy
   224  	fpr = oneandone.FirewallPolicyRequest{
   225  		Name: "HTTPS Traffic Policy",
   226  		Rules: []oneandone.FirewallPolicyRule{
   227  			{
   228  				Protocol: "TCP",
   229  				PortFrom: oneandone.Int2Pointer(443),
   230  				PortTo:   oneandone.Int2Pointer(443),
   231  			},
   232  		},
   233  	}
   234  
   235  	_, fp, err = api.CreateFirewallPolicy(&fpr)
   236  	if fp != nil && err == nil {
   237  		api.WaitForState(fp, "ACTIVE", 5, 60)
   238  
   239  		// Look for the TYPO3 application appliance
   240  		saps, _ := api.ListServerAppliances(0, 0, "", "typo3", "")
   241  
   242  		var sa oneandone.ServerAppliance
   243  		for _, a := range saps {
   244  			if a.Type == "APPLICATION" {
   245  				sa = a
   246  				break
   247  			}
   248  		}
   249  
   250  		var fixed_flavours []oneandone.FixedInstanceInfo
   251  		var fixed_size_id string
   252  
   253  		fixed_flavours, err = api.ListFixedInstanceSizes()
   254  		for _, fl := range fixed_flavours {
   255  			//look for 'M' size
   256  			if fl.Name == "M" {
   257  				fixed_size_id = fl.Id
   258  				break
   259  			}
   260  		}
   261  
   262  		req := oneandone.ServerRequest{
   263  			Name:        "TYPO3 Server",
   264  			ApplianceId: sa.Id,
   265  			PowerOn:     true,
   266  			Password:    "ucr_kXW8,.2SdMU",
   267  			Hardware: oneandone.Hardware{
   268  				FixedInsSizeId: fixed_size_id,
   269  			},
   270  			FirewallPolicyId: fp.Id,
   271  		}
   272  		_, server, _ := api.CreateServer(&req)
   273  		if server != nil {
   274  			api.WaitForState(server, "POWERED_ON", 10, 90)
   275  		}
   276  	}
   277  }
   278  
   279  func printObject(in interface{}) {
   280  	bytes, _ := json.MarshalIndent(in, "", "    ")
   281  	fmt.Printf("%v\n", string(bytes))
   282  }