wakame-vdc-dcmgr 11.06.0 → 11.12.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +19 -31
- data/bin/collector +6 -1
- data/config/db/migrations/0001_v1110_origin.rb +446 -0
- data/config/dcmgr.conf.example +51 -0
- data/lib/dcmgr.rb +99 -22
- data/lib/dcmgr/cli/base.rb +34 -1
- data/lib/dcmgr/cli/host.rb +24 -20
- data/lib/dcmgr/cli/image.rb +38 -19
- data/lib/dcmgr/cli/keypair.rb +16 -12
- data/lib/dcmgr/cli/network.rb +189 -81
- data/lib/dcmgr/cli/quota.rb +2 -2
- data/lib/dcmgr/cli/security_group.rb +106 -0
- data/lib/dcmgr/cli/spec.rb +144 -39
- data/lib/dcmgr/cli/storage.rb +16 -15
- data/lib/dcmgr/cli/tag.rb +20 -14
- data/lib/dcmgr/cli/vlan.rb +5 -5
- data/lib/dcmgr/drivers/backing_store.rb +32 -0
- data/lib/dcmgr/drivers/comstar.rb +81 -0
- data/lib/dcmgr/drivers/iijgio_storage.rb +9 -19
- data/lib/dcmgr/drivers/iscsi_target.rb +41 -0
- data/lib/dcmgr/drivers/kvm.rb +161 -28
- data/lib/dcmgr/drivers/linux_iscsi.rb +60 -0
- data/lib/dcmgr/drivers/local_storage.rb +24 -0
- data/lib/dcmgr/drivers/lxc.rb +167 -125
- data/lib/dcmgr/drivers/raw.rb +74 -0
- data/lib/dcmgr/drivers/s3_storage.rb +7 -19
- data/lib/dcmgr/drivers/snapshot_storage.rb +18 -28
- data/lib/dcmgr/drivers/storage_initiator.rb +28 -0
- data/lib/dcmgr/drivers/sun_iscsi.rb +32 -0
- data/lib/dcmgr/drivers/zfs.rb +77 -0
- data/lib/dcmgr/endpoints/core_api.rb +315 -263
- data/lib/dcmgr/endpoints/errors.rb +21 -10
- data/lib/dcmgr/endpoints/metadata.rb +360 -23
- data/lib/dcmgr/helpers/cli_helper.rb +6 -3
- data/lib/dcmgr/helpers/ec2_metadata_helper.rb +9 -0
- data/lib/dcmgr/helpers/nic_helper.rb +11 -0
- data/lib/dcmgr/helpers/snapshot_storage_helper.rb +34 -0
- data/lib/dcmgr/models/account.rb +0 -6
- data/lib/dcmgr/models/account_resource.rb +0 -4
- data/lib/dcmgr/models/base_new.rb +14 -2
- data/lib/dcmgr/models/dhcp_range.rb +38 -0
- data/lib/dcmgr/models/frontend_system.rb +0 -6
- data/lib/dcmgr/models/history.rb +0 -11
- data/lib/dcmgr/models/host_node.rb +131 -0
- data/lib/dcmgr/models/hostname_lease.rb +0 -8
- data/lib/dcmgr/models/image.rb +31 -18
- data/lib/dcmgr/models/instance.rb +137 -143
- data/lib/dcmgr/models/instance_nic.rb +52 -29
- data/lib/dcmgr/models/instance_security_group.rb +9 -0
- data/lib/dcmgr/models/instance_spec.rb +163 -31
- data/lib/dcmgr/models/ip_lease.rb +10 -21
- data/lib/dcmgr/models/mac_lease.rb +30 -11
- data/lib/dcmgr/models/network.rb +148 -27
- data/lib/dcmgr/models/physical_network.rb +18 -0
- data/lib/dcmgr/models/quota.rb +0 -10
- data/lib/dcmgr/models/request_log.rb +3 -18
- data/lib/dcmgr/models/security_group.rb +66 -0
- data/lib/dcmgr/models/security_group_rule.rb +145 -0
- data/lib/dcmgr/models/ssh_key_pair.rb +16 -19
- data/lib/dcmgr/models/{storage_pool.rb → storage_node.rb} +35 -25
- data/lib/dcmgr/models/tag.rb +0 -14
- data/lib/dcmgr/models/tag_mapping.rb +1 -7
- data/lib/dcmgr/models/vlan_lease.rb +2 -8
- data/lib/dcmgr/models/volume.rb +49 -37
- data/lib/dcmgr/models/volume_snapshot.rb +15 -17
- data/lib/dcmgr/node_modules/hva_collector.rb +69 -28
- data/lib/dcmgr/node_modules/instance_ha.rb +23 -12
- data/lib/dcmgr/node_modules/instance_monitor.rb +16 -2
- data/lib/dcmgr/node_modules/openflow_controller.rb +784 -0
- data/lib/dcmgr/node_modules/scheduler.rb +189 -0
- data/lib/dcmgr/node_modules/service_netfilter.rb +452 -227
- data/lib/dcmgr/node_modules/service_openflow.rb +731 -0
- data/lib/dcmgr/node_modules/sta_collector.rb +20 -0
- data/lib/dcmgr/node_modules/sta_tgt_initializer.rb +35 -0
- data/lib/dcmgr/rack/request_logger.rb +11 -6
- data/lib/dcmgr/rpc/hva_handler.rb +256 -110
- data/lib/dcmgr/rpc/sta_handler.rb +244 -0
- data/lib/dcmgr/scheduler.rb +122 -8
- data/lib/dcmgr/scheduler/host_node/exclude_same.rb +24 -0
- data/lib/dcmgr/scheduler/host_node/find_first.rb +12 -0
- data/lib/dcmgr/scheduler/host_node/least_usage.rb +28 -0
- data/lib/dcmgr/scheduler/host_node/per_instance.rb +18 -0
- data/lib/dcmgr/scheduler/host_node/specify_node.rb +26 -0
- data/lib/dcmgr/scheduler/network/flat_single.rb +23 -0
- data/lib/dcmgr/scheduler/network/nat_one_to_one.rb +23 -0
- data/lib/dcmgr/scheduler/network/per_instance.rb +39 -0
- data/lib/dcmgr/scheduler/network/vif_template.rb +19 -0
- data/lib/dcmgr/scheduler/storage_node/find_first.rb +13 -0
- data/lib/dcmgr/scheduler/storage_node/least_usage.rb +23 -0
- data/lib/dcmgr/storage_service.rb +39 -40
- data/lib/dcmgr/tags.rb +3 -3
- data/lib/dcmgr/version.rb +1 -1
- data/lib/dcmgr/vnet.rb +105 -0
- data/lib/dcmgr/vnet/factories.rb +141 -0
- data/lib/dcmgr/vnet/isolators/by_securitygroup.rb +21 -0
- data/lib/dcmgr/vnet/isolators/dummy.rb +17 -0
- data/lib/dcmgr/vnet/netfilter/cache.rb +51 -0
- data/lib/dcmgr/vnet/netfilter/chain.rb +66 -0
- data/lib/dcmgr/vnet/netfilter/controller.rb +193 -0
- data/lib/dcmgr/vnet/netfilter/ebtables_rule.rb +53 -0
- data/lib/dcmgr/vnet/netfilter/iptables_rule.rb +45 -0
- data/lib/dcmgr/vnet/netfilter/task_manager.rb +459 -0
- data/lib/dcmgr/vnet/tasks/accept_all_dns.rb +19 -0
- data/lib/dcmgr/vnet/tasks/accept_arp_broadcast.rb +24 -0
- data/lib/dcmgr/vnet/tasks/accept_arp_from_friends.rb +34 -0
- data/lib/dcmgr/vnet/tasks/accept_arp_from_gateway.rb +21 -0
- data/lib/dcmgr/vnet/tasks/accept_arp_to_host.rb +30 -0
- data/lib/dcmgr/vnet/tasks/accept_ip_from_friends.rb +26 -0
- data/lib/dcmgr/vnet/tasks/accept_ip_from_gateway.rb +23 -0
- data/lib/dcmgr/vnet/tasks/accept_ip_to_anywhere.rb +18 -0
- data/lib/dcmgr/vnet/tasks/accept_related_established.rb +45 -0
- data/lib/dcmgr/vnet/tasks/accept_wakame_dhcp_only.rb +33 -0
- data/lib/dcmgr/vnet/tasks/accept_wakame_dns_only.rb +33 -0
- data/lib/dcmgr/vnet/tasks/debug_iptables.rb +21 -0
- data/lib/dcmgr/vnet/tasks/drop_arp_forwarding.rb +27 -0
- data/lib/dcmgr/vnet/tasks/drop_arp_to_host.rb +24 -0
- data/lib/dcmgr/vnet/tasks/drop_ip_from_anywhere.rb +18 -0
- data/lib/dcmgr/vnet/tasks/drop_ip_spoofing.rb +34 -0
- data/lib/dcmgr/vnet/tasks/drop_mac_spoofing.rb +33 -0
- data/lib/dcmgr/vnet/tasks/exclude_from_nat.rb +47 -0
- data/lib/dcmgr/vnet/tasks/security_group.rb +37 -0
- data/lib/dcmgr/vnet/tasks/static_nat.rb +54 -0
- data/lib/dcmgr/vnet/tasks/translate_metadata_address.rb +32 -0
- data/web/metadata/config.ru +1 -1
- metadata +174 -89
- data/lib/dcmgr/cli/group.rb +0 -101
- data/lib/dcmgr/endpoints/core_api_mock.rb +0 -865
- data/lib/dcmgr/models/host_pool.rb +0 -122
- data/lib/dcmgr/models/instance_netfilter_group.rb +0 -16
- data/lib/dcmgr/models/netfilter_group.rb +0 -89
- data/lib/dcmgr/models/netfilter_rule.rb +0 -21
- data/lib/dcmgr/scheduler/find_last.rb +0 -16
- data/lib/dcmgr/scheduler/find_random.rb +0 -16
- data/lib/dcmgr/stm/instance.rb +0 -25
- data/lib/dcmgr/stm/snapshot_context.rb +0 -33
- data/lib/dcmgr/stm/volume_context.rb +0 -65
data/lib/dcmgr/models/tag.rb
CHANGED
@@ -43,15 +43,6 @@ module Dcmgr::Models
|
|
43
43
|
class Tag < AccountResource
|
44
44
|
taggable('tag')
|
45
45
|
|
46
|
-
inheritable_schema do
|
47
|
-
Fixnum :type_id, :null=>false
|
48
|
-
String :name, :null=>false
|
49
|
-
String :attributes
|
50
|
-
|
51
|
-
index [:account_id, :type_id, :name], {:unique=>true}
|
52
|
-
end
|
53
|
-
with_timestamps
|
54
|
-
|
55
46
|
many_to_one :account
|
56
47
|
|
57
48
|
one_to_many :mapped_uuids, :class=>TagMapping do |ds|
|
@@ -160,10 +151,5 @@ module Dcmgr::Models
|
|
160
151
|
def to_api_document
|
161
152
|
to_hash.merge({:type_id=>self.class.to_s.split('::').last})
|
162
153
|
end
|
163
|
-
|
164
|
-
def self.declare(account_id, tag_class_name, name)
|
165
|
-
Dcmgr::Tags.const_get(tag_class_name).find_or_create(:account_id=>account_id,
|
166
|
-
:name=>name)
|
167
|
-
end
|
168
154
|
end
|
169
155
|
end
|
@@ -5,17 +5,11 @@ module Dcmgr::Models
|
|
5
5
|
class VlanLease < AccountResource
|
6
6
|
taggable 'vlan'
|
7
7
|
|
8
|
-
inheritable_schema do
|
9
|
-
Fixnum :tag_id, :null=>false
|
10
|
-
|
11
|
-
index :tag_id, {:unique=>true}
|
12
|
-
end
|
13
|
-
with_timestamps
|
14
|
-
|
15
8
|
one_to_many :networks
|
16
9
|
|
17
10
|
def validate
|
18
|
-
|
11
|
+
super
|
12
|
+
|
19
13
|
unless 1 <= self.tag_id.to_i && self.tag_id.to_i <= 4095
|
20
14
|
errors.add(:tag_id, "Tag ID is out of range (1-4095)")
|
21
15
|
end
|
data/lib/dcmgr/models/volume.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
require 'statemachine'
|
3
2
|
|
4
3
|
module Dcmgr::Models
|
5
4
|
class Volume < AccountResource
|
@@ -21,31 +20,7 @@ module Dcmgr::Models
|
|
21
20
|
STATE_TYPE_DELETING = "deleting"
|
22
21
|
STATE_TYPE_DELETED = "deleted"
|
23
22
|
|
24
|
-
|
25
|
-
Fixnum :storage_pool_id, :null=>false
|
26
|
-
String :status, :null=>false, :default=>STATUS_TYPE_REGISTERING
|
27
|
-
String :state, :null=>false, :default=>STATE_TYPE_REGISTERING
|
28
|
-
Fixnum :size, :null=>false
|
29
|
-
Fixnum :instance_id
|
30
|
-
Fixnum :boot_dev, :null=>false, :default=>0
|
31
|
-
String :snapshot_id
|
32
|
-
String :host_device_name
|
33
|
-
String :guest_device_name
|
34
|
-
String :export_path, :null=>false
|
35
|
-
# String :intermediate_path, :null=>false
|
36
|
-
Text :transport_information
|
37
|
-
Time :deleted_at
|
38
|
-
Time :attached_at
|
39
|
-
Time :detached_at
|
40
|
-
|
41
|
-
index :storage_pool_id
|
42
|
-
index :instance_id
|
43
|
-
index :snapshot_id
|
44
|
-
index :deleted_at
|
45
|
-
end
|
46
|
-
with_timestamps
|
47
|
-
|
48
|
-
many_to_one :storage_pool
|
23
|
+
many_to_one :storage_node, :after_set=>:validate_storage_node_assigned
|
49
24
|
many_to_one :instance
|
50
25
|
|
51
26
|
plugin ArchiveChangedColumn, :histories
|
@@ -65,25 +40,38 @@ module Dcmgr::Models
|
|
65
40
|
# iscsi:
|
66
41
|
# {:iqn=>'iqn.1986-03.com.sun:02:a1024afa-775b-65cf-b5b0-aa17f3476bfc', :lun=>0}
|
67
42
|
plugin :serialization, :yaml, :transport_information
|
43
|
+
plugin :serialization, :yaml, :request_params
|
68
44
|
|
69
|
-
class
|
45
|
+
class CapacityError < RuntimeError; end
|
70
46
|
class RequestError < RuntimeError; end
|
71
47
|
|
72
|
-
def
|
73
|
-
sp
|
48
|
+
def validate_storage_node_assigned(sp)
|
49
|
+
unless sp.is_a?(StorageNode)
|
50
|
+
raise "unknown class: #{sp.class}"
|
51
|
+
end
|
74
52
|
volume_size = sp.volumes_dataset.lives.sum(:size).to_i
|
75
53
|
# check if the sum of available volume and new volume is under
|
76
54
|
# the limit of offering capacity.
|
77
55
|
total_size = sp.offering_disk_space - volume_size.to_i
|
78
56
|
if self.size > total_size
|
79
|
-
raise
|
57
|
+
raise CapacityError, "Allocation exceeds storage node blank size: #{}"
|
80
58
|
end
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
if
|
85
|
-
|
59
|
+
end
|
60
|
+
|
61
|
+
def validate
|
62
|
+
# do not run validation if the row is maked as deleted.
|
63
|
+
return true if self.deleted_at
|
64
|
+
|
65
|
+
if new?
|
66
|
+
# TODO: Here may not be the right place for capacity validation.
|
67
|
+
per_account_total = self.class.filter(:account_id=>self.account_id).lives.sum(:size).to_i
|
68
|
+
if self.account.quota.volume_total_size < per_account_total + self.size.to_i
|
69
|
+
raise CapacityError, "Allocation exceeds account's quota: #{self.account.quota.volume_total_size}, #{self.size.to_i}, #{per_account_total}"
|
70
|
+
end
|
86
71
|
end
|
72
|
+
|
73
|
+
errors.add(:size, "Invalid volume size.") if self.size == 0
|
74
|
+
|
87
75
|
super
|
88
76
|
end
|
89
77
|
|
@@ -125,7 +113,7 @@ module Dcmgr::Models
|
|
125
113
|
|
126
114
|
def merge_pool_data
|
127
115
|
v = self.to_hash
|
128
|
-
v.merge(:
|
116
|
+
v.merge(:storage_node=>storage_node.to_hash)
|
129
117
|
end
|
130
118
|
|
131
119
|
def to_hash
|
@@ -157,9 +145,33 @@ module Dcmgr::Models
|
|
157
145
|
|
158
146
|
def create_snapshot(account_id)
|
159
147
|
vs = VolumeSnapshot.create(:account_id=>account_id,
|
160
|
-
:
|
148
|
+
:storage_node_id=>self.storage_node_id,
|
161
149
|
:origin_volume_id=>self.canonical_uuid,
|
162
150
|
:size=>self.size)
|
163
151
|
end
|
152
|
+
|
153
|
+
# override Sequel::Model#delete not to delete rows but to set
|
154
|
+
# delete flags.
|
155
|
+
def delete
|
156
|
+
self.deleted_at ||= Time.now
|
157
|
+
self.state = :deleted if self.state != :deleted
|
158
|
+
self.status = :offline if self.status != :offline
|
159
|
+
self.save
|
160
|
+
end
|
161
|
+
|
162
|
+
def snapshot
|
163
|
+
VolumeSnapshot[self.snapshot_id]
|
164
|
+
end
|
165
|
+
|
166
|
+
def self.entry_new(account, size, params, &blk)
|
167
|
+
# Mash is passed in some cases.
|
168
|
+
raise ArgumentError unless params.class == ::Hash
|
169
|
+
v = self.new &blk
|
170
|
+
v.account_id = account.canonical_uuid
|
171
|
+
v.size = size
|
172
|
+
v.request_params = params
|
173
|
+
v
|
174
|
+
end
|
175
|
+
|
164
176
|
end
|
165
177
|
end
|
@@ -11,22 +11,11 @@ module Dcmgr::Models
|
|
11
11
|
STATE_TYPE_DELETING = "deleting"
|
12
12
|
STATE_TYPE_DELETED = "deleted"
|
13
13
|
|
14
|
-
|
15
|
-
Fixnum :storage_pool_id, :null=>false
|
16
|
-
String :origin_volume_id, :null=>false
|
17
|
-
Fixnum :size, :null=>false
|
18
|
-
Fixnum :status, :null=>false, :default=>0
|
19
|
-
String :state, :null=>false, :default=>STATE_TYPE_REGISTERING
|
20
|
-
String :destination_key, :null=>false
|
21
|
-
Time :deleted_at
|
22
|
-
index :storage_pool_id
|
23
|
-
index :deleted_at
|
24
|
-
end
|
25
|
-
with_timestamps
|
26
|
-
|
27
|
-
many_to_one :storage_pool
|
14
|
+
many_to_one :storage_node
|
28
15
|
plugin ArchiveChangedColumn, :histories
|
29
16
|
|
17
|
+
subset(:alives, {:deleted_at => nil})
|
18
|
+
|
30
19
|
RECENT_TERMED_PERIOD=(60 * 15)
|
31
20
|
# lists the volumes are available and deleted within
|
32
21
|
# RECENT_TERMED_PERIOD sec.
|
@@ -46,15 +35,16 @@ module Dcmgr::Models
|
|
46
35
|
:origin_volume_id => self.origin_volume_id,
|
47
36
|
:destination_id => self.destination,
|
48
37
|
:destination_name => self.display_name,
|
38
|
+
:backing_store => self.storage_node.storage_type,
|
49
39
|
:created_at => self.created_at,
|
50
40
|
:deleted_at => self.deleted_at,
|
51
41
|
}
|
52
42
|
end
|
53
43
|
|
54
44
|
# create volume inherite from this snapshot for the account.
|
55
|
-
# limitation: inherit volume is created on same
|
45
|
+
# limitation: inherit volume is created on same storage_node.
|
56
46
|
def create_volume(account_id)
|
57
|
-
|
47
|
+
storage_node.create_volume(account_id, self.size, self.canonical_uuid)
|
58
48
|
end
|
59
49
|
|
60
50
|
def display_name
|
@@ -68,7 +58,7 @@ module Dcmgr::Models
|
|
68
58
|
end
|
69
59
|
|
70
60
|
def snapshot_filename
|
71
|
-
"#{self.canonical_uuid}.
|
61
|
+
"#{self.canonical_uuid}.snap"
|
72
62
|
end
|
73
63
|
|
74
64
|
def destination
|
@@ -83,6 +73,14 @@ module Dcmgr::Models
|
|
83
73
|
vs.state = :deleting
|
84
74
|
vs.save_changes
|
85
75
|
end
|
76
|
+
|
77
|
+
# override Sequel::Model#delete not to delete rows but to set
|
78
|
+
# delete flags.
|
79
|
+
def delete
|
80
|
+
self.state = :deleted if self.state != :deleted
|
81
|
+
self.deleted_at ||= Time.now
|
82
|
+
self.save
|
83
|
+
end
|
86
84
|
|
87
85
|
def update_destination_key(account_id, destination_key)
|
88
86
|
self.destination_key = destination_key
|
@@ -46,11 +46,11 @@ module Dcmgr
|
|
46
46
|
nil
|
47
47
|
end
|
48
48
|
|
49
|
-
def
|
49
|
+
def get_security_groups_of_instance(instance_id)
|
50
50
|
inst = Models::Instance[instance_id]
|
51
51
|
raise "UnknownInstanceID" if inst.nil?
|
52
52
|
|
53
|
-
inst.
|
53
|
+
inst.security_groups.map { |g| g.to_hash }
|
54
54
|
end
|
55
55
|
|
56
56
|
#Returns an array containing the ip addresses of all instances in the same security group.
|
@@ -63,8 +63,10 @@ module Dcmgr
|
|
63
63
|
raise "UnknownInstanceID" if inst.nil?
|
64
64
|
raise "Unknown ip set." unless [:inside,:all,:outside].member?(set)
|
65
65
|
|
66
|
-
inst.
|
67
|
-
|
66
|
+
inst.security_groups.compact.map { |security_group|
|
67
|
+
# do not include 'stopped' or 'scheduling' instances as they
|
68
|
+
# are not allocated IP address.
|
69
|
+
security_group.instances_dataset.runnings.all.compact.map { |instance|
|
68
70
|
instance.ips.compact.map { |ip|
|
69
71
|
case set
|
70
72
|
when :all
|
@@ -79,23 +81,32 @@ module Dcmgr
|
|
79
81
|
}.flatten.uniq.compact
|
80
82
|
end
|
81
83
|
|
82
|
-
# def get_instances_of_account_netfilter_group(account_id, netfilter_group_id)
|
83
|
-
def get_instances_of_account_netfilter_group(account_id, netfilter_group_name)
|
84
|
-
ng_map = Models::NetfilterGroup.find(:account_id => account_id, :name => netfilter_group_name)
|
85
|
-
raise "UnknownNetfilterGroupID" if ng_map.nil?
|
86
|
-
inst_maps = ng_map.instances_dataset.lives.all.map { |inst| inst.to_hash }.flatten.uniq.compact
|
87
|
-
inst_maps
|
88
|
-
end
|
89
|
-
|
90
84
|
def get_network(network_id)
|
91
85
|
network = Models::Network[network_id]
|
92
86
|
raise "UnknownNetworkID" if network.nil?
|
93
87
|
network.to_hash
|
94
88
|
end
|
95
89
|
|
90
|
+
def get_nic(nic_uuid)
|
91
|
+
nic = Models::Taggable.find(nic_uuid)
|
92
|
+
raise "UnknownNIC" if nic.nil?
|
93
|
+
nic.to_hash
|
94
|
+
end
|
95
|
+
|
96
|
+
def get_instance_of_nic(nic_uuid)
|
97
|
+
nic = Models::Taggable.find(nic_uuid)
|
98
|
+
raise "UnknownNIC" if nic.nil?
|
99
|
+
|
100
|
+
instance = nic.instance
|
101
|
+
raise "UnknownInstance" if instance.nil?
|
102
|
+
|
103
|
+
instance.to_hash
|
104
|
+
end
|
105
|
+
|
96
106
|
#Returns the current iplease for nic with uuid _nic_uuid_
|
97
107
|
def get_iplease_for_nic(nic_uuid)
|
98
108
|
nic = Models::Taggable.find(nic_uuid)
|
109
|
+
raise "UnknownNIC" if nic.nil?
|
99
110
|
Models::IpLease.find(:instance_nic_id => nic[:id])[:ipv4]
|
100
111
|
end
|
101
112
|
|
@@ -125,13 +136,13 @@ module Dcmgr
|
|
125
136
|
|
126
137
|
def get_dhcp_conf(network_name)
|
127
138
|
build_network_segment = proc { |network|
|
128
|
-
|
139
|
+
nwaddr = network.ipv4_ipaddress
|
129
140
|
h = {
|
130
141
|
:uuid => network.canonical_uuid,
|
131
|
-
:ipv4_first =>
|
132
|
-
:ipv4_last =>
|
133
|
-
:ipv4_gw=>network.ipv4_gw,
|
134
|
-
:netmask =>
|
142
|
+
:ipv4_first => nwaddr.first.to_s,
|
143
|
+
:ipv4_last => nwaddr.last.to_s,
|
144
|
+
:ipv4_gw=> network.ipv4_gw,
|
145
|
+
:netmask => nwaddr.prefix.to_ip,
|
135
146
|
:prefix => network.prefix,
|
136
147
|
:dns_server=> network.dns_server,
|
137
148
|
:domain_name => network.domain_name,
|
@@ -149,8 +160,8 @@ module Dcmgr
|
|
149
160
|
:ipaddr => ip.ipv4
|
150
161
|
}
|
151
162
|
h[:addr2host] << {
|
152
|
-
:hostname => ip.instance_nic.
|
153
|
-
:ipaddr =>
|
163
|
+
:hostname => ip.instance_nic.fqdn_hostname,
|
164
|
+
:ipaddr => ip.instance_nic.nat_network_id.nil? ? ip.ipv4 : ip.nat_outside_lease.ipv4
|
154
165
|
}
|
155
166
|
}
|
156
167
|
|
@@ -168,6 +179,7 @@ module Dcmgr
|
|
168
179
|
else
|
169
180
|
raise "Unknown network name: #{network_name}"
|
170
181
|
end
|
182
|
+
|
171
183
|
h = {}
|
172
184
|
network_set.each {|n|
|
173
185
|
h[n.canonical_uuid] = build_network_segment.call(n)
|
@@ -175,30 +187,59 @@ module Dcmgr
|
|
175
187
|
h
|
176
188
|
end
|
177
189
|
|
178
|
-
def
|
179
|
-
|
180
|
-
raise "
|
181
|
-
|
190
|
+
def get_instances_of_security_group(security_group_uuid)
|
191
|
+
sg_map = Models::SecurityGroup[security_group_uuid]
|
192
|
+
raise "Unknown security group ID: #{security_group_uuid}" if sg_map.nil?
|
193
|
+
# do not include 'stopped' or 'scheduling' instances as they
|
194
|
+
# are not allocated IP address.
|
195
|
+
inst_maps = sg_map.instances_dataset.runnings.all.map { |inst| inst.to_hash }.flatten.uniq.compact
|
196
|
+
inst_maps
|
182
197
|
end
|
183
198
|
|
184
199
|
def get_alive_instances(node_id)
|
185
|
-
hp = Models::
|
200
|
+
hp = Models::HostNode.find(:node_id => node_id)
|
186
201
|
if hp.nil?
|
187
|
-
logger.error("The node ID is not bound to
|
202
|
+
logger.error("The node ID is not bound to HostNode yet: #{node_id}")
|
188
203
|
return []
|
189
204
|
end
|
190
|
-
hps = Models::
|
205
|
+
hps = Models::HostNode.where(:account_id => hp.account_id).all
|
191
206
|
inst_on_hp = hps.map { |hp|
|
192
|
-
inst_on_hp = hp.instances_dataset.
|
207
|
+
inst_on_hp = hp.instances_dataset.runnings.all.map { |inst|
|
193
208
|
inst_map = inst.to_hash
|
194
209
|
# Does the hva have instance?
|
195
|
-
next unless inst_map[:
|
210
|
+
next unless inst_map[:host_node][:node_id] == node_id
|
196
211
|
inst_map
|
197
212
|
}
|
198
213
|
}.flatten.uniq.compact
|
199
214
|
inst_on_hp
|
200
215
|
end
|
201
216
|
|
217
|
+
# Method designed to get all data needed for the netfilter service in a single request
|
218
|
+
def get_netfilter_data(node_id)
|
219
|
+
inst_maps = get_alive_instances(node_id)
|
220
|
+
|
221
|
+
#Determine which security groups are in use
|
222
|
+
secg_uuids = inst_maps.map { |inst_map|
|
223
|
+
inst_map[:security_groups]
|
224
|
+
}.flatten.uniq
|
225
|
+
|
226
|
+
secg_maps = Models::SecurityGroup.map { |secg|
|
227
|
+
secg.to_hash if secg_uuids.member? secg.canonical_uuid
|
228
|
+
}.compact
|
229
|
+
|
230
|
+
# Trim out the data netfilter doesn't need and return a clean hash
|
231
|
+
{
|
232
|
+
:instances => inst_maps.map { |inst_map|
|
233
|
+
{
|
234
|
+
:uuid => inst_map[:uuid],
|
235
|
+
:security_groups => inst_map[:security_groups],
|
236
|
+
:vif => inst_map[:vif].map { |vif| vif.merge({:security_groups => inst_map[:security_groups]}) }# <-- Just putting the security groups in vif for the vnet isolator, gonna properly do this in the database asap
|
237
|
+
}
|
238
|
+
},
|
239
|
+
:security_groups => secg_maps
|
240
|
+
}
|
241
|
+
end
|
242
|
+
|
202
243
|
end
|
203
244
|
end
|
204
245
|
end
|
@@ -5,7 +5,7 @@ module Dcmgr
|
|
5
5
|
module NodeModules
|
6
6
|
class InstanceHA < Isono::NodeModules::Base
|
7
7
|
include Dcmgr::Logger
|
8
|
-
|
8
|
+
|
9
9
|
initialize_hook do
|
10
10
|
@thread_pool = Isono::ThreadPool.new(1, 'InstanceHA')
|
11
11
|
event = Isono::NodeModules::EventChannel.new(node)
|
@@ -26,12 +26,19 @@ module Dcmgr
|
|
26
26
|
|
27
27
|
def restart_instance(inst)
|
28
28
|
# terminate and cleanup
|
29
|
+
|
30
|
+
# set boot_vol before instance is cleaned up.
|
31
|
+
case inst.image.boot_dev_type
|
32
|
+
when Models::Image::BOOT_DEV_SAN
|
33
|
+
boot_vol = inst.volume.find {|v| v.boot_dev == 1 }
|
34
|
+
end
|
35
|
+
|
29
36
|
begin
|
30
|
-
jobrpc.run("
|
37
|
+
jobrpc.run("hva-handle.#{inst.host_node.node_id}", 'cleanup', inst.canonical_uuid)
|
31
38
|
rescue => e
|
32
39
|
# termination may fail
|
33
40
|
end
|
34
|
-
|
41
|
+
|
35
42
|
# TODO: pick a new host node
|
36
43
|
Isono::NodeModules::DataStore.barrier {
|
37
44
|
inst.state = :failingover
|
@@ -39,18 +46,22 @@ module Dcmgr
|
|
39
46
|
}
|
40
47
|
|
41
48
|
# start a new backup instance
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
49
|
+
begin
|
50
|
+
case inst.image.boot_dev_type
|
51
|
+
when Models::Image::BOOT_DEV_SAN
|
52
|
+
jobrpc.submit("scheduler", 'schedule_instance_ha', inst.canonical_uuid, boot_vol)
|
53
|
+
when Models::Image::BOOT_DEV_LOCAL
|
54
|
+
jobrpc.submit("scheduler", 'schedule_instance_ha', inst.canonical_uuid, nil)
|
55
|
+
else
|
56
|
+
raise "Unknown boot type"
|
57
|
+
end
|
58
|
+
rescue => e
|
59
|
+
# termination may fail
|
50
60
|
end
|
61
|
+
|
51
62
|
logger.info("#{inst.canonical_uuid} has been restarted")
|
52
63
|
end
|
53
|
-
|
64
|
+
|
54
65
|
private
|
55
66
|
def event
|
56
67
|
@event ||= Isono::NodeModules::EventChannel.new(node)
|