github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/provider/vsphere/fake_methods_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  // +build !gccgo
     5  
     6  package vsphere
     7  
     8  import (
     9  	"archive/tar"
    10  	"bytes"
    11  	"io/ioutil"
    12  	"net/http"
    13  
    14  	"github.com/juju/govmomi/vim25/methods"
    15  	"github.com/juju/govmomi/vim25/soap"
    16  	"github.com/juju/govmomi/vim25/types"
    17  	jc "github.com/juju/testing/checkers"
    18  	gc "gopkg.in/check.v1"
    19  )
    20  
    21  func (s *BaseSuite) FakeMetadataServer() {
    22  	s.ServeMux.HandleFunc("/streams/v1/index.json", func(w http.ResponseWriter, req *http.Request) {
    23  		w.Write([]byte(`{
    24   "index": {
    25    "com.ubuntu.cloud:released:download": {
    26     "datatype": "image-downloads", 
    27     "path": "streams/v1/com.ubuntu.cloud:released:download.json", 
    28     "updated": "Tue, 24 Feb 2015 10:16:54 +0000", 
    29     "products": [
    30      "com.ubuntu.cloud:server:14.04:amd64" 
    31     ], 
    32     "format": "products:1.0"
    33    }
    34   }, 
    35   "updated": "Tue, 24 Feb 2015 14:14:24 +0000", 
    36   "format": "index:1.0"
    37  }`))
    38  	})
    39  	s.ServeMux.HandleFunc("/streams/v1/com.ubuntu.cloud:released:download.json", func(w http.ResponseWriter, req *http.Request) {
    40  		w.Write([]byte(`{
    41   "updated": "Thu, 05 Mar 2015 12:14:40 +0000", 
    42   "license": "http://www.canonical.com/intellectual-property-policy", 
    43   "format": "products:1.0", 
    44   "datatype": "image-downloads", 
    45   "products": {
    46      "com.ubuntu.cloud:server:14.04:amd64": {
    47        "release": "trusty", 
    48        "version": "14.04", 
    49        "arch": "amd64", 
    50        "versions": {
    51          "20150305": {
    52            "items": {
    53              "ova": {
    54                "size": 7196, 
    55                "path": "server/releases/trusty/release-20150305/ubuntu-14.04-server-cloudimg-amd64.ova", 
    56                "ftype": "ova", 
    57                "sha256": "d6cade98b50e2e27f4508b01fea99d5b26a2f2a184c83e5fb597ca7b142ec01c", 
    58                "md5": "00662c59ca52558e7a3bb9a67d194730"
    59              }
    60            }      
    61          }
    62        }
    63      }
    64    }
    65  }`))
    66  	})
    67  	s.ServeMux.HandleFunc("/server/releases/trusty/release-20150305/ubuntu-14.04-server-cloudimg-amd64.ova", func(w http.ResponseWriter, req *http.Request) {
    68  		w.Write(s.createFakeOva())
    69  	})
    70  }
    71  
    72  func (s *BaseSuite) createFakeOva() []byte {
    73  	buf := new(bytes.Buffer)
    74  
    75  	tw := tar.NewWriter(buf)
    76  
    77  	var files = []struct {
    78  		Name, Body string
    79  	}{
    80  		{"ubuntu-14.04-server-cloudimg-amd64.ovf", "FakeOvfContent"},
    81  		{"ubuntu-14.04-server-cloudimg-amd64.vmdk", "FakeVmdkContent"},
    82  	}
    83  	for _, file := range files {
    84  		hdr := &tar.Header{
    85  			Name: file.Name,
    86  			Size: int64(len(file.Body)),
    87  		}
    88  		tw.WriteHeader(hdr)
    89  		tw.Write([]byte(file.Body))
    90  	}
    91  	tw.Close()
    92  	return buf.Bytes()
    93  
    94  }
    95  
    96  func (s *BaseSuite) FakeInstances(c *fakeClient, instName ...string) {
    97  	c.SetPropertyProxyHandler("FakeVmFolder", func(reqBody, resBody *methods.RetrievePropertiesBody) {
    98  		resBody.Res = &types.RetrievePropertiesResponse{
    99  			Returnval: []types.ObjectContent{},
   100  		}
   101  	})
   102  	c.SetPropertyProxyHandler("FakeVmFolder", func(reqBody, resBody *methods.RetrievePropertiesBody) {
   103  		resBody.Res = &types.RetrievePropertiesResponse{
   104  			Returnval: []types.ObjectContent{},
   105  		}
   106  	})
   107  }
   108  
   109  type InstRp struct {
   110  	Inst, Rp string
   111  }
   112  
   113  func (s *BaseSuite) FakeInstancesWithResourcePool(c *fakeClient, instances ...InstRp) {
   114  	retVal := []types.ObjectContent{}
   115  	for _, vm := range instances {
   116  		retVal = append(retVal, types.ObjectContent{
   117  			Obj: types.ManagedObjectReference{
   118  				Type:  "VirtualMachine",
   119  				Value: vm.Inst,
   120  			},
   121  			PropSet: []types.DynamicProperty{
   122  				{Name: "resourcePool", Val: types.ManagedObjectReference{
   123  					Type:  "ResourcePool",
   124  					Value: vm.Rp,
   125  				}},
   126  				{Name: "name", Val: vm.Inst},
   127  			},
   128  		})
   129  	}
   130  	c.SetPropertyProxyHandler("FakeVmFolder", func(reqBody, resBody *methods.RetrievePropertiesBody) {
   131  		resBody.Res = &types.RetrievePropertiesResponse{
   132  			Returnval: retVal,
   133  		}
   134  	})
   135  	c.SetPropertyProxyHandler("FakeVmFolder", func(reqBody, resBody *methods.RetrievePropertiesBody) {
   136  		resBody.Res = &types.RetrievePropertiesResponse{
   137  			Returnval: retVal,
   138  		}
   139  	})
   140  	results := []*types.RetrievePropertiesResponse{}
   141  	for _, vm := range instances {
   142  		results = append(results, &types.RetrievePropertiesResponse{
   143  			Returnval: []types.ObjectContent{{
   144  				Obj: types.ManagedObjectReference{
   145  					Type:  "VirtualMachine",
   146  					Value: vm.Inst,
   147  				},
   148  				PropSet: []types.DynamicProperty{
   149  					{Name: "resourcePool", Val: types.ManagedObjectReference{
   150  						Type:  "ResourcePool",
   151  						Value: vm.Rp,
   152  					}},
   153  					{Name: "name", Val: vm.Inst},
   154  				},
   155  			}},
   156  		})
   157  		c.SetPropertyProxyHandler(vm.Inst, func(reqBody, resBody *methods.RetrievePropertiesBody) {
   158  			for i, vm := range instances {
   159  				if vm.Inst == reqBody.Req.SpecSet[0].ObjectSet[0].Obj.Value {
   160  					resBody.Res = results[i]
   161  					return
   162  				}
   163  			}
   164  			panic("Match not found")
   165  		})
   166  	}
   167  }
   168  
   169  func (s *BaseSuite) FakeAvailabilityZones(c *fakeClient, zoneName ...string) {
   170  	c.SetPropertyProxyHandler("FakeDatacenter", RetrieveDatacenterProperties)
   171  	retVal := []types.ObjectContent{}
   172  	for _, zone := range zoneName {
   173  		retVal = append(retVal, types.ObjectContent{
   174  			Obj: types.ManagedObjectReference{
   175  				Type:  "ComputeResource",
   176  				Value: zone,
   177  			},
   178  			PropSet: []types.DynamicProperty{
   179  				{Name: "resourcePool", Val: types.ManagedObjectReference{
   180  					Type:  "ResourcePool",
   181  					Value: "FakeResourcePool",
   182  				}},
   183  				{Name: "datastore", Val: []types.ManagedObjectReference{{
   184  					Type:  "Datastore",
   185  					Value: "FakeDatastore",
   186  				}}},
   187  				{Name: "name", Val: zone},
   188  			},
   189  		})
   190  	}
   191  
   192  	c.SetPropertyProxyHandler("FakeHostFolder", func(reqBody, resBody *methods.RetrievePropertiesBody) {
   193  		resBody.Res = &types.RetrievePropertiesResponse{
   194  			Returnval: retVal,
   195  		}
   196  	})
   197  }
   198  
   199  type ZoneRp struct {
   200  	Zone, Rp string
   201  }
   202  
   203  func (s *BaseSuite) FakeAvailabilityZonesWithResourcePool(c *fakeClient, zones ...ZoneRp) {
   204  	c.SetPropertyProxyHandler("FakeDatacenter", RetrieveDatacenterProperties)
   205  	retVal := []types.ObjectContent{}
   206  	for _, zone := range zones {
   207  		retVal = append(retVal, types.ObjectContent{
   208  			Obj: types.ManagedObjectReference{
   209  				Type:  "ComputeResource",
   210  				Value: zone.Zone,
   211  			},
   212  			PropSet: []types.DynamicProperty{
   213  				{Name: "resourcePool", Val: types.ManagedObjectReference{
   214  					Type:  "ResourcePool",
   215  					Value: zone.Rp,
   216  				}},
   217  				{Name: "datastore", Val: []types.ManagedObjectReference{{
   218  					Type:  "Datastore",
   219  					Value: "FakeDatastore",
   220  				}}},
   221  				{Name: "name", Val: zone.Zone},
   222  			},
   223  		})
   224  	}
   225  
   226  	c.SetPropertyProxyHandler("FakeHostFolder", func(reqBody, resBody *methods.RetrievePropertiesBody) {
   227  		resBody.Res = &types.RetrievePropertiesResponse{
   228  			Returnval: retVal,
   229  		}
   230  	})
   231  }
   232  
   233  func (s *BaseSuite) FakeCreateInstance(c *fakeClient, serverURL string, checker *gc.C) {
   234  	s.FakeImportOvf(c, serverURL, checker)
   235  	powerOnTask := types.ManagedObjectReference{}
   236  	c.SetProxyHandler("PowerOnVM_Task", func(req, res soap.HasFault) {
   237  		resBody := res.(*methods.PowerOnVM_TaskBody)
   238  		resBody.Res = &types.PowerOnVM_TaskResponse{
   239  			Returnval: powerOnTask,
   240  		}
   241  	})
   242  	c.SetProxyHandler("CreatePropertyCollector", func(req, res soap.HasFault) {
   243  		resBody := res.(*methods.CreatePropertyCollectorBody)
   244  		resBody.Res = &types.CreatePropertyCollectorResponse{
   245  			Returnval: types.ManagedObjectReference{
   246  				Type:  "",
   247  				Value: "",
   248  			},
   249  		}
   250  	})
   251  	c.SetProxyHandler("CreateFilter", func(req, res soap.HasFault) {
   252  		resBody := res.(*methods.CreateFilterBody)
   253  		resBody.Res = &types.CreateFilterResponse{
   254  			Returnval: types.ManagedObjectReference{
   255  				Type:  "",
   256  				Value: "",
   257  			},
   258  		}
   259  	})
   260  	c.SetProxyHandler("WaitForUpdatesEx", func(req, res soap.HasFault) {
   261  		resBody := res.(*methods.WaitForUpdatesExBody)
   262  		resBody.Res = &types.WaitForUpdatesExResponse{
   263  			Returnval: &types.UpdateSet{
   264  				FilterSet: []types.PropertyFilterUpdate{
   265  					types.PropertyFilterUpdate{
   266  						ObjectSet: []types.ObjectUpdate{
   267  							types.ObjectUpdate{
   268  								Obj: powerOnTask,
   269  								ChangeSet: []types.PropertyChange{
   270  									types.PropertyChange{
   271  										Name: "info",
   272  										Op:   types.PropertyChangeOpAssign,
   273  										Val: types.TaskInfo{
   274  											Entity: &types.ManagedObjectReference{},
   275  											State:  types.TaskInfoStateSuccess,
   276  										},
   277  									},
   278  								},
   279  							},
   280  						},
   281  					},
   282  				},
   283  			},
   284  		}
   285  	})
   286  	c.SetProxyHandler("DestroyPropertyCollector", func(req, res soap.HasFault) {
   287  		resBody := res.(*methods.DestroyPropertyCollectorBody)
   288  		resBody.Res = &types.DestroyPropertyCollectorResponse{}
   289  	})
   290  	c.SetPropertyProxyHandler("", func(reqBody, resBody *methods.RetrievePropertiesBody) {
   291  		CommonRetrieveProperties(resBody, "VirtualMachine", "FakeWirtualMachine", "name", "vm1")
   292  	})
   293  }
   294  
   295  func (s *BaseSuite) FakeImportOvf(c *fakeClient, serverURL string, checker *gc.C) {
   296  	c.SetPropertyProxyHandler("FakeDatacenter", RetrieveDatacenterProperties)
   297  	c.SetProxyHandler("CreateImportSpec", func(req, res soap.HasFault) {
   298  		resBody := res.(*methods.CreateImportSpecBody)
   299  		resBody.Res = &types.CreateImportSpecResponse{
   300  			Returnval: types.OvfCreateImportSpecResult{
   301  				FileItem: []types.OvfFileItem{
   302  					types.OvfFileItem{
   303  						DeviceId: "key1",
   304  						Path:     "ubuntu-14.04-server-cloudimg-amd64.vmdk",
   305  					},
   306  				},
   307  				ImportSpec: &types.VirtualMachineImportSpec{},
   308  			},
   309  		}
   310  	})
   311  	lease := types.ManagedObjectReference{
   312  		Type:  "Lease",
   313  		Value: "FakeLease",
   314  	}
   315  	c.SetProxyHandler("ImportVApp", func(req, res soap.HasFault) {
   316  		resBody := res.(*methods.ImportVAppBody)
   317  		resBody.Res = &types.ImportVAppResponse{
   318  			Returnval: lease,
   319  		}
   320  	})
   321  	c.SetProxyHandler("CreatePropertyCollector", func(req, res soap.HasFault) {
   322  		resBody := res.(*methods.CreatePropertyCollectorBody)
   323  		resBody.Res = &types.CreatePropertyCollectorResponse{
   324  			Returnval: types.ManagedObjectReference{
   325  				Type:  "",
   326  				Value: "",
   327  			},
   328  		}
   329  	})
   330  	c.SetProxyHandler("CreateFilter", func(req, res soap.HasFault) {
   331  		resBody := res.(*methods.CreateFilterBody)
   332  		resBody.Res = &types.CreateFilterResponse{
   333  			Returnval: types.ManagedObjectReference{
   334  				Type:  "",
   335  				Value: "",
   336  			},
   337  		}
   338  	})
   339  	c.SetProxyHandler("WaitForUpdatesEx", func(req, res soap.HasFault) {
   340  		resBody := res.(*methods.WaitForUpdatesExBody)
   341  		resBody.Res = &types.WaitForUpdatesExResponse{
   342  			Returnval: &types.UpdateSet{
   343  				FilterSet: []types.PropertyFilterUpdate{
   344  					types.PropertyFilterUpdate{
   345  						ObjectSet: []types.ObjectUpdate{
   346  							types.ObjectUpdate{
   347  								Obj: lease,
   348  								ChangeSet: []types.PropertyChange{
   349  									types.PropertyChange{
   350  										Name: "info",
   351  										Val: types.HttpNfcLeaseInfo{
   352  											DeviceUrl: []types.HttpNfcLeaseDeviceUrl{
   353  												types.HttpNfcLeaseDeviceUrl{
   354  													ImportKey: "key1",
   355  													Url:       serverURL + "/disk-device/",
   356  												},
   357  											},
   358  										},
   359  									},
   360  									types.PropertyChange{
   361  										Name: "state",
   362  										Val:  types.HttpNfcLeaseStateReady,
   363  									},
   364  								},
   365  							},
   366  						},
   367  					},
   368  				},
   369  			},
   370  		}
   371  	})
   372  	s.ServeMux.HandleFunc("/disk-device/", func(w http.ResponseWriter, req *http.Request) {
   373  		r, err := ioutil.ReadAll(req.Body)
   374  		checker.Assert(err, jc.ErrorIsNil)
   375  		checker.Assert(string(r), gc.Equals, "FakeVmdkContent")
   376  	})
   377  	c.SetProxyHandler("DestroyPropertyCollector", func(req, res soap.HasFault) {
   378  		resBody := res.(*methods.DestroyPropertyCollectorBody)
   379  		resBody.Res = &types.DestroyPropertyCollectorResponse{}
   380  	})
   381  	c.SetProxyHandler("HttpNfcLeaseComplete", func(req, res soap.HasFault) {
   382  		resBody := res.(*methods.HttpNfcLeaseCompleteBody)
   383  		resBody.Res = &types.HttpNfcLeaseCompleteResponse{}
   384  	})
   385  }