From 44195acbea5577a1dca0bc8ae9acad45ed2b3519 Mon Sep 17 00:00:00 2001 From: Vladimir Kozhukalov Date: Fri, 7 Feb 2014 13:16:19 +0400 Subject: [PATCH] Added extra field into node disks Extra parameters, which actually are the id names of hard drives, allow to find them under ubuntu kernel. Closes-bug: #1277151 Change-Id: I01c0a3cd47ebf0ec8f8a723321ca8452c623994e --- bin/agent | 22 +++++++----- nailgun/nailgun/volumes/manager.py | 57 +++++++++++++----------------- 2 files changed, 39 insertions(+), 40 deletions(-) diff --git a/bin/agent b/bin/agent index b122238695..68f2fb30de 100755 --- a/bin/agent +++ b/bin/agent @@ -131,7 +131,10 @@ class NodeAgent def put headers = {"Content-Type" => "application/json"} @logger.debug("Trying to put host info into #{@api_url}") + @logger.debug("Headers: #{headers}") + @logger.debug("Data: #{[_data].to_json}") res = htclient.put("#{@api_url}/nodes/", [_data].to_json, headers) + @logger.debug("Response: status: #{res.status} body: #{res.body}") if res.status < 200 or res.status >= 300 @logger.error("HTTP PUT failed: #{res.inspect}") end @@ -141,7 +144,10 @@ class NodeAgent def post headers = {"Content-Type" => "application/json"} @logger.debug("Trying to create host using #{@api_url}") + @logger.debug("Headers: #{headers}") + @logger.debug("Data: #{_data.to_json}") res = htclient.post("#{@api_url}/nodes/", _data.to_json, headers) + @logger.debug("Response: status: #{res.status} body: #{res.body}") res end @@ -241,7 +247,8 @@ class NodeAgent :name => dname, :model => binfo[:model], :size => (binfo[:size].to_i * block_size), - :disk => _disk_path_by_name(dname) || dname + :disk => _disk_path_by_name(dname) || dname, + :extra => _disk_id_by_name(dname) || [] } end end @@ -252,16 +259,15 @@ class NodeAgent detailed_meta end + def _disk_id_by_name(name) + dn = "/dev/disk/by-id" + basepath = Dir["#{dn}/**?"].select{|f| /\/#{name}$/.match(File.readlink(f))} + basepath.map{|p| p.split("/")[2..-1].join("/")} + end + def _disk_path_by_name(name) dn = "/dev/disk/by-path" basepath = Dir["#{dn}/**?"].find{|f| /\/#{name}$/.match(File.readlink(f))} - # It is to address the issue which appears when centos - # udev names smart array devices like this - # /dev/disk/by-path/pci-0000:06:00.0-cciss-disk0 - # and debian-installer udev names them like this - # /dev/disk/by-path/pci-0000:06:00.0 and can not - # find device. - basepath.sub!(/-cciss-.+/, '') basepath.split("/")[2..-1].join("/") if basepath end diff --git a/nailgun/nailgun/volumes/manager.py b/nailgun/nailgun/volumes/manager.py index ee8a8ae58a..86d443abef 100644 --- a/nailgun/nailgun/volumes/manager.py +++ b/nailgun/nailgun/volumes/manager.py @@ -302,7 +302,8 @@ class DisksFormatConvertor(object): class Disk(object): def __init__(self, volumes, generator_method, disk_id, name, - size, boot_is_raid=True, possible_pvs_count=0): + size, boot_is_raid=True, possible_pvs_count=0, + disk_extra=None): """Create disk :param volumes: volumes which need to allocate on disk @@ -317,6 +318,7 @@ class Disk(object): """ self.call_generator = generator_method self.id = disk_id + self.extra = disk_extra or [] self.name = name self.size = size self.lvm_meta_size = self.call_generator('calc_lvm_meta_size') @@ -519,6 +521,7 @@ class Disk(object): def render(self): return { 'id': self.id, + 'extra': self.extra, 'name': self.name, 'type': 'disk', 'size': self.size, @@ -571,7 +574,8 @@ class VolumeManager(object): byte_to_megabyte(d["size"]), boot_is_raid=boot_is_raid, # Count of possible PVs equal to count of allowed VGs - possible_pvs_count=len(only_vg(self.allowed_volumes))) + possible_pvs_count=len(only_vg(self.allowed_volumes)), + disk_extra=d.get("extra", [])) self.disks.append(disk) @@ -859,36 +863,25 @@ class VolumeManager(object): lambda volume: volume['_allocate_size'] == 'full-disk', self.allowed_volumes) - def expand_generators(self, cdict): - new_dict = {} - if isinstance(cdict, dict): - for i, val in cdict.iteritems(): - if type(val) in (str, unicode, int, float): - new_dict[i] = val - elif isinstance(val, dict): - if "generator" in val: - genval = self.call_generator( - val["generator"], - *(val.get("generator_args", [])) - ) - self.__logger( - 'Generator %s with args %s expanded to: %s' % - (val['generator'], - val.get('generator_args', []), - genval)) - - new_dict[i] = genval - else: - new_dict[i] = self.expand_generators(val) - elif isinstance(val, list): - new_dict[i] = [] - for d in val: - new_dict[i].append(self.expand_generators(d)) - elif isinstance(cdict, list): - new_dict = [] - for d in cdict: - new_dict.append(self.expand_generators(d)) - return new_dict + def expand_generators(self, value): + if isinstance(value, (str, unicode, int, float, long)): + return value + elif isinstance(value, dict): + generator = value.get("generator") + generator_args = value.get("generator_args", []) + if generator is not None: + genval = self.call_generator( + generator, *generator_args) + self.__logger( + 'Generator {0} with args {1} expanded to: {2}'.format( + generator, generator_args, genval)) + return genval + else: + return {k: self.expand_generators(v) + for k, v in value.iteritems()} + elif isinstance(value, list): + return [self.expand_generators(i) for i in value] + return value def check_disk_space_for_deployment(self): '''Check disks space for minimal installation.