fog-kubevirt 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/lib/fog/kubevirt/compute/compute.rb +125 -37
  3. data/lib/fog/kubevirt/compute/models/networkattachmentdef.rb +25 -0
  4. data/lib/fog/kubevirt/compute/models/networkattachmentdefs.rb +59 -0
  5. data/lib/fog/kubevirt/compute/models/pvc.rb +59 -0
  6. data/lib/fog/kubevirt/compute/models/pvcs.rb +76 -0
  7. data/lib/fog/kubevirt/compute/models/server.rb +42 -0
  8. data/lib/fog/kubevirt/compute/models/servers.rb +32 -0
  9. data/lib/fog/kubevirt/compute/models/service.rb +36 -0
  10. data/lib/fog/kubevirt/compute/models/services.rb +83 -0
  11. data/lib/fog/kubevirt/compute/models/vm.rb +6 -60
  12. data/lib/fog/kubevirt/compute/models/vm_base.rb +75 -0
  13. data/lib/fog/kubevirt/compute/models/vm_data.rb +164 -0
  14. data/lib/fog/kubevirt/compute/models/vms.rb +59 -19
  15. data/lib/fog/kubevirt/compute/models/volume.rb +73 -0
  16. data/lib/fog/kubevirt/compute/models/volumes.rb +61 -0
  17. data/lib/fog/kubevirt/compute/requests/create_networkattachmentdef.rb +37 -0
  18. data/lib/fog/kubevirt/compute/requests/create_service.rb +18 -0
  19. data/lib/fog/kubevirt/compute/requests/create_vm.rb +2 -0
  20. data/lib/fog/kubevirt/compute/requests/create_volume.rb +19 -0
  21. data/lib/fog/kubevirt/compute/requests/delete_networkattachmentdef.rb +16 -0
  22. data/lib/fog/kubevirt/compute/requests/delete_pvc.rb +16 -0
  23. data/lib/fog/kubevirt/compute/requests/delete_service.rb +16 -0
  24. data/lib/fog/kubevirt/compute/requests/delete_volume.rb +16 -0
  25. data/lib/fog/kubevirt/compute/requests/get_networkattachmentdef.rb +19 -0
  26. data/lib/fog/kubevirt/compute/requests/get_pvc.rb +16 -0
  27. data/lib/fog/kubevirt/compute/requests/get_server.rb +32 -0
  28. data/lib/fog/kubevirt/compute/requests/get_service.rb +16 -0
  29. data/lib/fog/kubevirt/compute/requests/get_vm.rb +1 -1
  30. data/lib/fog/kubevirt/compute/requests/get_vminstance.rb +4 -4
  31. data/lib/fog/kubevirt/compute/requests/get_volume.rb +16 -0
  32. data/lib/fog/kubevirt/compute/requests/list_networkattachmentdefs.rb +21 -0
  33. data/lib/fog/kubevirt/compute/requests/list_pvcs.rb +22 -0
  34. data/lib/fog/kubevirt/compute/requests/list_servers.rb +25 -0
  35. data/lib/fog/kubevirt/compute/requests/list_services.rb +22 -0
  36. data/lib/fog/kubevirt/compute/requests/list_vms.rb +4 -4
  37. data/lib/fog/kubevirt/compute/requests/list_volumes.rb +22 -0
  38. data/lib/fog/kubevirt/version.rb +1 -1
  39. data/spec/compute_v1alpha2_spec.rb +30 -0
  40. data/spec/fixtures/kubevirt/networkattachmentdefinition/networkattachmentdefinitions_crud.yml +320 -0
  41. data/spec/fixtures/kubevirt/pvc/pvcs_crud.yml +316 -0
  42. data/spec/fixtures/kubevirt/service/services_crud.yml +316 -0
  43. data/spec/fixtures/kubevirt/volume/volumes_crud.yml +316 -0
  44. data/spec/network_attachment_definition_v1alpha2_spec.rb +28 -0
  45. data/spec/pvcs_v1alpha2_spec.rb +52 -0
  46. data/spec/shared_context.rb +53 -0
  47. data/spec/spec_helper.rb +10 -0
  48. data/spec/volumes_v1alpha2_spec.rb +45 -0
  49. metadata +87 -10
