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
@@ -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