From edf9a4dc64628ba8ce6c5673ade429408f4a5975 Mon Sep 17 00:00:00 2001 From: qyin Date: Mon, 27 Jan 2014 13:52:33 +0800 Subject: [PATCH] windows solution: 222013 --- perl-xCAT/xCAT/ProfiledNodeUtils.pm | 56 +++++++++++++++++++ xCAT-server/lib/xcat/plugins/profilednodes.pm | 40 ++++++++++++- 2 files changed, 94 insertions(+), 2 deletions(-) diff --git a/perl-xCAT/xCAT/ProfiledNodeUtils.pm b/perl-xCAT/xCAT/ProfiledNodeUtils.pm index 8bff2eace..8c14fc39e 100644 --- a/perl-xCAT/xCAT/ProfiledNodeUtils.pm +++ b/perl-xCAT/xCAT/ProfiledNodeUtils.pm @@ -719,6 +719,28 @@ sub get_nodes_profiles return \%profile_dict; } +#------------------------------------------------------------------------------- + +=head3 get_imageprofile_prov_osvers + Description : Get A node's provisioning os version and profile from its imageprofile attribute. + Arguments : $imgprofilename - imageprofile name + Returns : node's osversion and profile +=cut + +#------------------------------------------------------------------------------- +sub get_imageprofile_prov_osvers +{ + + my $class = shift; + my $imgprofilename = shift; + my $osimgtab = xCAT::Table->new('osimage'); + my $osimgentry = ($osimgtab->getAllAttribsWhere("imagename = '$imgprofilename'", 'ALL' ))[0]; + my $osversion = $osimgentry->{'osvers'}; + my $profile = $osimgentry->{'profile'}; + return ($osversion, $profile); +} + + #------------------------------------------------------------------------------- =head3 get_imageprofile_prov_method @@ -1015,6 +1037,40 @@ sub parse_nodeinfo_file return 1, ""; } +#------------------------------------------------------- + +=head3 update the table prodkey, in order to support windows + per node license key + + Returns: $retcode. + $retcode = 1. update failed, the value is undef + $retcode = 0. save into db is OK.. +=cut +#------------------------------------------------------- + +sub update_windows_prodkey +{ + my $class = shift; + my $node = shift; + my $product = shift; + my $key = shift; + unless(defined($node) && defined($product) && defined($key)) + { + return 1; + } + # please notice this db usage + my %keyhash; + my %updates; + $keyhash{'node'} = $node; + $updates{'product'} = $product; + $updates{'key'} = $key; + my $tab = xCAT::Table->new('prodkey', -create=>1, -autocommit=>0); + $tab->setAttribs( \%keyhash,\%updates ); + $tab->commit; + $tab->close; + return 0; +} + #------------------------------------------------------------------------------- =head3 check_nicips Description: Check if the nicips defined in MAC file is correct diff --git a/xCAT-server/lib/xcat/plugins/profilednodes.pm b/xCAT-server/lib/xcat/plugins/profilednodes.pm index 863ebb8a2..de0e3980c 100644 --- a/xCAT-server/lib/xcat/plugins/profilednodes.pm +++ b/xCAT-server/lib/xcat/plugins/profilednodes.pm @@ -19,6 +19,7 @@ require xCAT::Utils; require xCAT::TableUtils; require xCAT::NetworkUtils; require xCAT::MsgUtils; +require xCAT::CFMUtils; require xCAT::ProfiledNodeUtils; # Globals. @@ -481,7 +482,7 @@ Usage: $warnstr = "Warning: failed to import some nodes."; setrsp_progress($warnstr); } - + setrsp_progress("Configuring nodes..."); my $retref = xCAT::Utils->runxcmd({command=>["kitnodeadd"], node=>\@nodelist, sequential=>[1], macflag=>[$mac_addr_mode]}, $request_command, 0, 2); my $retstrref = parse_runxcmd_ret($retref); @@ -1686,6 +1687,15 @@ sub gen_new_hostinfo_dict{ # Get node's provisioning method my $provmethod = xCAT::ProfiledNodeUtils->get_imageprofile_prov_method($args_dict{'imageprofile'}); + # start to check windows nodes, product will indicate it is a windows node: win2k8r2.enterprise + my ($osvers, $osprofile) = xCAT::ProfiledNodeUtils->get_imageprofile_prov_osvers($provmethod); + my $product = undef; + if ($osvers =~ /^win/) + { + $product = "$osvers.$osprofile"; + } + + # Check whether this is Power env. my $is_fsp = xCAT::ProfiledNodeUtils->is_fsp_node($args_dict{'networkprofile'}); @@ -1747,6 +1757,18 @@ sub gen_new_hostinfo_dict{ } $hostinfo_dict{$item}{"nicips"} = $nicips; + #save for windows node + if(defined($product) && exists($hostinfo_dict{$item}{"prodkey"})) + { + if(defined($hostinfo_dict{$item}{"prodkey"})) + { + my $rst = xCAT::ProfiledNodeUtils->update_windows_prodkey($item, $product, $hostinfo_dict{$item}{"prodkey"}); + if($rst == 1) + { + return 0, "Test Store windows per-node key failed for node: $item"; + } + } + } $hostinfo_dict{$item}{"objtype"} = "node"; $hostinfo_dict{$item}{"groups"} = "__Managed"; if (exists $args_dict{'networkprofile'}){$hostinfo_dict{$item}{"groups"} .= ",".$args_dict{'networkprofile'}} @@ -2056,7 +2078,7 @@ sub validate_node_entry{ $errmsg .= "Node name $node_name already exists. You must use a new node name.\n"; } # Must specify either MAC or switch + port. - if (exists $node_entry{"mac"} || + if (exists $node_entry{"mac"} || exists $node_entry{"switch"} && exists $node_entry{"switchport"}){ } else{ $errmsg .= "MAC address, switch and port is not specified. You must specify the MAC address or switch and port.\n"; @@ -2090,6 +2112,20 @@ sub validate_node_entry{ #push the IP into allips list. $allips{$node_entry{$_}} = 0; } + }elsif ($_ eq "prodkey"){ + # Get node's provisioning os version + my $osimagename = xCAT::ProfiledNodeUtils->get_imageprofile_prov_method($args_dict{'imageprofile'}); + my ($osvers, $profile) = xCAT::ProfiledNodeUtils->get_imageprofile_prov_osvers($osimagename); + if (!($osvers =~ /^win/)){ + $errmsg .= "Specified Windows per-node key to a non-windows node is not acceptable\n"; + } + + # it will handle windows pernode key + if (!($node_entry{$_} =~ /\w{5}-\w{5}-\w{5}-\w{5}-\w{5}/)){ + $errmsg .= "Specified Windows per-node key $node_entry{$_} is not valid\n"; + } + #Transfer to capital + $node_entry{$_} = uc $node_entry{$_}; }elsif ($_ eq "switch"){ #TODO: xCAT switch discovery enhance: verify whether switch exists. if (! exists $allswitches{$node_entry{$_}}){