@@ -32,8 +32,22 @@ module Fog
32
32
  # :vm_name [String] - name of a vm
33
33
  # :cpus [String] - number of cpus
34
34
  # :memory_size [String] - amount of memory
35
- # :image [String] - name of a registry disk
35
+ # :image [String] - name of a container disk
36
36
  # :pvc [String] - name of a persistent volume claim
37
+ # :cloudinit [Hash] - number of items needed to configure cloud-init
38
+ # :networks[Array] - networks to which the vm should be connected, i.e:
39
+ # [ { :name => 'default', :pod => {} } ,
40
+ # { :name => 'ovs-red', :multus => { :networkName => 'red'} }
41
+ # ]
42
+ #
43
+ # :interfaces[Array] - network interfaces for the vm, correlated to
44
+ # :networks section by network's name, i.e.:
45
+ # [ { :name => 'default', :bridge => {} },
46
+ # { :name => 'red', # correlated to networks[networkName]
47
+ # :bridge => {},
48
+ # :bootOrder => 1, # 1 to boot from network interface
49
+ # :macAddress => '12:34:56:AB:CD:EF' }
50
+ # ]
37
51
  #
38
52
  # One of :image or :pvc needs to be provided.
39
53
  #
@@ -45,31 +59,27 @@ module Fog
45
59
  memory_size = args.fetch(:memory_size)
46
60
  image = args.fetch(:image, nil)
47
61
  pvc = args.fetch(:pvc, nil)
62
+ init = args.fetch(:cloudinit, {})
63
+ networks = args.fetch(:networks, nil)
64
+ interfaces = args.fetch(:interfaces, nil)
48
65
 
49
66
  if image.nil? && pvc.nil?
50
67
  raise ::Fog::Kubevirt::Errors::ValidationError
51
68
  end
52
-
53
- volume = {}
54
69
 
70
+ volumes = []
71
+ volume_name = vm_name.gsub(/[._]+/,'-') + "-disk-01"
55
72
  if !image.nil?
56
- volume = {
57
- :name => vm_name,
58
- :registryDisk => {
59
- :image => image
60
- }
61
- }
73
+ volumes.push(:name => volume_name, :containerDisk => {:image => image})
62
74
  else
63
- volume = {
64
- :name => vm_name,
65
- :persistentVolumeClaim => {
66
- :claimName => pvc
67
- }
68
- }
75
+ volumes.push(:name => volume_name, :persistentVolumeClaim => {:claimName => pvc})
76
+ end
77
+
78
+ unless init.empty?
79
+ volumes.push(:cloudInitNoCloud => init, :name => "cloudinitvolume")
69
80
  end
70
81
 
71
82
  vm = {
72
- :apiVersion => service.class::KUBEVIRT_VERSION_LABEL,
73
83
  :kind => "VirtualMachine",
74
84
  :metadata => {
75
85
  :labels => {
@@ -94,8 +104,7 @@ module Fog
94
104
  {:disk => {
95
105
  :bus => "virtio"
96
106
  },
97
- :name => vm_name,
98
- :volumeName => vm_name
107
+ :name => volume_name,
99
108
  }
100
109
  ]
101
110
  },
@@ -109,7 +118,7 @@ module Fog
109
118
  }
110
119
  },
111
120
  :terminationGracePeriodSeconds => 0,
112
- :volumes => [volume]
121
+ :volumes => volumes
113
122
  }
114
123
  }
115
124
  }
@@ -129,6 +138,37 @@ module Fog
129
138
  }
130
139
  ) unless cpus.nil?
131
140
 
