opennebula 6.4.3 → 6.4.5
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.
- checksums.yaml +4 -4
- data/lib/DriverExecHelper.rb +1 -1
- data/lib/cloud/CloudClient.rb +1 -1
- data/lib/datastore.rb +3 -3
- data/lib/file_helper.rb +1 -1
- data/lib/host.rb +1 -1
- data/lib/models/role.rb +66 -66
- data/lib/models/service.rb +57 -57
- data/lib/nsx_constants.rb +1 -1
- data/lib/opennebula/flow/service_template.rb +21 -21
- data/lib/opennebula/marketplaceapp_ext.rb +3 -3
- data/lib/opennebula/ssh_auth.rb +102 -79
- data/lib/opennebula/template_ext.rb +2 -2
- data/lib/opennebula/virtual_machine_ext.rb +10 -11
- data/lib/opennebula.rb +1 -1
- data/lib/virtual_machine.rb +8 -2
- data/lib/virtual_wire.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 34ad5b5d6ddf88c8d92248d3c321d7e6891609fbc83776ef6d0a71ea6e634977
|
|
4
|
+
data.tar.gz: 2efb015748722ee63a336106a59b1306b0382049cdeb44ef86eee11a957f7379
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f3a43640e13e4a9e73e2b3efc8ae5da0793b50a56b8655a855e4b42820869515d602a7fd3ede1ace8f8996d64cbb78b82461c5f90466256498538d9f048e70c6
|
|
7
|
+
data.tar.gz: 54c3b592674fdca5ed5836aac7b32336fd4a1970dc2b816ad0236c622133559f136fc545b4be56a26f3fee847572c4f30970d5cd8ba44fdc92af0d4e53484403
|
data/lib/DriverExecHelper.rb
CHANGED
data/lib/cloud/CloudClient.rb
CHANGED
data/lib/datastore.rb
CHANGED
|
@@ -743,9 +743,9 @@ module VCenterDriver
|
|
|
743
743
|
image_path = ''
|
|
744
744
|
|
|
745
745
|
# Skip not relevant files
|
|
746
|
-
next unless
|
|
747
|
-
|
|
748
|
-
|
|
746
|
+
next unless ['FloppyImageFileInfo',
|
|
747
|
+
'IsoImageFileInfo',
|
|
748
|
+
'VmDiskFileInfo'].include? image.class.to_s
|
|
749
749
|
|
|
750
750
|
# Get image path and name
|
|
751
751
|
image_path << folderpath << image.path
|
data/lib/file_helper.rb
CHANGED
|
@@ -109,7 +109,7 @@ module VCenterDriver
|
|
|
109
109
|
def self.needs_unpack?(file_path)
|
|
110
110
|
type = get_type(file_path)
|
|
111
111
|
type.gsub!(%r{^application/(x-)?}, '')
|
|
112
|
-
|
|
112
|
+
['bzip2', 'gzip', 'tar'].include?(type)
|
|
113
113
|
end
|
|
114
114
|
|
|
115
115
|
def self.vcenter_file_info(file_path)
|
data/lib/host.rb
CHANGED
|
@@ -352,7 +352,7 @@ module VCenterDriver
|
|
|
352
352
|
str_info << 'USEDMEMORY=' << (total_mem - free_mem).to_s << "\n"
|
|
353
353
|
|
|
354
354
|
# DRS enabled
|
|
355
|
-
str_info << 'VCENTER_DRS='
|
|
355
|
+
str_info << 'VCENTER_DRS=' << drs_enabled.to_s << "\n"
|
|
356
356
|
|
|
357
357
|
# HA enabled
|
|
358
358
|
str_info << 'VCENTER_HA=' << ha_enabled.to_s << "\n"
|
data/lib/models/role.rb
CHANGED
|
@@ -32,26 +32,26 @@ module OpenNebula
|
|
|
32
32
|
attr_reader :service
|
|
33
33
|
|
|
34
34
|
# Actions that can be performed on the VMs of a given Role
|
|
35
|
-
SCHEDULE_ACTIONS =
|
|
36
|
-
terminate
|
|
37
|
-
terminate-hard
|
|
38
|
-
undeploy
|
|
39
|
-
undeploy-hard
|
|
40
|
-
hold
|
|
41
|
-
release
|
|
42
|
-
stop
|
|
43
|
-
suspend
|
|
44
|
-
resume
|
|
45
|
-
reboot
|
|
46
|
-
reboot-hard
|
|
47
|
-
poweroff
|
|
48
|
-
poweroff-hard
|
|
49
|
-
snapshot-create
|
|
50
|
-
snapshot-revert
|
|
51
|
-
snapshot-delete
|
|
52
|
-
disk-snapshot-create
|
|
53
|
-
disk-snapshot-revert
|
|
54
|
-
disk-snapshot-delete
|
|
35
|
+
SCHEDULE_ACTIONS = [
|
|
36
|
+
'terminate',
|
|
37
|
+
'terminate-hard',
|
|
38
|
+
'undeploy',
|
|
39
|
+
'undeploy-hard',
|
|
40
|
+
'hold',
|
|
41
|
+
'release',
|
|
42
|
+
'stop',
|
|
43
|
+
'suspend',
|
|
44
|
+
'resume',
|
|
45
|
+
'reboot',
|
|
46
|
+
'reboot-hard',
|
|
47
|
+
'poweroff',
|
|
48
|
+
'poweroff-hard',
|
|
49
|
+
'snapshot-create',
|
|
50
|
+
'snapshot-revert',
|
|
51
|
+
'snapshot-delete',
|
|
52
|
+
'disk-snapshot-create',
|
|
53
|
+
'disk-snapshot-revert',
|
|
54
|
+
'disk-snapshot-delete'
|
|
55
55
|
]
|
|
56
56
|
|
|
57
57
|
STATE = {
|
|
@@ -69,52 +69,52 @@ module OpenNebula
|
|
|
69
69
|
'HOLD' => 11
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
STATE_STR =
|
|
73
|
-
PENDING
|
|
74
|
-
DEPLOYING
|
|
75
|
-
RUNNING
|
|
76
|
-
UNDEPLOYING
|
|
77
|
-
WARNING
|
|
78
|
-
DONE
|
|
79
|
-
FAILED_UNDEPLOYING
|
|
80
|
-
FAILED_DEPLOYING
|
|
81
|
-
SCALING
|
|
82
|
-
FAILED_SCALING
|
|
83
|
-
COOLDOWN
|
|
84
|
-
HOLD
|
|
72
|
+
STATE_STR = [
|
|
73
|
+
'PENDING',
|
|
74
|
+
'DEPLOYING',
|
|
75
|
+
'RUNNING',
|
|
76
|
+
'UNDEPLOYING',
|
|
77
|
+
'WARNING',
|
|
78
|
+
'DONE',
|
|
79
|
+
'FAILED_UNDEPLOYING',
|
|
80
|
+
'FAILED_DEPLOYING',
|
|
81
|
+
'SCALING',
|
|
82
|
+
'FAILED_SCALING',
|
|
83
|
+
'COOLDOWN',
|
|
84
|
+
'HOLD'
|
|
85
85
|
]
|
|
86
86
|
|
|
87
|
-
RECOVER_DEPLOY_STATES =
|
|
88
|
-
FAILED_DEPLOYING
|
|
89
|
-
DEPLOYING
|
|
90
|
-
PENDING
|
|
87
|
+
RECOVER_DEPLOY_STATES = [
|
|
88
|
+
'FAILED_DEPLOYING',
|
|
89
|
+
'DEPLOYING',
|
|
90
|
+
'PENDING'
|
|
91
91
|
]
|
|
92
92
|
|
|
93
|
-
RECOVER_UNDEPLOY_STATES =
|
|
94
|
-
FAILED_UNDEPLOYING
|
|
95
|
-
UNDEPLOYING
|
|
93
|
+
RECOVER_UNDEPLOY_STATES = [
|
|
94
|
+
'FAILED_UNDEPLOYING',
|
|
95
|
+
'UNDEPLOYING'
|
|
96
96
|
]
|
|
97
97
|
|
|
98
|
-
RECOVER_SCALE_STATES =
|
|
99
|
-
FAILED_SCALING
|
|
100
|
-
SCALING
|
|
98
|
+
RECOVER_SCALE_STATES = [
|
|
99
|
+
'FAILED_SCALING',
|
|
100
|
+
'SCALING'
|
|
101
101
|
]
|
|
102
102
|
|
|
103
|
-
VM_FAILURE_STATES =
|
|
104
|
-
BOOT_FAILURE
|
|
105
|
-
BOOT_MIGRATE_FAILURE
|
|
106
|
-
PROLOG_MIGRATE_FAILURE
|
|
107
|
-
PROLOG_FAILURE
|
|
108
|
-
EPILOG_FAILURE
|
|
109
|
-
EPILOG_STOP_FAILURE
|
|
110
|
-
EPILOG_UNDEPLOY_FAILURE
|
|
111
|
-
PROLOG_MIGRATE_POWEROFF_FAILURE
|
|
112
|
-
PROLOG_MIGRATE_SUSPEND_FAILURE
|
|
113
|
-
PROLOG_MIGRATE_UNKNOWN_FAILURE
|
|
114
|
-
BOOT_UNDEPLOY_FAILURE
|
|
115
|
-
BOOT_STOPPED_FAILURE
|
|
116
|
-
PROLOG_RESUME_FAILURE
|
|
117
|
-
PROLOG_UNDEPLOY_FAILURE
|
|
103
|
+
VM_FAILURE_STATES = [
|
|
104
|
+
'BOOT_FAILURE',
|
|
105
|
+
'BOOT_MIGRATE_FAILURE',
|
|
106
|
+
'PROLOG_MIGRATE_FAILURE',
|
|
107
|
+
'PROLOG_FAILURE',
|
|
108
|
+
'EPILOG_FAILURE',
|
|
109
|
+
'EPILOG_STOP_FAILURE',
|
|
110
|
+
'EPILOG_UNDEPLOY_FAILURE',
|
|
111
|
+
'PROLOG_MIGRATE_POWEROFF_FAILURE',
|
|
112
|
+
'PROLOG_MIGRATE_SUSPEND_FAILURE',
|
|
113
|
+
'PROLOG_MIGRATE_UNKNOWN_FAILURE',
|
|
114
|
+
'BOOT_UNDEPLOY_FAILURE',
|
|
115
|
+
'BOOT_STOPPED_FAILURE',
|
|
116
|
+
'PROLOG_RESUME_FAILURE',
|
|
117
|
+
'PROLOG_UNDEPLOY_FAILURE'
|
|
118
118
|
]
|
|
119
119
|
|
|
120
120
|
SCALE_WAYS = {
|
|
@@ -129,17 +129,17 @@ module OpenNebula
|
|
|
129
129
|
# parents: this has only sense in deploy operation
|
|
130
130
|
# state: this is internal information managed by OneFlow server
|
|
131
131
|
# vm_template: this will affect scale operation
|
|
132
|
-
IMMUTABLE_ATTRS =
|
|
133
|
-
cardinality
|
|
134
|
-
last_vmname
|
|
135
|
-
nodes
|
|
136
|
-
parents
|
|
137
|
-
state
|
|
138
|
-
vm_template
|
|
132
|
+
IMMUTABLE_ATTRS = [
|
|
133
|
+
'cardinality',
|
|
134
|
+
'last_vmname',
|
|
135
|
+
'nodes',
|
|
136
|
+
'parents',
|
|
137
|
+
'state',
|
|
138
|
+
'vm_template'
|
|
139
139
|
]
|
|
140
140
|
|
|
141
141
|
# VM information to save in document
|
|
142
|
-
VM_INFO =
|
|
142
|
+
VM_INFO = ['ID', 'UID', 'GID', 'UNAME', 'GNAME', 'NAME']
|
|
143
143
|
|
|
144
144
|
LOG_COMP = 'ROL'
|
|
145
145
|
|
data/lib/models/service.rb
CHANGED
|
@@ -42,64 +42,64 @@ module OpenNebula
|
|
|
42
42
|
'HOLD' => 15
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
STATE_STR =
|
|
46
|
-
PENDING
|
|
47
|
-
DEPLOYING
|
|
48
|
-
RUNNING
|
|
49
|
-
UNDEPLOYING
|
|
50
|
-
WARNING
|
|
51
|
-
DONE
|
|
52
|
-
FAILED_UNDEPLOYING
|
|
53
|
-
FAILED_DEPLOYING
|
|
54
|
-
SCALING
|
|
55
|
-
FAILED_SCALING
|
|
56
|
-
COOLDOWN
|
|
57
|
-
DEPLOYING_NETS
|
|
58
|
-
UNDEPLOYING_NETS
|
|
59
|
-
FAILED_DEPLOYING_NETS
|
|
60
|
-
FAILED_UNDEPLOYING_NETS
|
|
61
|
-
HOLD
|
|
45
|
+
STATE_STR = [
|
|
46
|
+
'PENDING',
|
|
47
|
+
'DEPLOYING',
|
|
48
|
+
'RUNNING',
|
|
49
|
+
'UNDEPLOYING',
|
|
50
|
+
'WARNING',
|
|
51
|
+
'DONE',
|
|
52
|
+
'FAILED_UNDEPLOYING',
|
|
53
|
+
'FAILED_DEPLOYING',
|
|
54
|
+
'SCALING',
|
|
55
|
+
'FAILED_SCALING',
|
|
56
|
+
'COOLDOWN',
|
|
57
|
+
'DEPLOYING_NETS',
|
|
58
|
+
'UNDEPLOYING_NETS',
|
|
59
|
+
'FAILED_DEPLOYING_NETS',
|
|
60
|
+
'FAILED_UNDEPLOYING_NETS',
|
|
61
|
+
'HOLD'
|
|
62
62
|
]
|
|
63
63
|
|
|
64
|
-
TRANSIENT_STATES =
|
|
65
|
-
DEPLOYING
|
|
66
|
-
UNDEPLOYING
|
|
67
|
-
SCALING
|
|
68
|
-
COOLDOWN
|
|
69
|
-
DEPLOYING_NETS
|
|
70
|
-
UNDEPLOYING_NETS
|
|
64
|
+
TRANSIENT_STATES = [
|
|
65
|
+
'DEPLOYING',
|
|
66
|
+
'UNDEPLOYING',
|
|
67
|
+
'SCALING',
|
|
68
|
+
'COOLDOWN',
|
|
69
|
+
'DEPLOYING_NETS',
|
|
70
|
+
'UNDEPLOYING_NETS'
|
|
71
71
|
]
|
|
72
72
|
|
|
73
|
-
FAILED_STATES =
|
|
74
|
-
FAILED_DEPLOYING
|
|
75
|
-
FAILED_UNDEPLOYING
|
|
76
|
-
FAILED_SCALING
|
|
77
|
-
FAILED_DEPLOYING_NETS
|
|
78
|
-
FAILED_UNDEPLOYING_NETS
|
|
73
|
+
FAILED_STATES = [
|
|
74
|
+
'FAILED_DEPLOYING',
|
|
75
|
+
'FAILED_UNDEPLOYING',
|
|
76
|
+
'FAILED_SCALING',
|
|
77
|
+
'FAILED_DEPLOYING_NETS',
|
|
78
|
+
'FAILED_UNDEPLOYING_NETS'
|
|
79
79
|
]
|
|
80
80
|
|
|
81
|
-
RECOVER_DEPLOY_STATES =
|
|
82
|
-
FAILED_DEPLOYING
|
|
83
|
-
DEPLOYING
|
|
84
|
-
PENDING
|
|
81
|
+
RECOVER_DEPLOY_STATES = [
|
|
82
|
+
'FAILED_DEPLOYING',
|
|
83
|
+
'DEPLOYING',
|
|
84
|
+
'PENDING'
|
|
85
85
|
]
|
|
86
86
|
|
|
87
|
-
RECOVER_UNDEPLOY_STATES =
|
|
88
|
-
FAILED_UNDEPLOYING
|
|
89
|
-
UNDEPLOYING
|
|
90
|
-
FAILED_UNDEPLOYING_NETS
|
|
87
|
+
RECOVER_UNDEPLOY_STATES = [
|
|
88
|
+
'FAILED_UNDEPLOYING',
|
|
89
|
+
'UNDEPLOYING',
|
|
90
|
+
'FAILED_UNDEPLOYING_NETS'
|
|
91
91
|
]
|
|
92
92
|
|
|
93
|
-
RECOVER_SCALE_STATES =
|
|
94
|
-
FAILED_SCALING
|
|
95
|
-
SCALING
|
|
93
|
+
RECOVER_SCALE_STATES = [
|
|
94
|
+
'FAILED_SCALING',
|
|
95
|
+
'SCALING'
|
|
96
96
|
]
|
|
97
97
|
|
|
98
|
-
RECOVER_DEPLOY_NETS_STATES =
|
|
98
|
+
RECOVER_DEPLOY_NETS_STATES = ['DEPLOYING_NETS', 'FAILED_DEPLOYING_NETS']
|
|
99
99
|
|
|
100
|
-
RECOVER_UNDEPLOY_NETS_STATES =
|
|
101
|
-
UNDEPLOYING_NETS
|
|
102
|
-
FAILED_UNDEPLOYING_NETS
|
|
100
|
+
RECOVER_UNDEPLOY_NETS_STATES = [
|
|
101
|
+
'UNDEPLOYING_NETS',
|
|
102
|
+
'FAILED_UNDEPLOYING_NETS'
|
|
103
103
|
]
|
|
104
104
|
|
|
105
105
|
# List of attributes that can't be changed in update operation
|
|
@@ -114,17 +114,17 @@ module OpenNebula
|
|
|
114
114
|
# ready_status_gate: it only has sense when deploying, not in running
|
|
115
115
|
# state: this is internal information managed by OneFlow server
|
|
116
116
|
# start_time: this is internal information managed by OneFlow server
|
|
117
|
-
IMMUTABLE_ATTRS =
|
|
118
|
-
custom_attrs
|
|
119
|
-
custom_attrs_values
|
|
120
|
-
deployment
|
|
121
|
-
log
|
|
122
|
-
name
|
|
123
|
-
networks
|
|
124
|
-
networks_values
|
|
125
|
-
ready_status_gate
|
|
126
|
-
state
|
|
127
|
-
start_time
|
|
117
|
+
IMMUTABLE_ATTRS = [
|
|
118
|
+
'custom_attrs',
|
|
119
|
+
'custom_attrs_values',
|
|
120
|
+
'deployment',
|
|
121
|
+
'log',
|
|
122
|
+
'name',
|
|
123
|
+
'networks',
|
|
124
|
+
'networks_values',
|
|
125
|
+
'ready_status_gate',
|
|
126
|
+
'state',
|
|
127
|
+
'start_time'
|
|
128
128
|
]
|
|
129
129
|
|
|
130
130
|
LOG_COMP = 'SER'
|
|
@@ -677,7 +677,7 @@ module OpenNebula
|
|
|
677
677
|
vnet.each do |_, net|
|
|
678
678
|
key = net.keys.first
|
|
679
679
|
|
|
680
|
-
next unless
|
|
680
|
+
next unless ['template_id', 'reserve_from'].include?(key)
|
|
681
681
|
|
|
682
682
|
rc = OpenNebula::VirtualNetwork.new_with_id(
|
|
683
683
|
net['id'],
|
data/lib/nsx_constants.rb
CHANGED
|
@@ -50,11 +50,11 @@ module OpenNebula
|
|
|
50
50
|
},
|
|
51
51
|
'shutdown_action' => {
|
|
52
52
|
:type => :string,
|
|
53
|
-
:enum =>
|
|
54
|
-
terminate
|
|
55
|
-
terminate-hard
|
|
56
|
-
shutdown
|
|
57
|
-
shutdown-hard
|
|
53
|
+
:enum => [
|
|
54
|
+
'terminate',
|
|
55
|
+
'terminate-hard',
|
|
56
|
+
'shutdown',
|
|
57
|
+
'shutdown-hard'
|
|
58
58
|
],
|
|
59
59
|
:required => false
|
|
60
60
|
},
|
|
@@ -84,10 +84,10 @@ module OpenNebula
|
|
|
84
84
|
:properties => {
|
|
85
85
|
'type' => {
|
|
86
86
|
:type => :string,
|
|
87
|
-
:enum =>
|
|
88
|
-
CHANGE
|
|
89
|
-
CARDINALITY
|
|
90
|
-
PERCENTAGE_CHANGE
|
|
87
|
+
:enum => [
|
|
88
|
+
'CHANGE',
|
|
89
|
+
'CARDINALITY',
|
|
90
|
+
'PERCENTAGE_CHANGE'
|
|
91
91
|
],
|
|
92
92
|
:required => true
|
|
93
93
|
},
|
|
@@ -133,10 +133,10 @@ module OpenNebula
|
|
|
133
133
|
:properties => {
|
|
134
134
|
'type' => {
|
|
135
135
|
:type => :string,
|
|
136
|
-
:enum =>
|
|
137
|
-
CHANGE
|
|
138
|
-
CARDINALITY
|
|
139
|
-
PERCENTAGE_CHANGE
|
|
136
|
+
:enum => [
|
|
137
|
+
'CHANGE',
|
|
138
|
+
'CARDINALITY',
|
|
139
|
+
'PERCENTAGE_CHANGE'
|
|
140
140
|
],
|
|
141
141
|
:required => true
|
|
142
142
|
},
|
|
@@ -172,7 +172,7 @@ module OpenNebula
|
|
|
172
172
|
},
|
|
173
173
|
'deployment' => {
|
|
174
174
|
:type => :string,
|
|
175
|
-
:enum =>
|
|
175
|
+
:enum => ['none', 'straight'],
|
|
176
176
|
:default => 'none'
|
|
177
177
|
},
|
|
178
178
|
'description' => {
|
|
@@ -181,11 +181,11 @@ module OpenNebula
|
|
|
181
181
|
},
|
|
182
182
|
'shutdown_action' => {
|
|
183
183
|
:type => :string,
|
|
184
|
-
:enum =>
|
|
185
|
-
terminate
|
|
186
|
-
terminate-hard
|
|
187
|
-
shutdown
|
|
188
|
-
shutdown-hard
|
|
184
|
+
:enum => [
|
|
185
|
+
'terminate',
|
|
186
|
+
'terminate-hard',
|
|
187
|
+
'shutdown',
|
|
188
|
+
'shutdown-hard'
|
|
189
189
|
],
|
|
190
190
|
:required => false
|
|
191
191
|
},
|
|
@@ -235,8 +235,8 @@ module OpenNebula
|
|
|
235
235
|
# List of attributes that can't be changed in update operation
|
|
236
236
|
#
|
|
237
237
|
# registration_time: this is internal info managed by OneFlow server
|
|
238
|
-
IMMUTABLE_ATTRS =
|
|
239
|
-
registration_time
|
|
238
|
+
IMMUTABLE_ATTRS = [
|
|
239
|
+
'registration_time'
|
|
240
240
|
]
|
|
241
241
|
|
|
242
242
|
def self.init_default_vn_name_template(vn_name_template)
|
|
@@ -314,9 +314,9 @@ module OpenNebula::MarketPlaceAppExt
|
|
|
314
314
|
# @param image [OpenNebula::Image] Image information
|
|
315
315
|
def create_vcenter_template(ds, options, template, image = nil)
|
|
316
316
|
ret = {}
|
|
317
|
-
keys =
|
|
318
|
-
|
|
319
|
-
|
|
317
|
+
keys = ['VCENTER_TEMPLATE_REF',
|
|
318
|
+
'VCENTER_CCR_REF',
|
|
319
|
+
'VCENTER_INSTANCE_ID']
|
|
320
320
|
|
|
321
321
|
if ds['//VCENTER_TEMPLATE_REF']
|
|
322
322
|
keys.each do |key|
|
data/lib/opennebula/ssh_auth.rb
CHANGED
|
@@ -14,104 +14,127 @@
|
|
|
14
14
|
# limitations under the License. #
|
|
15
15
|
#--------------------------------------------------------------------------- #
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
require 'pp'
|
|
19
17
|
require 'openssl'
|
|
20
18
|
require 'base64'
|
|
21
19
|
require 'fileutils'
|
|
20
|
+
require 'open3'
|
|
21
|
+
require 'tempfile'
|
|
22
|
+
|
|
23
|
+
module OpenNebula
|
|
24
|
+
|
|
25
|
+
# SSH key authentication class. It can be used as a driver for auth_mad
|
|
26
|
+
# as auth method is defined. It also holds some helper methods to be used
|
|
27
|
+
# by oneauth command
|
|
28
|
+
class SshAuth
|
|
29
|
+
|
|
30
|
+
# Initialize SshAuth object
|
|
31
|
+
#
|
|
32
|
+
# @param [Hash] default options for path
|
|
33
|
+
# @option options [String] :public_key public key for the user
|
|
34
|
+
# @option options [String] :private_key key private key for the user.
|
|
35
|
+
def initialize(options = {})
|
|
36
|
+
@private_key = nil
|
|
37
|
+
@public_key = nil
|
|
38
|
+
|
|
39
|
+
# Initialize the private key
|
|
40
|
+
if options[:private_key]
|
|
41
|
+
begin
|
|
42
|
+
@private_key = File.read(options[:private_key])
|
|
43
|
+
rescue StandardError => e
|
|
44
|
+
raise "Cannot read #{options[:private_key]}\n #{e}"
|
|
45
|
+
end
|
|
22
46
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
raise
|
|
47
|
+
begin
|
|
48
|
+
@private_key_rsa = OpenSSL::PKey::RSA.new(@private_key)
|
|
49
|
+
rescue OpenSSL::PKey::RSAError
|
|
50
|
+
private_key_pem = openssh_to_pem(@private_key)
|
|
51
|
+
@private_key_rsa = OpenSSL::PKey::RSA.new(private_key_pem)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Initialize the public key
|
|
56
|
+
if options[:public_key]
|
|
57
|
+
@public_key = options[:public_key]
|
|
58
|
+
elsif !@private_key.nil?
|
|
59
|
+
# Init ssh keys using private key. public key is extracted in a
|
|
60
|
+
# format compatible with openssl. The public key does not contain
|
|
61
|
+
# "---- BEGIN/END PUBLIC KEY ----" and is in a single line
|
|
62
|
+
@public_key = @private_key_rsa.public_key.to_pem.split("\n")
|
|
63
|
+
@public_key = @public_key.reject {|l| l.match(/PUBLIC KEY/) }.join('')
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
if @private_key.nil? && @public_key.nil?
|
|
67
|
+
raise 'You have to define at least one of the keys'
|
|
44
68
|
end
|
|
45
69
|
|
|
46
|
-
@
|
|
70
|
+
@public_key_rsa = OpenSSL::PKey::RSA.new(Base64.decode64(@public_key))
|
|
47
71
|
end
|
|
48
72
|
|
|
49
|
-
#
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
@public_key = @private_key_rsa.public_key.to_pem.split("\n")
|
|
57
|
-
@public_key = @public_key.reject {|l| l.match(/PUBLIC KEY/) }.join('')
|
|
73
|
+
# Creates a login token for ssh authentication.
|
|
74
|
+
# By default it is valid for 1 hour but it can be changed to any number
|
|
75
|
+
# of seconds with expire parameter (in seconds)
|
|
76
|
+
def login_token(user, expire = 3600)
|
|
77
|
+
expire ||= 3600
|
|
78
|
+
|
|
79
|
+
return encrypt("#{user}:#{Time.now.to_i + expire.to_i}")
|
|
58
80
|
end
|
|
59
81
|
|
|
60
|
-
|
|
61
|
-
|
|
82
|
+
# Returns a valid password string to create a user using this auth driver.
|
|
83
|
+
# In this case the ssh public key.
|
|
84
|
+
def password
|
|
85
|
+
@public_key
|
|
62
86
|
end
|
|
63
87
|
|
|
64
|
-
|
|
65
|
-
|
|
88
|
+
# Checks the proxy created with the login method
|
|
89
|
+
def authenticate(user, token)
|
|
90
|
+
begin
|
|
91
|
+
token_plain = decrypt(token)
|
|
92
|
+
t_user, time = token_plain.split(':')
|
|
66
93
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
# of seconds with expire parameter (in seconds)
|
|
70
|
-
def login_token(user, expire=3600)
|
|
71
|
-
expire ||= 3600
|
|
94
|
+
return 'invalid credentials' unless user == t_user
|
|
95
|
+
return 'ssh proxy expired, login again to renew it' if Time.now.to_i >= time.to_i
|
|
72
96
|
|
|
73
|
-
|
|
74
|
-
|
|
97
|
+
return true
|
|
98
|
+
rescue StandardError
|
|
99
|
+
return 'error'
|
|
100
|
+
end
|
|
101
|
+
end
|
|
75
102
|
|
|
76
|
-
|
|
77
|
-
# In this case the ssh public key.
|
|
78
|
-
def password
|
|
79
|
-
@public_key
|
|
80
|
-
end
|
|
103
|
+
private
|
|
81
104
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
105
|
+
def openssh_to_pem(private_key)
|
|
106
|
+
temp_file = Tempfile.new('private_key')
|
|
107
|
+
|
|
108
|
+
File.write(temp_file.path, private_key)
|
|
109
|
+
|
|
110
|
+
# Use ssh-keygen to convert the key
|
|
111
|
+
command = "ssh-keygen -p -N '' -m PEM -f #{temp_file.path}"
|
|
112
|
+
|
|
113
|
+
_out, err, status = Open3.capture3(command)
|
|
114
|
+
|
|
115
|
+
raise "Failed to convert key: #{err}" unless status.success?
|
|
116
|
+
|
|
117
|
+
pem_key = File.read(temp_file.path)
|
|
118
|
+
return pem_key
|
|
119
|
+
ensure
|
|
120
|
+
temp_file.close
|
|
121
|
+
temp_file.unlink if temp_file
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
###########################################################################
|
|
125
|
+
# Methods to handle ssh keys
|
|
126
|
+
###########################################################################
|
|
127
|
+
# Encrypts data with the private key of the user and returns
|
|
128
|
+
# base 64 encoded output in a single line
|
|
129
|
+
def encrypt(data)
|
|
130
|
+
Base64.encode64(@private_key_rsa.private_encrypt(data)).gsub!("\n", '').strip
|
|
99
131
|
end
|
|
100
|
-
end
|
|
101
132
|
|
|
102
|
-
|
|
133
|
+
# Decrypts base 64 encoded data with pub_key (public key)
|
|
134
|
+
def decrypt(data)
|
|
135
|
+
@public_key_rsa.public_decrypt(Base64.decode64(data))
|
|
136
|
+
end
|
|
103
137
|
|
|
104
|
-
###########################################################################
|
|
105
|
-
# Methods to handle ssh keys
|
|
106
|
-
###########################################################################
|
|
107
|
-
# Encrypts data with the private key of the user and returns
|
|
108
|
-
# base 64 encoded output in a single line
|
|
109
|
-
def encrypt(data)
|
|
110
|
-
Base64::encode64(@private_key_rsa.private_encrypt(data)).gsub!(/\n/, '').strip
|
|
111
138
|
end
|
|
112
139
|
|
|
113
|
-
# Decrypts base 64 encoded data with pub_key (public key)
|
|
114
|
-
def decrypt(data)
|
|
115
|
-
@public_key_rsa.public_decrypt(Base64::decode64(data))
|
|
116
|
-
end
|
|
117
140
|
end
|
|
@@ -79,7 +79,7 @@ module OpenNebula::TemplateExt
|
|
|
79
79
|
image['STATE'].to_i
|
|
80
80
|
]
|
|
81
81
|
|
|
82
|
-
unless
|
|
82
|
+
unless ['LOCKED', 'READY', 'USED'].include?(i_state)
|
|
83
83
|
logger.fatal "Wrong image state #{i_state}" if logger
|
|
84
84
|
|
|
85
85
|
rollback(ids)
|
|
@@ -204,7 +204,7 @@ module OpenNebula::TemplateExt
|
|
|
204
204
|
# @param nic [XMLElement] to delete attributes from
|
|
205
205
|
#-------------------------------------------------------------------
|
|
206
206
|
def delete_nic_attributes(nic)
|
|
207
|
-
|
|
207
|
+
['NETWORK', 'NETWORK_ID', 'NETWORK_UNAME', 'SECURITY_GROUPS'].each do |a|
|
|
208
208
|
nic.delete_element(a)
|
|
209
209
|
end
|
|
210
210
|
end
|
|
@@ -47,17 +47,16 @@ module OpenNebula::VirtualMachineExt
|
|
|
47
47
|
# @return [Integer, OpenNebula::Error] the new Template ID in case
|
|
48
48
|
# of success, error otherwise
|
|
49
49
|
#-------------------------------------------------------------------
|
|
50
|
-
REMOVE_VNET_ATTRS =
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
REMOVE_IMAGE_ATTRS =
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
LN_TARGET TM_MAD TYPE OPENNEBULA_MANAGED]
|
|
50
|
+
REMOVE_VNET_ATTRS = ['AR_ID', 'BRIDGE', 'CLUSTER_ID', 'IP', 'MAC', 'TARGET', 'NIC_ID',
|
|
51
|
+
'NETWORK_ID', 'VN_MAD', 'SECURITY_GROUPS', 'VLAN_ID',
|
|
52
|
+
'BRIDGE_TYPE']
|
|
53
|
+
|
|
54
|
+
REMOVE_IMAGE_ATTRS = ['DEV_PREFIX', 'SOURCE', 'ORIGINAL_SIZE', 'SIZE',
|
|
55
|
+
'DISK_SNAPSHOT_TOTAL_SIZE', 'DRIVER', 'IMAGE_STATE', 'SAVE',
|
|
56
|
+
'CLONE', 'READONLY', 'PERSISTENT', 'TARGET', 'ALLOW_ORPHANS',
|
|
57
|
+
'CLONE_TARGET', 'CLUSTER_ID', 'DATASTORE', 'DATASTORE_ID',
|
|
58
|
+
'DISK_ID', 'DISK_TYPE', 'IMAGE_ID', 'IMAGE', 'IMAGE_UNAME',
|
|
59
|
+
'IMAGE_UID', 'LN_TARGET', 'TM_MAD', 'TYPE', 'OPENNEBULA_MANAGED']
|
|
61
60
|
|
|
62
61
|
def save_as_template(name, desc, opts = {})
|
|
63
62
|
opts = {
|
data/lib/opennebula.rb
CHANGED
data/lib/virtual_machine.rb
CHANGED
|
@@ -1126,7 +1126,7 @@ end
|
|
|
1126
1126
|
when OPAQUE_CARD.to_s
|
|
1127
1127
|
# Select only Opaque Networks
|
|
1128
1128
|
opaque_networks = @item.network.select do |net|
|
|
1129
|
-
RbVmomi::VIM::OpaqueNetwork
|
|
1129
|
+
net.class == RbVmomi::VIM::OpaqueNetwork
|
|
1130
1130
|
end
|
|
1131
1131
|
opaque_network = opaque_networks.find do |opn|
|
|
1132
1132
|
backing.opaqueNetworkId == opn.summary.opaqueNetworkId
|
|
@@ -1296,7 +1296,7 @@ end
|
|
|
1296
1296
|
when OPAQUE_CARD.to_s
|
|
1297
1297
|
# Select only Opaque Networks
|
|
1298
1298
|
opaque_networks = @item.network.select do |net|
|
|
1299
|
-
RbVmomi::VIM::OpaqueNetwork
|
|
1299
|
+
net.class == RbVmomi::VIM::OpaqueNetwork
|
|
1300
1300
|
end
|
|
1301
1301
|
opaque_network = opaque_networks.find do |opn|
|
|
1302
1302
|
nic.backing.opaqueNetworkId ==
|
|
@@ -3302,6 +3302,12 @@ end
|
|
|
3302
3302
|
@item.MarkAsTemplate
|
|
3303
3303
|
end
|
|
3304
3304
|
|
|
3305
|
+
def mark_as_virtual_machine
|
|
3306
|
+
@item.MarkAsVirtualMachine(
|
|
3307
|
+
:pool => cluster['resourcePool']
|
|
3308
|
+
)
|
|
3309
|
+
end
|
|
3310
|
+
|
|
3305
3311
|
def reset
|
|
3306
3312
|
@item.ResetVM_Task.wait_for_completion
|
|
3307
3313
|
end
|
data/lib/virtual_wire.rb
CHANGED
|
@@ -91,7 +91,7 @@ module NSXDriver
|
|
|
91
91
|
.get(url)
|
|
92
92
|
.xpath(NSXConstants::NSXV_LS_XPATH)
|
|
93
93
|
virtualwires.each do |virtualwire|
|
|
94
|
-
lsname_arr = name.split(
|
|
94
|
+
lsname_arr = name.split('-sid-')
|
|
95
95
|
lsname = lsname_arr[-1].split('-', 2)[-1]
|
|
96
96
|
lsid = lsname_arr[0].split(/vxw-dvs-\w.-/)[-1]
|
|
97
97
|
if virtualwire.xpath('name').text == lsname &&
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: opennebula
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 6.4.
|
|
4
|
+
version: 6.4.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- OpenNebula
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-
|
|
11
|
+
date: 2023-11-23 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: nokogiri
|