fog-kubevirt 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -0,0 +1,42 @@
1
+ require 'fog/compute/models/server'
2
+ require 'fog/kubevirt/compute/models/vm_base'
3
+
4
+ module Fog
5
+ module Kubevirt
6
+ class Compute
7
+ class Server < Fog::Compute::Server
8
+ include Shared
9
+ include VmAction
10
+ extend VmBase
11
+ define_properties
12
+
13
+ attribute :state, :aliases => 'phase'
14
+ attribute :ip_address
15
+ attribute :node_name
16
+
17
+ def destroy(options = {})
18
+ stop(options)
19
+ service.delete_vm(name, namespace)
20
+ end
21
+
22
+ def ready?
23
+ running?(status) && running?(state) && !ip_address.empty?
24
+ end
25
+
26
+ def self.parse(object)
27
+ server = parse_object(object)
28
+ server[:state] = object[:phase]
29
+ server[:node_name] = object[:node_name]
30
+ server[:ip_address] = object[:ip_address]
31
+ server
32
+ end
33
+
34
+ private
35
+
36
+ def running?(status)
37
+ !status.nil? && 'running'.casecmp(status).zero?
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,32 @@
1
+ require 'fog/core/collection'
2
+ require 'fog/kubevirt/compute/models/server'
3
+
4
+ module Fog
5
+ module Kubevirt
6
+ class Compute
7
+ class Servers < Fog::Collection
8
+ attr_reader :kind, :resource_version
9
+
10
+ model Fog::Kubevirt::Compute::Server
11
+
12
+ def all(filters = {})
13
+ servers = service.list_servers(filters)
14
+ @kind = servers.kind
15
+ @resource_version = servers.resource_version
16
+ load servers
17
+ end
18
+
19
+ def get(id)
20
+ new service.get_server(id)
21
+ end
22
+
23
+ def bootstrap(new_attributes = {})
24
+ server = create(new_attributes)
25
+ server.wait_for { stopped? }
26
+ server.start
27
+ server
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,36 @@
1
+ module Fog
2
+ module Kubevirt
3
+ class Compute
4
+ class Service < Fog::Model
5
+ identity :name
6
+
7
+ attribute :namespace, :aliases => 'metadata_namespace'
8
+ attribute :resource_version, :aliases => 'metadata_resource_version'
9
+ attribute :cluster_ip, :aliases => 'spec_cluster_ip'
10
+ attribute :node_port, :aliases => 'spec_ports_node_port'
11
+ attribute :port, :aliases => 'spec_ports_port'
12
+ attribute :target_port, :aliases => 'spec_ports_target_port'
13
+ attribute :selector, :aliases => 'spec_selector'
14
+
15
+ def self.parse(object)
16
+ metadata = object[:metadata]
17
+ spec = object[:spec]
18
+ ports = spec[:ports][0]
19
+ selector = spec[:selector]
20
+ srv = {
21
+ :namespace => metadata[:namespace],
22
+ :name => metadata[:name],
23
+ :resource_version => metadata[:resourceVersion],
24
+ :cluster_ip => spec[:clusterIP],
25
+ :node_port => ports[:nodePort],
26
+ :port => ports[:port],
27
+ :target_port => ports[:target_port],
28
+ }
29
+ srv[:selector] = selector[:special] unless selector.nil?
30
+
31
+ srv
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,83 @@
1
+ require 'fog/core/collection'
2
+ require 'fog/kubevirt/compute/models/service'
3
+
4
+ module Fog
5
+ module Kubevirt
6
+ class Compute
7
+ class Services < Fog::Collection
8
+ attr_reader :kind, :resource_version
9
+
10
+ model Fog::Kubevirt::Compute::Service
11
+
12
+ def all(filters = {})
13
+ begin
14
+ srvs = service.list_services(filters)
15
+ rescue ::Fog::Kubevirt::Errors::ClientError
16
+ # we assume that we get 404
17
+ srvs = []
18
+ end
19
+ @kind = srvs.kind
20
+ @resource_version = srvs.resource_version
21
+ load srvs
22
+ end
23
+
24
+ def get(name)
25
+ new service.get_service(name)
26
+ end
27
+
28
+ # Creates a service using provided paramters:
29
+ # :name [String] - name of a service
30
+ # :port [int] - a port which will be exposed on node and cluster
31
+ # :target_port [int] - a vmi port which will be forwarded
32
+ # :vmi_name [String] - name of a vmi to be selected
33
+ # :service_type [String] - service type used to create service
34
+ #
35
+ # @param [Hash] attributes containing details about service to be
36
+ # created.
37
+ def create(args = {})
38
+ port = args[:port]
39
+ name = args[:name]
40
+ target_port = args[:target_port]
41
+ vmi_name = args[:vmi_name]
42
+ service_type = args[:service_type]
43
+
44
+ srv = {
45
+ :apiVersion => "v1",
46
+ :kind => "Service",
47
+ :metadata => {
48
+ :name => name,
49
+ :namespace => service.namespace
50
+ },
51
+ :spec => {
52
+ :externalTrafficPolicy => "Cluster",
53
+ :ports => [
54
+ {:nodePort => port,
55
+ :port => port,
56
+ :protocol => "TCP",
57
+ :targetPort => target_port
58
+ }
59
+ ],
60
+ :selector => {
61
+ :"kubevirt.io/vm" => vmi_name
62
+ },
63
+ :type => service_type
64
+ }
65
+ }
66
+
67
+ service.create_service(srv)
68
+ end
69
+
70
+ def delete(name)
71
+ begin
72
+ srv = get(name)
73
+ rescue ::Fog::Kubevirt::Errors::ClientError
74
+ # the service doesn't exist
75
+ srv = nil
76
+ end
77
+
78
+ service.delete_service(name, service.namespace) unless srv.nil?
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -1,69 +1,15 @@
1
+ require 'fog/kubevirt/compute/models/vm_base'
2
+
1
3
  module Fog