141
+ vm[:spec][:template][:spec][:domain][:devices][:disks].push(
142
+ :disk => {
143
+ :bus => "virtio"
144
+ },
145
+ :name => "cloudinitvolume",
146
+ ) unless init.empty?
147
+
148
+ vm = deep_merge!(vm,
149
+ :spec => {
150
+ :template => {
151
+ :spec => {
152
+ :networks => networks
153
+ }
154
+ }
155
+ }
156
+ ) unless networks.nil?
157
+
158
+ vm = deep_merge!(vm,
159
+ :spec => {
160
+ :template => {
161
+ :spec => {
162
+ :domain => {
163
+ :devices => {
164
+ :interfaces => interfaces
165
+ }
166
+ }
167
+ }
168
+ }
169
+ }
170
+ ) unless interfaces.nil?
171
+
132
172
  service.create_vm(vm)
133
173
  end
134
174
  end
@@ -2,7 +2,80 @@ module Fog
2
2
  module Kubevirt
3
3
  class Compute
4
4
  class Volume < Fog::Model
5
+ identity :name
5
6
 
7
+ attribute :resource_version, :aliases => 'metadata_resource_version'
8
+ attribute :uid, :aliases => 'metadata_uid'
9
+ attribute :annotations, :aliases => 'metadata_annotations'
10
+ attribute :labels, :aliases => 'metadata_labels'
11
+ attribute :access_modes, :aliases => 'spec_access_modes'
12
+ attribute :mount_options, :aliases => 'spec_mount_options'
13
+ attribute :reclaim_policy, :aliases => 'spec_reclaim_policy'
14
+ attribute :storage_class, :aliases => 'spec_storage_class'
15
+ attribute :capacity, :aliases => 'spec_capacity'
16
+ attribute :claim_ref, :aliases => 'spec_claim_ref'
17
+ attribute :type, :aliases => 'spec_type'
18
+ attribute :config, :aliases => 'spec_config'
19
+ attribute :phase, :aliases => 'status_phase'
20
+ attribute :reason, :aliases => 'status_reason'
21
+ attribute :message, :aliases => 'status_message'
22
+
23
+ def self.parse(object)
24
+ metadata = object[:metadata]
25
+ spec = object[:spec]
26
+ status = object[:status]
27
+ type = detect_type(spec)
28
+
29
+ {
30
+ :name => metadata[:name],
31
+ :resource_version => metadata[:resourceVersion],
32
+ :uid => metadata[:uid],
33
+ :annotations => metadata[:annotations],
34
+ :labels => metadata[:labels],
35
+ :access_modes => spec[:accessModes],
36
+ :mount_options => spec[:mountOptions],
37
+ :reclaim_policy => spec[:persistentVolumeReclaimPolicy],
38
+ :storage_class => spec[:storageClassName],
39
+ :capacity => spec.dig(:capacity, :storage),
40
+ :claim_ref => spec[:claimRef],
41
+ :type => type,
42
+ :config => spec[type&.to_sym],
43
+ :phase => status[:phase],
44
+ :reason => status[:reason],
45
+ :message => status[:message]
46
+ }
47
+ end
48
+
49
+ def self.detect_type(spec)
50
+ type = ''
51
+ type = 'awsElasticBlockStore' if spec.keys.include?(:awsElasticBlockStore)
52
+ type = 'azureDisk' if spec.keys.include?(:azureDisk)
53
+ type = 'azureFile' if spec.keys.include?(:azureFile)
54
+ type = 'cephfs' if spec.keys.include?(:cephfs)
55
+ type = 'configMap' if spec.keys.include?(:configMap)
56
+ type = 'csi' if spec.keys.include?(:csi)
57
+ type = 'downwardAPI' if spec.keys.include?(:downwardAPI)
58
+ type = 'emptyDir' if spec.keys.include?(:emptyDir)
59
+ type = 'fc' if spec.keys.include?(:fc)
60
+ type = 'flexVolume' if spec.keys.include?(:flexVolume)
61
+ type = 'flocker' if spec.keys.include?(:flocker)
62
+ type = 'gcePersistentDisk' if spec.keys.include?(:gcePersistentDisk)
63
+ type = 'glusterfs' if spec.keys.include?(:glusterfs)
64
+ type = 'hostPath' if spec.keys.include?(:hostPath)
65
+ type = 'iscsi' if spec.keys.include?(:iscsi)
66
+ type = 'local' if spec.keys.include?(:local)
67
+ type = 'nfs' if spec.keys.include?(:nfs)
68
+ type = 'persistentVolumeClaim' if spec.keys.include?(:persistentVolumeClaim)
69
+ type = 'projected' if spec.keys.include?(:projected)
70
+ type = 'portworxVolume' if spec.keys.include?(:portworxVolume)
71
+ type = 'quobyte' if spec.keys.include?(:quobyte)
72
+ type = 'rbd' if spec.keys.include?(:rbd)
73
+ type = 'scaleIO' if spec.keys.include?(:scaleIO)
74
+ type = 'secret' if spec.keys.include?(:secret)
75
+ type = 'storageos' if spec.keys.include?(:storageos)
76
+ type = 'vsphereVolume' if spec.keys.include?(:vsphereVolume)
77
+ type
78
+ end
6
79
  end
7
80
  end
8
81
  end
@@ -5,7 +5,68 @@ module Fog
5
5
  module Kubevirt
6
6
  class Compute
7
7
  class Volumes < Fog::Collection
8
+ attr_reader :kind, :resource_version
9
+
8
10
  model Fog::Kubevirt::Compute::Volume
11
+
12
+ def all(filters = {})
13
+ volumes = service.list_volumes(filters)
14
+ @kind = volumes.kind
15
+ @resource_version = volumes.resource_version
16
+ load volumes
17
+ end
18
+
19
+ def get(name)
20
+ new service.get_volume(name)
21
+ end
22
+
23
+ # Creates a volume using provided paramters:
24
+ # :name [String] - name of a volume
25
+ # :labels [Hash] - a hash of key,values representing the labels
26
+ # :storage_class [String] - the storage class name of the volume
27
+ # :capacity [String] - The capacity of the storage if applied
28
+ # :accessModes [Arr] - the access modes for the volume, values are specified here:
29
+ # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes
30
+ # :type [String] - the type of the storage
31
+ # :config [Hash] - storage specific configuration to be applied for the volume
32
+ # correlated to the args[:type]
33
+ # @param [Hash] attributes containing details about volume to be created.
34
+ def create(args = {})
35
+ name = args[:name]
36
+ labels = args[:labels]
37
+
38
+ volume = {
39
+ :apiVersion => "v1",
40
+ :kind => "PersistentVolume",
41
+ :metadata => {
42
+ :name => name
43
+ },
44
+ :spec => {
45
+ :storageClassName => args[:storage_class]
46
+ }
47
+ }
48
+
49
+ volume[:metadata][:labels] = labels if labels
50
+ volume[:spec][:capacity] = {
51
+ :storage => args[:capacity]
52
+ } if args[:capacity]
53
+
54
+ volume[:spec][:accessModes] = args[:access_modes] if args[:access_modes]
55
+ volume[:spec][args[:type].to_sym] = args[:config] if args[:type]
56
+
57
+ service.create_volume(volume)
58
+ end
59
+
60
+ def delete(name)
61
+ begin
62
+ volume = get(name)
63
+ rescue ::Fog::Kubevirt::Errors::ClientError
64
+ # the volume doesn't exist
65
+ volume = nil
66
+ end
67
+
68
+ service.delete_volume(name) unless volume.nil?
69
+ end
9
70
  end
10
71
  end
11
72
  end