2
4
  module Kubevirt
3
5
  class Compute
4
6
  class Vm < Fog::Model
5
- include Shared
6
-
7
- identity :name
8
-
9
- attribute :namespace, :aliases => 'metadata_namespace'
10
- attribute :resource_version, :aliases => 'metadata_resource_version'
11
- attribute :uid, :aliases => 'metadata_uid'
12
- attribute :labels, :aliases => 'metadata_labels'
13
- attribute :owner_reference, :aliases => 'metadata_owner_reference'
14
- attribute :annotations, :aliases => 'metadata_annotations'
15
- attribute :cpu_cores, :aliases => 'spec_cpu_cores'
16
- attribute :memory, :aliases => 'spec_memory'
17
- attribute :disks, :aliases => 'spec_disks'
18
- attribute :volumes, :aliases => 'spec_volumes'
19
- attribute :status, :aliases => 'spec_running'
20
-
21
-
22
- def start(options = {})
23
- # Change the `running` attribute to `true` so that the virtual machine controller will take it and
24
- # create the virtual machine instance.
25
- vm = service.get_raw_vm(name)
26
- vm = deep_merge!(vm,
27
- :spec => {
28
- :running => true
29
- }
30
- )
31
- service.update_vm(vm)
32
- end
33
-
34
- def stop(options = {})
35
- vm = service.get_raw_vm(name)
36
- vm = deep_merge!(vm,
37
- :spec => {
38
- :running => false
39
- }
40
- )
41
- service.update_vm(vm)
42
- end
7
+ include VmAction
8
+ extend VmBase
9
+ define_properties
43
10
 
44
11
  def self.parse(object)
45
- metadata = object[:metadata]
46
- spec = object[:spec][:template][:spec]
47
- domain = spec[:domain]
48
- owner = metadata[:ownerReferences]
49
- annotations = metadata[:annotations]
50
- cpu = domain[:cpu]
51
- vm = {
52
- :namespace => metadata[:namespace],
53
- :name => metadata[:name],
54
- :resource_version => metadata[:resourceVersion],
55
- :uid => metadata[:uid],
56
- :labels => metadata[:labels],
57
- :memory => domain[:resources][:requests][:memory],
58
- :disks => domain[:devices][:disks],
59
- :volumes => spec[:volumes],
60
- :status => object[:spec][:running].to_s == "true" ? "running" : "stopped"
61
- }
62
- vm[:owner_reference] = owner unless owner.nil?
63
- vm[:annotations] = annotations unless annotations.nil?
64
- vm[:cpu_cores] = cpu[:cores] unless cpu.nil?
65
-
66
- vm
12
+ parse_object(object)
67
13
  end
68
14
  end
69
15
  end
@@ -0,0 +1,75 @@
1
+ module Fog
2
+ module Kubevirt
3
+ class Compute
4
+ module VmBase
5
+ def define_properties
6
+ identity :name
7
+
8
+ attribute :namespace, :aliases => 'metadata_namespace'
9
+ attribute :resource_version, :aliases => 'metadata_resource_version'
10
+ attribute :uid, :aliases => 'metadata_uid'
11
+ attribute :labels, :aliases => 'metadata_labels'
12
+ attribute :owner_reference, :aliases => 'metadata_owner_reference'
13
+ attribute :annotations, :aliases => 'metadata_annotations'
14
+ attribute :cpu_cores, :aliases => 'spec_cpu_cores'
15
+ attribute :memory, :aliases => 'spec_memory'
16
+ attribute :disks, :aliases => 'spec_disks'
17
+ attribute :volumes, :aliases => 'spec_volumes'
18
+ attribute :status, :aliases => 'spec_running'
19
+ end
20
+
21
+ def parse_object(object)
22
+ metadata = object[:metadata]
23
+ spec = object[:spec][:template][:spec]
24
+ domain = spec[:domain]
25
+ owner = metadata[:ownerReferences]
26
+ annotations = metadata[:annotations]
27
+ cpu = domain[:cpu]
28
+ mem = domain.dig(:resources, :requests, :memory)
29
+ vm = {
30
+ :namespace => metadata[:namespace],
31
+ :name => metadata[:name],
32
+ :resource_version => metadata[:resourceVersion],
33
+ :uid => metadata[:uid],
34
+ :labels => metadata[:labels],
35
+ :disks => domain[:devices][:disks],
36
+ :volumes => spec[:volumes],
37
+ :status => object[:spec][:running].to_s == "true" ? "running" : "stopped",
38
+ }
39
+ vm[:owner_reference] = owner unless owner.nil?
40
+ vm[:annotations] = annotations unless annotations.nil?
41
+ vm[:cpu_cores] = cpu[:cores] unless cpu.nil?
42
+ vm[:memory] = mem unless mem.nil?
43
+
44
+ vm
45
+ end
46
+ end
47
+
48
+ module VmAction
49
+ include Shared
50
+
51
+ def start(options = {})
52
+ # Change the `running` attribute to `true` so that the virtual machine controller will take it and
53
+ # create the virtual machine instance.
54
+ vm = service.get_raw_vm(name)
55
+ vm = deep_merge!(vm,
56
+ :spec => {
57
+ :running => true
58
+ }
59
+ )
60
+ service.update_vm(vm)
61
+ end
62
+
63
+ def stop(options = {})
64
+ vm = service.get_raw_vm(name)
65
+ vm = deep_merge!(vm,
66
+ :spec => {
67
+ :running => false
68
+ }
69
+ )
70
+ service.update_vm(vm)
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,164 @@
1
+ module Fog
2
+ module Kubevirt
3
+ class Compute
4
+ module VmData
5
+
6
+ #
7
+ # Returns an array of parsed network interfaces
8
+ #
9
+ # @param object [Hash] A hash with raw interfaces data.
10
+ #
11
+ def parse_interfaces(object)
12
+ return {} if object.nil?
13
+ nics = []
14
+ object.each do |iface|
15
+ nic = VmNic.new
16
+ nic.name = iface[:name]
17
+ nic.mac_address = iface[:macAddress]
18
+ nic.type = 'bridge' if iface.keys.include?(:bridge)
19
+ nic.type = 'slirp' if iface.keys.include?(:slirp)
20
+ nics << nic
21
+ end
22
+
23
+ nics
24
+ end
25
+
26
+ #
27
+ # Returns an array of parsed networks
28
+ #
29
+ # @param object [Hash] A hash with raw networks data.
30
+ #
31
+ def parse_networks(object)
32
+ return {} if object.nil?
33
+ networks = []
34
+ object.each do |net|
35
+ network = VmNetwork.new
36
+ network.name = net[:name]
37
+ network.type = 'pod' if net.keys.include?(:pod)
38
+ network.type = 'multus' if net.keys.include?(:multus)
39
+ network.type = 'genie' if net.keys.include?(:genie)
40
+ networks << network
41
+ end
42
+
43
+ networks
44
+ end
45
+
46
+ #
47
+ # Returns an array of parsed disks
48
+ #
49
+ # @param object [Hash] A hash with raw disks data.
50
+ #
51
+ def parse_disks(object)
52
+ return {} if object.nil?
53
+ disks = []
54
+ object.each do |d|
55
+ disk = VmDisk.new
56
+ disk.name = d[:name]
57
+ disk.boot_order = d[:bootOrder]
58
+ disk.volume_name = d[:volumeName]
59
+
60
+ if d.keys.include?(:cdrom)
61
+ disk.type = 'cdrom'
62
+ disk.bus = d.dig(:cdrom, :bus)
63
+ disk.readonly = d.dig(:cdrom, :readonly)
64
+ elsif d.keys.include?(:disk)
65
+ disk.type = 'disk'
66
+ disk.bus = d.dig(:disk, :bus)
67
+ disk.readonly = d.dig(:disk, :readonly)
68
+ elsif d.keys.include?(:floppy)
69
+ disk.type = 'floppy'
70
+ disk.readonly = d.dig(:floppy, :readonly)
71
+ elsif d.keys.include?(:lun)
72
+ disk.type = 'lun'
73
+ disk.readonly = d.dig(:lun, :readonly)
74
+ end
75
+ disks << disk
76
+ end
77
+
78
+ disks
79
+ end
80
+
81
+ #
82
+ # Returns an array of parsed volumes
83
+ #
84
+ # @param object [Hash] A hash with raw volumes data.
85
+ #
86
+ def parse_volumes(object)
87
+ return {} if object.nil?
88
+ volumes = []
89
+ object.each do |v|
90
+ volume = VmVolume.new
91
+ volume.name = v[:name]
92
+ if v.keys.include?(:containerDisk)
93
+ volume.type = 'containerDisk'
94
+ volume.info = v.dig(:containerDisk, :image)
95
+ elsif v.keys.include?(:persistentVolumeClaim)
96
+ volume.type = 'persistentVolumeClaim'
97
+ volume.info = v.dig(:persistentVolumeClaim, :claimName)
98
+ elsif v.keys.include?(:emptyDisk)
99
+ volume.type = 'emptyDisk'
100
+ volume.info = v.dig(:emptyDisk, :capacity)
101
+ elsif v.keys.include?(:ephemeral)
102
+ volume.type = 'ephemeral'
103
+ volume.info = v.dig(:ephemeral, :persistentVolumeClaim, :claimName)
104
+ elsif v.keys.include?(:cloudInitNoCloud)
105
+ volume.type = 'cloudInitNoCloud'
106
+ volume.info = v.dig(:cloudInitNoCloud, :userDataBase64)
107
+ elsif v.keys.include?(:hostDisk)
108
+ volume.type = 'hostDisk'
109
+ volume.info = v.dig(:hostDisk, :path)
110
+ elsif v.keys.include?(:secret)
111
+ volume.type = 'secret'
112
+ volume.info = v.dig(:secret, :secretName)
113
+ elsif v.keys.include?(:dataVolume)
114
+ volume.type = 'dataVolume'
115
+ volume.info = v.dig(:dataVolume, :name)
116
+ elsif v.keys.include?(:serviceAccount)
117
+ volume.type = 'serviceAccount'
118
+ volume.info = v.dig(:serviceAccount, :serviceAccountName)
119
+ elsif v.keys.include?(:configMap)
120
+ volume.type = 'configMap'
121
+ volume.info = v.dig(:configMap, :name)
122
+ end
123
+ volumes << volume
124
+ end
125
+
126
+ volumes
127
+ end
128
+
129
+ class VmNic
130
+ attr_accessor :name,
131
+ :mac_address,
132
+ :type, # values: bridge, slirp
133
+ :model,
134
+ :ports,
135
+ :boot_order
136
+ alias :mac :mac_address
137
+ end
138
+
139
+ class VmNetwork
140
+ attr_accessor :name,
141
+ :type # values: multus, pod, genie
142
+ end
143
+
144
+ class VmDisk
145
+ attr_accessor :name,
146
+ :volume_name,
147
+ :boot_order,
148
+ :type, # values: cdrom, disk, floppy, lun
149
+ :bus,
150
+ :readonly
151
+ end
152
+
153
+ class VmVolume
154
+ attr_accessor :name,
155
+ # values: containerDisk, persistentVolumeClaim, emptyDisk,
156
+ # ephemeral, cloudInitNoCloud, hostDisk, secret,
157
+ # dataVolume, serviceAccount, configMap
158
+ :type,
159
+ :info # specific piece of information per volume type
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end