@@ -0,0 +1,37 @@
1
+ module Fog
2
+ module Kubevirt
3
+ class Compute
4
+ class Real
5
+ include Shared
6
+
7
+ # creates netwrork attachment definition object
8
+ # @param net_att[Hash] contains the following elements:
9
+ # metadata[Hash]: the net-attachment-def metadata:
10
+ # name[String]: the netwrork attachment definition definition
11
+ # spec[Hash]: the specification of the attachment, contains:config
12
+ # config[string]: the configuration of the attachment, i.e.
13
+ # '{ :cniVersion => "0.3.1", :type => "ovs", :bridge => "red" }'
14
+ # Example of net_att:
15
+ # metadata: {
16
+ # name: "ovs-red"},
17
+ # spec: {
18
+ # config: '{ cni_version: "0.3.1", type: "ovs", bridge: "red" }'
19
+ # }
20
+ def create_networkattachmentdef(net_att)
21
+ if net_att.dig(:metadata, :namespace).nil?
22
+ net_att = deep_merge!(net_att, metadata: { namespace: @namespace })
23
+ end
24
+ kube_net_client.create_network_attachment_definition(net_att)
25
+ rescue ::Fog::Kubevirt::Errors::ClientError => err
26
+ log.warn(err)
27
+ raise ::Fog::Kubevirt::Errors::AlreadyExistsError
28
+ end
29
+ end
30
+
31
+ class Mock
32
+ def create_networkattachmentdef(_net_att_def)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,18 @@
1
+ module Fog
2
+ module Kubevirt
3
+ class Compute
4
+ class Real
5
+ def create_service(srv)
6
+ kube_client.create_service(srv)
7
+ rescue ::Fog::Kubevirt::Errors::ClientError => err
8
+ log.warn(err)
9
+ raise ::Fog::Kubevirt::Errors::AlreadyExistsError
10
+ end
11
+ end
12
+
13
+ class Mock
14
+ def create_service(srv); end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -3,6 +3,8 @@ module Fog
3
3
  class Compute
4
4
  class Real
5
5
  def create_vm(vm)
6
+ vm[:apiVersion] = kubevirt_client.version
7
+
6
8
  kubevirt_client.create_virtual_machine(vm)
7
9
  rescue ::Fog::Kubevirt::Errors::ClientError => err
8
10
  log.warn(err)
@@ -0,0 +1,19 @@
1
+ module Fog
2
+ module Kubevirt
3
+ class Compute
4
+ class Real
5
+ def create_volume(volume)
6
+ kube_client.create_persistent_volume(volume)
7
+ rescue ::Fog::Kubevirt::Errors::ClientError => err
8
+ log.warn(err)
9
+ raise ::Fog::Kubevirt::Errors::AlreadyExistsError
10
+ end
11
+ end
12
+
13
+ class Mock
14
+ def create_volume(volume)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,16 @@
1
+ module Fog
2
+ module Kubevirt
3
+ class Compute
4
+ class Real
5
+ def delete_networkattachmentdef(name, namespace)
6
+ kube_net_client.delete_network_attachment_definition(name, namespace)
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def delete_networkattachmentdef(_name, _namespace)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Fog
2
+ module Kubevirt
3
+ class Compute
4
+ class Real
5
+ def delete_pvc(name)
6
+ kube_client.delete_persistent_volume_claim(name, namespace)
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def delete_pvc(name)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Fog
2
+ module Kubevirt
3
+ class Compute
4
+ class Real
5
+ def delete_service(name, namespace)
6
+ kube_client.delete_service(name, namespace)
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def delete_service(name)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Fog
2
+ module Kubevirt
3
+ class Compute
4
+ class Real
5
+ def delete_volume(name)
6
+ kube_client.delete_persistent_volume(name)
7
+ end
8
+ end
9
+
10
+ class Mock
11
+ def delete_volume(name)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ require 'recursive_open_struct'
2
+
3
+ module Fog
4
+ module Kubevirt
5
+ class Compute
6
+ class Real
7
+ def get_networkattachmentdef(name)
8
+ net_attach_def = kube_net_client.get_network_attachment_definition(name, @namespace)
9
+ Networkattachmentdef.parse object_to_hash(net_attach_def)
10
+ end
11
+ end
12
+
13
+ class Mock
14
+ def get_networkattachmentdef(name)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end