From d4178accc3789e88afc02ec484632173a607f414 Mon Sep 17 00:00:00 2001 From: Marga Millet Date: Wed, 10 Sep 2014 14:20:02 -0700 Subject: [PATCH] puppet-n1k-vsm project files missing Cisco stackforge/puppet-n1k-vsm misses some files and changes to succesfully start the puppet-n1k-vsm project. This commit addresses those changes to make sure we can start committing stuff to this project. Details of the changes: - Rake and Gemfile files are needed for gate tests. - Added the license and Modulefile files - Changed manifest files to pass lint case and initial Unit Testing. Change-Id: Ia65c8e09c9388709d1834ec7a4a120dfaef807ed --- .gitreview | 4 + Gemfile | 12 ++ LICENSE | 175 +++++++++++++++++ Modulefile | 11 ++ Rakefile | 7 + files/n1kv | 5 + files/repackiso.py | 20 +- manifests/deploy.pp | 98 +++++----- manifests/init.pp | 120 +++++++++--- manifests/pkgprep_ovscfg.pp | 375 +++++++++++++++++------------------- manifests/vsmprep.pp | 222 ++++++++++++--------- 11 files changed, 664 insertions(+), 385 deletions(-) create mode 100644 .gitreview create mode 100644 Gemfile create mode 100644 LICENSE create mode 100644 Modulefile create mode 100644 Rakefile create mode 100755 files/n1kv diff --git a/.gitreview b/.gitreview new file mode 100644 index 0000000..c071db6 --- /dev/null +++ b/.gitreview @@ -0,0 +1,4 @@ +[gerrit] +host=review.openstack.org +port=29418 +project=stackforge/puppet-n1k-vsm.git diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..8de9716 --- /dev/null +++ b/Gemfile @@ -0,0 +1,12 @@ +source 'https://rubygems.org' + +group :development, :test do + gem 'puppetlabs_spec_helper', :require => false + gem 'puppet-lint', '~> 0.3.2' +end + +if puppetversion = ENV['PUPPET_GEM_VERSION'] + gem 'puppet', puppetversion, :require => false +else + gem 'puppet', :require => false +end diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..67db858 --- /dev/null +++ b/LICENSE @@ -0,0 +1,175 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. diff --git a/Modulefile b/Modulefile new file mode 100644 index 0000000..e293773 --- /dev/null +++ b/Modulefile @@ -0,0 +1,11 @@ +name 'puppet-n1kv-vsm' +version '0.0.2' + +author 'ChingWei Chang, Marga Millet' +license 'Apache License 2.0' +project_page 'https://launchpad.net/puppet-n1k-vsm' +source 'https://github.com/stackforge/puppet-n1k-vsm' +summary 'Puppet module for Cisco Nexus1000v VSM' +description 'Puppet module to install and configure the Nexus1000v Virtual Supervisor module" + +dependency 'puppetlabs/vswitch', '>=0.0.9' diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..f01e55e --- /dev/null +++ b/Rakefile @@ -0,0 +1,7 @@ +require 'puppetlabs_spec_helper/rake_tasks' +require 'puppet-lint/tasks/puppet-lint' + +PuppetLint.configuration.fail_on_warnings = true +PuppetLint.configuration.send('disable_80chars') +PuppetLint.configuration.send('disable_class_parameter_defaults') +PuppetLint.configuration.send('disable_autoloader_layout') diff --git a/files/n1kv b/files/n1kv new file mode 100755 index 0000000..25c368b --- /dev/null +++ b/files/n1kv @@ -0,0 +1,5 @@ +#!/bin/sh + +/etc/init.d/network restart +systemctl start libvirtd.service + diff --git a/files/repackiso.py b/files/repackiso.py index f768fa8..317da1a 100755 --- a/files/repackiso.py +++ b/files/repackiso.py @@ -1,6 +1,5 @@ #!/usr/bin/python -import shutil, tempfile, os, optparse, logging -import sys +import shutil, tempfile, os, optparse, logging, sys usage = "usage: %prog [options]" parser = optparse.OptionParser(usage=usage) @@ -71,6 +70,8 @@ def createOvfEnvXmlFile(domain, gateway, hostname, ip, subnet, password, vsm_mod st += ' \n' st += ' \n' % (password) st += ' \n' % (vsm_mode) + st += ' \n' + st += ' \n' #if vsm_mode == "primary": # st += ' \n' % (vsm_mode) #else: @@ -100,25 +101,24 @@ def main(): cret = Command('/bin/mount -o loop -t iso9660 %s %s' % (isoimg, mntdir)).run() #logger.info("%s %s" % (cret.output, cret.error)) if cret.failed: - print(sys.argv[0], "1 ", cret.output, cret.error) + print(sys.argv[0], "Error: Unable to mount disk ", cret.output, cret.error) sys.exit(1) cret = Command('/bin/cp -r %s/* %s' % (mntdir, ddir)).run() - print(sys.argv[0], "2 cwchang X", cret.output, "X", cret.error,"X") + print(sys.argv[0], "Copying files ", cret.output, "X", cret.error,"X") if cret.failed: - print(sys.argv[0], "2 ", cret.output, cret.error) + print(sys.argv[0], "Error: Unable to copy files ", cret.output, cret.error) sys.exit(1) #logger.info("%s %s" % (cret.output, cret.error)) cret = Command('/bin/umount %s' % (mntdir)).run() if cret.failed: - print(sys.argv[0], "3 ", cret.output, cret.error) + print(sys.argv[0], "Error: Unable to unmont dir ", cret.output, cret.error) sys.exit(1) #logger.info("%s %s" % (cret.output, cret.error)) - #logger.info("%s %s" % (cret.output, cret.error)) cret = Command('/bin/cp %s %s/ovf-env.xml' % (ovf_f.name, ddir)).run() if cret.failed: - print(sys.argv[0], "4 ", cret.output, cret.error) + print(sys.argv[0], "Error: Unable to copy ovf file ", cret.output, cret.error) sys.exit(1) #logger.info("%s %s" % (cret.output, cret.error)) @@ -126,13 +126,13 @@ def main(): if os.path.exists('%s/isolinux/isolinux.bin' % (ddir)): cret = Command('cd %s; /usr/bin/mkisofs -uid 0 -gid 0 -J -R -A Cisco_Nexus_1000V_VSM -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -o %s .' % (ddir, repackediso)).run() if cret.failed: - print(sys.argv[0],"5 ", cret.output, cret.error) + print(sys.argv[0],"Error: Unable to create isofs ", cret.output, cret.error) sys.exit(1) #logger.info("%s %s" % (cret.output, cret.error)) else: cret = Command('cd %s; /usr/bin/mkisofs -uid 0 -gid 0 -J -R -A Cisco_Nexus_1000V_VSM -b boot/grub/iso9660_stage1_5 -no-emul-boot -boot-load-size 4 -boot-info-table -o %s .' % (ddir, repackediso)).run() if cret.failed: - print(sys.argv[0], "6 ", cret.output, cret.error) + print(sys.argv[0], "Error: Unable to create isofs grub ", cret.output, cret.error) sys.exit(1) #logger.info("%s %s" % (cret.output, cret.error)) diff --git a/manifests/deploy.pp b/manifests/deploy.pp index c07bc31..02e8898 100644 --- a/manifests/deploy.pp +++ b/manifests/deploy.pp @@ -1,76 +1,66 @@ -class n1k_vsm::deploy { - +# == Class: n1k_vsm::deploy +# +# This class that actually deploys a VSM VM in the server +# +# == Parameters: +# +# == Actions: +# +# == Requires: +# +# This depends of n1kv_vsm class to set some environmental variables +# +# == Sample Usage: +# +class n1k_vsm::deploy +{ #ensure tap interfaces and deploy the vsm + $ctrltap = 'vsm-ctrl0' + $mgmttap = 'vsm-mgmt0' + $pkttap = 'vsm-pkt0' - $ctrltap = $n1k_vsm::ctrlinterface[0] - $ctrlmac = $n1k_vsm::ctrlinterface[1] - $ctrlbridge = $n1k_vsm::ctrlinterface[2] - $mgmttap = $n1k_vsm::mgmtinterface[0] - $mgmtmac = $n1k_vsm::mgmtinterface[1] - $mgmtbridge = $n1k_vsm::mgmtinterface[2] - $pkttap = $n1k_vsm::pktinterface[0] - $pktmac = $n1k_vsm::pktinterface[1] - $pktbridge = $n1k_vsm::pktinterface[2] + #$diskfile = "/var/spool/vsm/${n1k_vsm::vsm_role}_disk" -# tapint {"$ctrltap": -# bridge => $ctrlbridge, -# ensure => present -# } -# -# tapint {"$mgmttap": -# bridge => $mgmtbridge, -# ensure => present -# } -# -# tapint {"$pkttap": -# bridge => $pktbridge, -# ensure => present -# } - - - $diskfile = "/var/spool/vsm/${n1k_vsm::role}_disk" - - exec { "Exec_create_disk": - command => "/usr/bin/qemu-img create -f raw $diskfile ${n1k_vsm::disksize}G", - unless => "/usr/bin/virsh list | grep -c ' ${n1k_vsm::vsmname} .* running'", + exec { 'Exec_create_disk': + command => "/usr/bin/qemu-img create -f raw ${n1k_vsm::diskfile} ${n1k_vsm::disksize}G", + unless => "/usr/bin/virsh list | grep -c ' ${n1k_vsm::vsmname} .* running'", } -> - exec {"Debug_Exec_create_disk_debug": - command => "${n1k_vsm::Debug_Print} \"[INFO]\nExec_create_disk /usr/bin/qemu-img create -f raw $diskfile ${n1k_vsm::disksize}G\" >> ${n1k_vsm::Debug_Log}", + exec { 'Debug_Exec_create_disk_debug': + command => "${n1k_vsm::Debug_Print} \"[INFO]\nExec_create_disk /usr/bin/qemu-img create -f raw ${n1k_vsm::diskfile} ${n1k_vsm::disksize}G\" >> ${n1k_vsm::Debug_Log}", } - $targetxmlfile = "/var/spool/vsm/vsm_${n1k_vsm::role}_deploy.xml" - file { "File_Target_XML_File": - path => "$targetxmlfile", - owner => 'root', - group => 'root', - mode => '666', + $targetxmlfile = "/var/spool/vsm/vsm_${n1k_vsm::vsm_role}_deploy.xml" + file { 'File_Target_XML_File': + path => $targetxmlfile, + owner => 'root', + group => 'root', + mode => '0666', content => template('n1k_vsm/vsm_vm.xml.erb'), - require => Exec["Exec_create_disk"], + require => Exec['Exec_create_disk'], } -> - exec {"Debug_File_Target_XML_FILE": - command => "${n1k_vsm::Debug_Print} \"[INFO]\nFile_Target_XML_File\n path=$targetxmlfile \n owner=root \n group=root \n mode=666 \n\" >> ${n1k_vsm::Debug_Log}", + exec { 'Debug_File_Target_XML_FILE': + command => "${n1k_vsm::Debug_Print} \"[INFO]\nFile_Target_XML_File\n path=${targetxmlfile} \n owner=root \n group=root \n mode=666 \n\" >> ${n1k_vsm::Debug_Log}", } - exec { "Exec_Create_VSM": - command => "/usr/bin/virsh define $targetxmlfile", - unless => "/usr/bin/virsh list | grep -c ' ${n1k_vsm::vsmname} .* running'", + exec { 'Exec_Create_VSM': + command => "/usr/bin/virsh define ${targetxmlfile} && /usr/bin/virsh autostart ${n1k_vsm::vsmname}", + unless => "/usr/bin/virsh list | grep -c ' ${n1k_vsm::vsmname} '", } -> - exec {"Debug_Exec_Create_VSM": - command => "${n1k_vsm::Debug_Print} \"[INFO]\nExec_Launch_VSM \n command=/bin/echo /usr/bin/virsh define $targetxmlfile \n unless=/usr/bin/virsh list --all | grep -c ' ${n1k_vsm::vsmname} ' \" >> ${n1k_vsm::Debug_Log}", + exec { 'Debug_Exec_Create_VSM': + command => "${n1k_vsm::Debug_Print} \"[INFO]\nExec_Launch_VSM \n command=/bin/echo /usr/bin/virsh define ${targetxmlfile} \n unless=/usr/bin/virsh list --all | grep -c ' ${n1k_vsm::vsmname} ' \" >> ${n1k_vsm::Debug_Log}", } - exec { "Exec_Launch_VSM": - command => "/usr/bin/virsh start ${n1k_vsm::vsmname}", - unless => "/usr/bin/virsh list --all | grep -c ' ${n1k_vsm::vsmname} .* running '", + exec { 'Exec_Launch_VSM': + command => "/usr/bin/virsh start ${n1k_vsm::vsmname}", + unless => "/usr/bin/virsh list --all | grep -c ' ${n1k_vsm::vsmname} .* running '", } -> - exec {"Debug_Exec_Launch_VSM": + exec { 'Debug_Exec_Launch_VSM': command => "${n1k_vsm::Debug_Print} \"[INFO]\nExec_Launch_VSM \n command=/bin/echo /usr/bin/virsh start ${n1k_vsm::vsmname} \n unless=/usr/bin/virsh list --all | grep -c ' ${n1k_vsm::vsmname} .* running' \" >> ${n1k_vsm::Debug_Log}", } - Exec["Exec_create_disk"] -> File["File_Target_XML_File"] -> Exec["Exec_Create_VSM"] -> Exec["Exec_Launch_VSM"] + Exec['Exec_create_disk'] -> File['File_Target_XML_File'] -> Exec['Exec_Create_VSM'] -> Exec['Exec_Launch_VSM'] } - diff --git a/manifests/init.pp b/manifests/init.pp index b546f96..5a0302a 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -1,46 +1,102 @@ +# == Class: n1k_vsm +# +# This class deploys a Nexus1000v VSM VEM in a server +# +# == Parameters: +# +# [*phy_if_bridge*] - Physical interface used for the bridge to connect outside the node +# +# [*phy_gateway*] - IP address of the default gateway for the external interface +# +# [*vsm_role*] - Role (primary/secondary) of the Nexus1000v VSM +# +# [*vsm_domain_id*] - Domain id of the Nexus1000v VSM +# +# [*vsm_admin_passwd*] - Password of admin user on the Nexus1000v VSM +# +# [*vsm_mgmt_ip*] - IP of the management interface on the Nexus1000v VSM +# +# [*vsm_mgmt_netmask*] - IP netmask of the management interface of the Nexus1000v VSM +# +# [*vsm_mgmt_gateway*] - IP of the default gateway for the management interface of the Nexus1000v VSM +# +# [*n1kv_source*] - Location where to get the Nexus1000v VSM ISO package +# +# [*n1kv_version*] - Version of the Nexus1000v VSM +# +# == Actions: +# +# == Requires: +# +# == Sample Usage: +# class n1k_vsm( - $configureovs = false, - $ovsbridge, - $physicalinterfaceforovs = 'enp1s0f0', - $nodeip, - $nodenetmask, - $nodegateway, - $vsmname, - $consolepts = 2, - $role = 'primary', - $domainid, - $adminpasswd, - $mgmtip, - $mgmtnetmask, - $mgmtgateway, - $ctrlinterface, - $mgmtinterface, - $pktinterface, - $memory = 4096000, - $vcpu = 2, - $disksize = 4, - $n1kv_source = "puppet:///modules/n1k_vsm/vsm.iso", - $n1kv_version = "latest", - ) -{ + $phy_if_bridge = 'enp1s0f0', + $phy_gateway, + $vsm_role = 'primary', + $vsm_domain_id, + $vsm_admin_passwd, + $vsm_mgmt_ip, + $vsm_mgmt_netmask, + $vsm_mgmt_gateway, + $n1kv_source = 'puppet:///modules/n1k_vsm/vsm.iso', + $n1kv_version = 'latest' +) { + # + # Network parameters + # + $ovsbridge = 'br-int' + $phy_ip_addr = inline_template("<%= scope.lookupvar('::ipaddress_${n1k_vsm::phy_if_bridge}') %>") + $phy_ip_mask = inline_template("<%= scope.lookupvar('::netmask_${n1k_vsm::phy_if_bridge}') %>") + #$gw_intf = inline_template("<%= scope.lookupvar('::gateway_device') %>") + $gw_intf = $n1k_vsm::phy_gateway - $imgfile = "/var/spool/vsm/${role}_repacked.iso" - $diskfile = "/var/spool/vsm/${role}_disk" + # + # VSM parameters + # + if $n1k_vsm::vsm_role == 'primary' { + $vsmname = 'vsm-p' + $mgmtip = $vsm_mgmt_ip + $mgmtnetmask = $vsm_mgmt_netmask + $mgmtgateway = $vsm_mgmt_gateway + } else { # secondary + $vsmname = 'vsm-s' + $mgmtip = '0.0.0.0' + $mgmtnetmask = '0.0.0.0' + $mgmtgateway = '0.0.0.0' + } + $consolepts = 2 + $memory = 4096000 + $vcpu = 2 + $disksize = 4 + $imgfile = "/var/spool/vsm/${n1k_vsm::vsm_role}_repacked.iso" + $diskfile = "/var/spool/vsm/${n1k_vsm::vsm_role}_disk" + + + $Debug_Print = '/usr/bin/printf' + $Debug_Log = '/tmp/n1kv_vsm_puppet.log' + + notify {"Arg: intf ${phy_if_bridge} vsm_role ${vsm_role} domainid ${vsm_domain_id}" : withpath => true} + notify {"ip ${phy_ip_addr} mask ${phy_ip_mask} gw ${n1k_vsm::phy_gateway}" : withpath => true} + notify {"gw_dv ${gw_intf} ovs ${ovsbridge} vsmname ${n1k_vsm::vsmname}" : withpath => true} + notify {"mgmtip ${n1k_vsm::mgmtip} vsm_mask ${n1k_vsm::mgmtnetmask} vsm_gw ${n1k_vsm::mgmtgateway}": withpath => false} - $Debug_Print = "/usr/bin/printf" - $Debug_Log = "/tmp/n1kv_vsm_puppet.log" # # Clean up debug log # - file {"File_$Debug_Log": - path => $Debug_Log, - ensure => "absent", + file {"File_${Debug_Log}": + ensure => 'absent', + path => $Debug_Log, +# } -> +# file_line { "Adding info to debug": +# path => $Debug_Log, +# line => "phy ${n1k_vsm::phy_if_bridge} ip ${n1k_vsm::phy_ip_addr} gw ${n1k_vsm:phy_gateway}", } include n1k_vsm::pkgprep_ovscfg include n1k_vsm::vsmprep include n1k_vsm::deploy - File["File_$Debug_Log"] -> Class['n1k_vsm::pkgprep_ovscfg'] -> Class['n1k_vsm::vsmprep'] -> Class['n1k_vsm::deploy'] + File["File_${Debug_Log}"] -> Class['n1k_vsm::pkgprep_ovscfg'] -> Class['n1k_vsm::vsmprep'] -> Class['n1k_vsm::deploy'] } diff --git a/manifests/pkgprep_ovscfg.pp b/manifests/pkgprep_ovscfg.pp index 9ee8cb9..0abc627 100644 --- a/manifests/pkgprep_ovscfg.pp +++ b/manifests/pkgprep_ovscfg.pp @@ -1,264 +1,253 @@ -class n1k_vsm::pkgprep_ovscfg { +# == Class: n1k_vsm::pkgprep_ovscfg +# +# This class prepares the packages and ovs bridge for the VSM VM +# +# == Parameters: +# +# None +# +# == Actions: +# +# == Requires: +# +# This requires n1k_vsm class to set some environmental variables +# +# == Sample Usage: +# +class n1k_vsm::pkgprep_ovscfg +{ + require n1k_vsm + include n1k_vsm # Definition of sync points - - $Sync_Point_KVM = "##SYNC_POINT_KVM" - $Sync_Point_Virsh_Network = "##SYNC_POINT_VIRSH_NETWORK" - case "$::osfamily" { - "RedHat": { + $Sync_Point_KVM = '##SYNC_POINT_KVM' + $Sync_Point_Virsh_Network = '##SYNC_POINT_VIRSH_NETWORK' + + case $::osfamily { + 'RedHat': { # - # Order indepedent resources + # Order indepedent resources # - service {"Service_network": - name => "network", - ensure => "running", - restart => "/sbin/service network restart || /bin/true", + service { 'Service_network': + ensure => running, + name => 'network', + restart => '/sbin/service network restart || /bin/true', } -> - exec {"Debug_Service_network": + exec { 'Debug_Service_network': command => "${n1k_vsm::Debug_Print} \"[INFO]\n Service_network\n name=network\n ensure=running\n enable=true\n restart=/sbin/service network restart\n\" >> ${n1k_vsm::Debug_Log}", } + + # # VSM dependent packages installation section # - # Eng note - # cwchang: Ideally we should have either of this logic - # 1. Have an iteration thru the package list in the $pkgs.each ... - # Somehow this syntax needs to turn on future parser by document - # 2. package resource should be able to run a name list - # Neither one works. We go for rudimentary one-by-one here for now. - # Pitfalls observed: - # 1. We cannot reassign variables for some reason - # 2. We cannot leave spaces in name - # qemu-kvm-rhev - package {"Package_qemu-kvm": - name => "qemu-kvm", - ensure => "installed", - before => Notify["$Sync_Point_KVM"], + package { 'Package_qemu-kvm': + ensure => installed, + name => 'qemu-kvm', + before => Notify[ $Sync_Point_KVM ], } -> - exec {"Debug_Package_qemu-kvm": + exec { 'Debug_Package_qemu-kvm': command => "${n1k_vsm::Debug_Print} \"[INFO]\n Package_qemu-kvm \n name=qemu-kvm \n ensure=installed\n\" >> ${n1k_vsm::Debug_Log}", } - package {"Package_virt-viewer": - name => "virt-viewer", - ensure => "installed", - before => Notify["$Sync_Point_KVM"], + package {'Package_libvirt': + ensure => installed, + name => 'libvirt', + before => Notify[ $Sync_Point_KVM ], } -> - exec {"Debug_Package_virt-viewer": - command => "${n1k_vsm::Debug_Print} \"[INFO]\n Package_virt-viewer \n name=virt-viewer \n ensure=installed \n\" >> ${n1k_vsm::Debug_Log}", - } - - package {"Package_virt-manager": - name => "virt-manager", - ensure => "installed", - before => Notify["$Sync_Point_KVM"], - } - -> - exec {"Debug_Package_virt-manager": - command => "${n1k_vsm::Debug_Print} \"[INFO]\n Package_virt-manager \n name=virt-manager \n ensure=installed\n\" >> ${n1k_vsm::Debug_Log}", - } - - package {"Package_libvirt": - name => "libvirt", - ensure => "installed", - before => Notify["$Sync_Point_KVM"], - } - -> - exec {"Debug_Package_libvirt": + exec { 'Debug_Package_libvirt': command => "${n1k_vsm::Debug_Print} \"[INFO]\n Package_libvirt \n name=libvirt \n ensure=installed\n\" >> ${n1k_vsm::Debug_Log}", } - - package {"Package_libvirt-python": - name => "libvirt-python", - ensure => "installed", - before => Notify["$Sync_Point_KVM"], + + package { 'Package_libvirt-python': + ensure => installed, + name => 'libvirt-python', + before => Notify[ $Sync_Point_KVM ], } -> - exec {"Debug_Package_libvirt-python": + exec { 'Debug_Package_libvirt-python': command => "${n1k_vsm::Debug_Print} \"[INFO]\n Package_libvirt-python \n name=libvirt-python \n ensure=installed\n\" >> ${n1k_vsm::Debug_Log}", } - - #package {"Package_python-virtinst": - # name => "python-virtinst", - # ensure => "installed", - # before => Notify["$Sync_Point_KVM"], - #} - #-> - #exec {"Debug_Package_python-virtinst": - # command => "${n1k_vsm::Debug_Print} \"[INFO]\n Package_python-virtinst \n name=python-virtinst \n ensure=installed \n\" >> ${n1k_vsm::Debug_Log}", - #} - #package {"Package_genisoimage": - # name => "genisoimage", - # ensure => "installed", - # before => Notify["$Sync_Point_KVM"], - #} - #-> - #exec {"Debug_Package_genisoimage": - # command => "${n1k_vsm::Debug_Print} \"[INFO]\n Package_genisoimage \n name=genisoimage \n ensure=installed \n\" >> ${n1k_vsm::Debug_Log}", - #} - - package {"Package_ebtables": - name => "ebtables", - #ensure => "purged", - ensure => "installed", - before => Notify["$Sync_Point_KVM"], + package { 'Package_ebtables': + ensure => installed, + name => 'ebtables', + before => Notify[ $Sync_Point_KVM ], } -> - exec {"Debug_Package_ebtables": + exec { 'Debug_Package_ebtables': command => "${n1k_vsm::Debug_Print} \"[INFO]\n Package_ebtables \n name=ebtables \n ensure=purged \n\" >> ${n1k_vsm::Debug_Log}", } - notify{"$Sync_Point_KVM":} + notify { $Sync_Point_KVM :} - service {"Service_libvirtd": - name => "libvirtd", - ensure => "running", + service { 'Service_libvirtd': + ensure => running, + name => 'libvirtd', } -> - exec {"Debug_Service_libvirtd": + exec { 'Debug_Service_libvirtd': command => "${n1k_vsm::Debug_Print} \"[INFO]\n Service_libvirtd\n name=libvirtd \n ensure=running \n\" >> ${n1k_vsm::Debug_Log}", } - + # - # Virsh network exec configuration section + # Virsh network exec configuration section # - exec {"Exec_removenet": - command => "/usr/bin/virsh net-destroy default || /bin/true", - unless => "/usr/bin/virsh net-info default | /bin/grep -c 'Active: .* no'", - before => Notify["$Sync_Point_Virsh_Network"], + exec { 'Exec_removenet': + command => '/usr/bin/virsh net-destroy default || /bin/true', + unless => '/usr/bin/virsh net-info default | /bin/grep -c \'Active: .* no\'', + before => Notify[ $Sync_Point_Virsh_Network ], } -> - exec {"Debug_Exec_removenet": + exec { 'Debug_Exec_removenet': command => "${n1k_vsm::Debug_Print} \"[INFO]\n Exec_removenet \n command=/usr/bin/virsh net-destroy default || /bin/true \n unless=/usr/bin/virsh net-info default | /bin/grep -c 'Active: .* no'\n\" >> ${n1k_vsm::Debug_Log}", } - exec {"Exec_disableautostart": - command => "/usr/bin/virsh net-autostart --disable default || /bin/true", - unless => "/usr/bin/virsh net-info default | /bin/grep -c 'Autostart: .* no'", - before => Notify["$Sync_Point_Virsh_Network"], + exec { 'Exec_disableautostart': + command => '/usr/bin/virsh net-autostart --disable default || /bin/true', + unless => '/usr/bin/virsh net-info default | /bin/grep -c \'Autostart: .* no\'', + before => Notify[ $Sync_Point_Virsh_Network ], } -> - exec {"Debug_Exec_disableautostart": - command => "${n1k_vsm::Debug_Print} \"[INFO]\n Exec_disableautostart' \n command=/usr/bin/virsh net-autostart --disable default || /bin/true \n unless /usr/bin/virsh net-info default | grep -c 'Autostart: .* no'\" >> ${n1k_vsm::Debug_Log}", + exec { 'Debug_Exec_disableautostart': + command => "${n1k_vsm::Debug_Print} \"[INFO]\n Exec_disableautostart \n command=/usr/bin/virsh net-autostart --disable default || /bin/true \n unless /usr/bin/virsh net-info default | grep -c 'Autostart: .* no'\" >> ${n1k_vsm::Debug_Log}", } - - notify{"$Sync_Point_Virsh_Network":} - package {"Package_openvswitch": - name => "openvswitch", - ensure => "installed", + notify{ $Sync_Point_Virsh_Network :} + + package { 'Package_openvswitch': + ensure => installed, + name => 'openvswitch', } -> - exec {"Debug_Package_openvswitch": + exec { 'Debug_Package_openvswitch': command => "${n1k_vsm::Debug_Print} \"[INFO]\n Package_openvswitch \n name=openvswitch \n ensure=installed\n\" >> ${n1k_vsm::Debug_Log}", } - # - # bring up OVS and perform interface configuration - # - service {"Service_openvswitch": - name => "openvswitch", - ensure => "running", - enable => "true", + # + # bring up OVS and perform interface configuration + # + service { 'Service_openvswitch': + ensure => running, + name => 'openvswitch', + enable => true, } -> - exec {"Debug_Service_openvswitch": + exec { 'Debug_Service_openvswitch': command => "${n1k_vsm::Debug_Print} \"[INFO]\n Service_openvswitch \n name=openvswitch \n ensure=running \n enable=true\n\" >> ${n1k_vsm::Debug_Log}", } - - exec {"Exec_AddOvsBr": - command => "/usr/bin/ovs-vsctl -- --may-exist add-br $n1k_vsm::ovsbridge", - } - -> - exec {"Debug_Exec_AddOvsBr": - command => "${n1k_vsm::Debug_Print} \"[INFO]\n Exec_AddOvsBr \n command=/usr/bin/ovs-vsctl -- --may-exist add-br $n1k_vsm::ovsbridge \n \" >> ${n1k_vsm::Debug_Log}", - } +# exec { 'Exec_AddOvsBr': +# command => "/usr/bin/ovs-vsctl -- --may-exist add-br ${n1k_vsm::ovsbridge}", +# } +# -> +# exec { 'Debug_Exec_AddOvsBr': +# command => "${n1k_vsm::Debug_Print} \"[INFO]\n Exec_AddOvsBr \n command=/usr/bin/ovs-vsctl -- --may-exist add-br ${n1k_vsm::ovsbridge} \n \" >> ${n1k_vsm::Debug_Log}", +# } - # - # Modify Ovs bridge inteface configuation file - # - augeas {"Augeas_modify_ifcfg-ovsbridge": - name => "$n1k_vsm::ovsbridge", - context => "/files/etc/sysconfig/network-scripts/ifcfg-$n1k_vsm::ovsbridge", - changes => [ - "set DEVICE $n1k_vsm::ovsbridge", - "set BOOTPROTO none", - "set IPADDR $n1k_vsm::nodeip", - "set NETMASK $n1k_vsm::nodenetmask", - "set ONBOOT yes", - "set TYPE OVSBridge", - "set DEVICETYPE ovs", - ], - notify => Service["Service_network"], - } - -> - exec {"Debug_Augeas_modify_ifcfg-ovsbridge": - command => "${n1k_vsm::Debug_Print} \"[INFO]\n Augeas_modify_ifcfg-$n1k_vsm::ovsbridge \n name=$n1k_vsm::ovsbridge \n context=/files/etc/sysconfig/network-scripts/ifcfg-$n1k_vsm::ovsbridge \n\" >> ${n1k_vsm::Debug_Log}", - } + notify { "Debug br ${n1k_vsm::ovsbridge} intf ${n1k_vsm::phy_if_bridge} ." : withpath => true } + notify { "Debug ${n1k_vsm::vsmname} ip ${n1k_vsm::phy_ip_addr} mask ${n1k_vsm::phy_ip_mask} gw_intf ${n1k_vsm::gw_intf}" : withpath => true } - # - # Modify Physical Interface config file - # - augeas {"Augeas_modify_ifcfg-physicalinterfaceforovs": - name => "$n1k_vsm::physicalinterfaceforovs", - context => "/files/etc/sysconfig/network-scripts/ifcfg-$n1k_vsm::physicalinterfaceforovs", - changes => [ - "set ONBOOT yes", - "set BOOTPROTO none", - "set TYPE OVSPort", - "set DEVICETYPE ovs", - "set OVS_BRIDGE $n1k_vsm::ovsbridge", - "rm IPADDR", - "rm NETMASK", - ], - } - -> - exec {"Debug_Augeas_modify_ifcfg-physicalinterfaceforovs": - command => "${n1k_vsm::Debug_Print} \"[INFO]\n Augeas_modify_ifcfg-physicalinterfaceforovs \n name=$n1k_vsm::physicalinterfaceforovs \n context=/files/etc/sysconfig/network-scripts/ifcfg-$n1k_vsm::physicalinterfaceforovs\n\" >> ${n1k_vsm::Debug_Log}", - } + # Check if we've already configured the ovs + if $n1k_vsm::gw_intf != $n1k_vsm::ovsbridge { + # + # Modify Ovs bridge inteface configuation file + # + augeas { 'Augeas_modify_ifcfg-ovsbridge': + name => $n1k_vsm::ovsbridge, + context => "/files/etc/sysconfig/network-scripts/ifcfg-${n1k_vsm::ovsbridge}", + changes => [ + 'set TYPE OVSBridge', + "set DEVICE ${n1k_vsm::ovsbridge}", + 'set DEVICETYPE ovs', + "set OVSREQUIRES ${n1k_vsm::ovsbridge}", + 'set NM_CONTROLLED no', + 'set BOOTPROTO none', + 'set ONBOOT yes', + 'set DEFROUTE yes', + 'set MTU 1500', + "set NAME ${n1k_vsm::ovsbridge}", + "set IPADDR ${n1k_vsm::phy_ip_addr}", + "set NETMASK ${n1k_vsm::phy_ip_mask}", + "set GATEWAY ${n1k_vsm::phy_gateway}", + 'set USERCTL no', + ], + #notify => Service["Service_network"], + } + -> + exec { 'Debug_Augeas_modify_ifcfg-ovsbridge': + command => "${n1k_vsm::Debug_Print} \"[INFO]\n Augeas_modify_ifcfg-${n1k_vsm::ovsbridge} \n name=${n1k_vsm::ovsbridge} \n context=/files/etc/sysconfig/network-scripts/ifcfg-${n1k_vsm::ovsbridge} \n\" >> ${n1k_vsm::Debug_Log}", + } - $intf=$n1k_vsm::physicalinterfaceforovs - $phy_bridge="/tmp/phy_bridge" - # - # Move physical port around from host bridge if any, to ovs bridge - # - #exec {"Exec_phy_bridge": - # command => "/usr/sbin/brctl show | /bin/grep $intf | /bin/sed 's/[\t ].*//' > $phy_bridge", - #} - #-> - #exec {"Debug_Exec_phy_bridge": - # command => "${n1k_vsm::Debug_Print} \"[INFO]\n Exec_phy_bridge \n /usr/sbin/brctl show | /bin/grep $intf | /bin/sed 's/[\t ].*//' > $phy_bridge \n \" >> ${n1k_vsm::Debug_Log}", - #} - - exec {"Exec_rebridge": - #command => "/usr/bin/test -s $phy_bridge && /usr/sbin/brctl delif \$(cat $phy_bridge) $intf || /bin/true; /usr/bin/ovs-vsctl -- --may-exist add-port $n1k_vsm::ovsbridge $intf", - command => "/usr/bin/ovs-vsctl -- --may-exist add-port $n1k_vsm::ovsbridge $intf", - #notify => Service["Service_network"], - } - -> - exec {"Debug_Exec_rebridge": - #command => "${n1k_vsm::Debug_Print} \"[INFO]\n Exec_rebridge \n /usr/bin/test -s $phy_bridge && /usr/sbin/brctl delif \$(cat $phy_bridge) $intf || /bin/true; /usr/bin/ovs-vsctl -- --may-exist add-port $n1k_vsm::ovsbridge $intf; /bin/rm -f $phy_bridge \n\" >> ${n1k_vsm::Debug_Log}", - command => "${n1k_vsm::Debug_Print} \"[INFO]\n Exec_rebridge \n /usr/bin/ovs-vsctl -- --may-exist add-port $n1k_vsm::ovsbridge $intf \n\" >> ${n1k_vsm::Debug_Log}", - } + # + # Modify Physical Interface config file + # + augeas { 'Augeas_modify_ifcfg-phy_if_bridge': + name => $n1k_vsm::phy_if_bridge, + context => "/files/etc/sysconfig/network-scripts/ifcfg-${n1k_vsm::phy_if_bridge}", + changes => [ + 'set TYPE OVSPort', + "set DEVICE ${n1k_vsm::phy_if_bridge}", + 'set DEVICETYPE ovs', + "set OVS_BRIDGE ${n1k_vsm::ovsbridge}", + 'set NM_CONTROLLED no', + 'set BOOTPROTO none', + 'set ONBOOT yes', + "set NAME ${n1k_vsm::phy_if_bridge}", + 'rm IPADDR', + 'rm NETMASK', + 'rm GATEWAY', + 'set USERCTL no', + ], + notify => Service['Service_network'], + } +# -> +# exec { 'Add default route': +# command => "/sbin/route add default gw ${n1k_vsm::phy_gw_ip} ${n1k_vsm::ovsbridge}", +# } + -> + exec { 'Debug_Augeas_modify_ifcfg-phy_if_bridge': + command => "${n1k_vsm::Debug_Print} \"[INFO]\n Augeas_modify_ifcfg-phy_if_bridge \n name=${n1k_vsm::phy_if_bridge} \n context=/files/etc/sysconfig/network-scripts/ifcfg-${n1k_vsm::phy_if_bridge}\n\" >> ${n1k_vsm::Debug_Log}", + } + # + # Make sure that networking comes fine after reboot + # + file { 'Create_Init_File': + replace => 'yes', + path => '/etc/init.d/n1kv', + owner => 'root', + group => 'root', + mode => '0775', + source => 'puppet:///modules/n1k_vsm/n1kv', +# content => '#!/bin/sh \n\n/etc/init.d/network restart \n/usr/lib/systemd/system/libvirtd.service restart \n\n', + } + -> + exec { 'Debug_File_Init': + command => '/usr/bin/ln -s /etc/init.d/n1kv /etc/rc.d/rc3.d/S98n1kv', + } + } # endif of if "${n1k_vsm::gw_intf}" != "${n1k_vsm::ovsbridge}" # # Order enforcement logic - # - #Notify["$Sync_Point_KVM"] -> Service["Service_libvirtd"] -> Notify["$Sync_Point_Virsh_Network"] -> Package["Package_openvswitch"] -> Service["Service_openvswitch"] -> Exec["Exec_AddOvsBr"]->Augeas["Augeas_modify_ifcfg-ovsbridge"]->Augeas["Augeas_modify_ifcfg-physicalinterfaceforovs"]->Exec["Exec_phy_bridge"]->Exec["Exec_rebridge"] - Notify["$Sync_Point_KVM"] -> Service["Service_libvirtd"] -> Notify["$Sync_Point_Virsh_Network"] -> Package["Package_openvswitch"] -> Service["Service_openvswitch"] -> Exec["Exec_AddOvsBr"]->Augeas["Augeas_modify_ifcfg-ovsbridge"]->Augeas["Augeas_modify_ifcfg-physicalinterfaceforovs"]->Exec["Exec_rebridge"] + # + if $n1k_vsm::gw_intf != $n1k_vsm::ovsbridge { + Notify[$Sync_Point_KVM]->Service['Service_libvirtd']->Notify[$Sync_Point_Virsh_Network]->Package['Package_openvswitch']->Service['Service_openvswitch']->Augeas['Augeas_modify_ifcfg-ovsbridge']->Augeas['Augeas_modify_ifcfg-phy_if_bridge']->File['Create_Init_File'] +#->Exec["Exec_rebridge"] + } else { + Notify[$Sync_Point_KVM]->Service['Service_libvirtd']->Notify[$Sync_Point_Virsh_Network]->Package['Package_openvswitch']->Service['Service_openvswitch'] + } } - "Ubuntu": { + 'Ubuntu': { } default: { # # bail out for unsupported OS # - fail(": os[$os] is not supported") + fail(": os[${::os}] is not supported") } } } + diff --git a/manifests/vsmprep.pp b/manifests/vsmprep.pp index 4c9ae86..4d64704 100644 --- a/manifests/vsmprep.pp +++ b/manifests/vsmprep.pp @@ -1,162 +1,192 @@ -class n1k_vsm::vsmprep { +# == Class: n1k_vsm::vsmprep +# +# This class prepares the VSM image to be deploy in a server +# +# == Parameters: +# +# None +# +# == Actions: +# +# == Requires: +# +# This class requires n1kv_vsm to set some environmental variables +# +# == Sample Usage: +# +class n1k_vsm::vsmprep +{ include 'stdlib' - + require n1k_vsm + include n1k_vsm + # # VSM package source parsing logic # $source = $n1k_vsm::n1kv_source - $source_method = regsubst($source, "^(.+):.*", '\1') + $sourcemethod = regsubst($source, '^(.+):.*', '\1') $dest = inline_template('<%= File.basename(source) %>') - $VSM_Bin_Prepare_Sync_Point="##VSM_BIN_PREPARE_SYNC_POINT" - $VSM_Spool_Dir="/var/spool/vsm" - $VSM_RPM_Install_Dir="/opt/cisco/vsm" - $VSM_Repackage_Script_Name="repackiso.py" - $VSM_Repackage_Script="/tmp/$VSM_Repackage_Script_Name" - $VSM_DEST="$VSM_Spool_Dir/$dest" - $VSM_PKG_NAME="nexus-1000v-vsm" - $VSM_ISO="vsm.iso" + $VSM_Bin_Prepare_Sync_Point='##VSM_BIN_PREPARE_SYNC_POINT' + $VSM_Spool_Dir='/var/spool/cisco/vsm' + $VSM_RPM_Install_Dir='/opt/cisco/vsm' + $VSM_Repackage_Script_Name='repackiso.py' + $VSM_Repackage_Script="/tmp/${VSM_Repackage_Script_Name}" + $VSM_DEST="${VSM_Spool_Dir}/${dest}" + $VSM_PKG_NAME='nexus-1000v-vsm' + $VSM_ISO='vsm.iso' # - # prepare vsm spool folder + # prepare vsm folders # - file {"File_VSM_Spool_Dir": - path => "$VSM_Spool_Dir", - ensure => "directory", - owner => "root", - group => "root", - mode => "664", + file { 'File_VSM_Spool_Dir': + ensure => directory, + path => $VSM_Spool_Dir, + owner => 'root', + group => 'root', + mode => '0664', } -> - exec {"Debug_File_VSM_Spool_Dir": - command => "${n1k_vsm::Debug_Print} \"[INFO]\n File_VSM_Spool_Dir\n path=$VSM_Spool_Dir \n ensure=directory \n owner=root \n group=root \n mode=664 \n\" >> ${n1k_vsm::Debug_Log}", + exec { 'Debug_File_VSM_Spool_Dir': + command => "${n1k_vsm::Debug_Print} \"[INFO]\n File_VSM_Spool_Dir\n path=${VSM_Spool_Dir} \n ensure=directory \n owner=root \n group=root \n mode=664 \n\" >> ${n1k_vsm::Debug_Log}", } + file { 'File_VSM_RPM_Dir': + ensure => directory, + path => $VSM_RPM_Install_Dir, + owner => 'root', + group => 'root', + mode => '0664', + } + -> + exec { 'Debug_File_VSM_RPM_Dir': + command => "${n1k_vsm::Debug_Print} \"[INFO]\n File_VSM_RPM_Install_Dir\n path=${VSM_RPM_Install_Dir} \n ensure=directory \n owner=root \n group=root \n mode=664 \n\" >> ${n1k_vsm::Debug_Log}", + } - case "$source_method" { - "http": { - yumrepo {"http-cisco-foreman": - baseurl => "$n1k_vsm::n1kv_source", - descr => "Internal repo for Foreman", - enabled => "1", - gpgcheck => "1", - proxy => "_none_", - gpgkey => "${n1k_vsm::n1kv_source}/RPM-GPG-KEY", + case $sourcemethod { + http: { + yumrepo { 'http-cisco-foreman': + baseurl => $n1k_vsm::n1kv_source, + descr => 'Internal repo for Foreman', + enabled => 1, + gpgcheck => 1, + proxy => '_none_', + gpgkey => "${n1k_vsm::n1kv_source}/RPM-GPG-KEY", } -> - package {"Package_VSM": - name => "$VSM_PKG_NAME", - ensure => "${n1k_vsm::n1kv_version}", - } - -> - exec {"Copy_VSM": - command => "/bin/cp $VSM_RPM_Install_Dir/*.iso $VSM_Spool_Dir/$VSM_ISO", - before => Notify["$VSM_Bin_Prepare_Sync_Point"], + package { 'Package_VSM': + ensure => $n1k_vsm::n1kv_version, + name => $VSM_PKG_NAME, } -> - exec {"Debug-http-cisco-os and Package_VSM": - command => "${n1k_vsm::Debug_Print} \"[INFO]\n Debug-http-cisco-os and Package_VSM \n baseurl=$n1k_vsm::n1kv_source \n descr=>Internal repo for Foreman \n enabled = 1 \n gpgcheck=1 \n gpgkey => $n1kv_source::n1kv_source/RPM-GPG-KEY\n\" >> ${n1k_vsm::Debug_Log}", + exec { 'Copy_VSM': + command => "/bin/cp ${VSM_RPM_Install_Dir}/*.iso ${VSM_Spool_Dir}/${VSM_ISO}", + before => Notify[ $VSM_Bin_Prepare_Sync_Point ], + } + -> + exec { 'Debug-http-cisco-os and Package_VSM': + command => "${n1k_vsm::Debug_Print} \"[INFO]\n Debug-http-cisco-os and Package_VSM \n baseurl=${n1k_vsm::n1kv_source} \n descr=>Internal repo for Foreman \n enabled = 1 \n gpgcheck=1 \n gpgkey => ${n1kv_source::n1kv_source}/RPM-GPG-KEY\n\" >> ${n1k_vsm::Debug_Log}", } } - "ftp": { - package {"ftp": - name => "ftp", - ensure => "installed", + ftp: { + package { 'ftp': + ensure => installed, + name => 'ftp', } -> - yumrepo {"ftp-cisco-foreman": - baseurl => "$n1k_vsm::n1kv_source", - descr => "Internal repo for Foreman", - enabled => "1", - gpgcheck => "1", - proxy => "_none_", - gpgkey => "${n1k_vsm::n1kv_source}/RPM-GPG-KEY", + yumrepo { 'ftp-cisco-foreman': + baseurl => $n1k_vsm::n1kv_source, + descr => 'Internal repo for Foreman', + enabled => 1, + gpgcheck => 1, + proxy => '_none_', + gpgkey => "${n1k_vsm::n1kv_source}/RPM-GPG-KEY", } -> - package {"Package_VSM": - name => "$VSM_PKG_NAME", - ensure => "${n1k_vsm::n1kv_version}", - } - -> - exec {"Copy_VSM": - command => "/bin/cp $VSM_RPM_Install_Dir/*.iso $VSM_Spool_Dir/$VSM_ISO", - before => Notify["$VSM_Bin_Prepare_Sync_Point"], + package { 'Package_VSM': + ensure => $n1k_vsm::n1kv_version, + name => $VSM_PKG_NAME, } -> - exec {"Debug-ftp-cisco-os and Package_VSM": - command => "${n1k_vsm::Debug_Print} \"[INFO]\n Debug-ftp-cisco-os and Package_VSM \n baseurl=$n1k_vsm::n1kv_source \n descr=>Internal repo for Foreman \n enabled = 1 \n gpgcheck=1 \n gpgkey => $n1kv_source::n1kv_source/RPM-GPG-KEY\n\" >> ${n1k_vsm::Debug_Log}", + exec { 'Copy_VSM': + command => "/bin/cp ${VSM_RPM_Install_Dir}/*.iso ${VSM_Spool_Dir}/${VSM_ISO}", + before => Notify[ $VSM_Bin_Prepare_Sync_Point ], } - + -> + exec { 'Debug-ftp-cisco-os and Package_VSM': + command => "${n1k_vsm::Debug_Print} \"[INFO]\n Debug-ftp-cisco-os and Package_VSM \n baseurl=${n1k_vsm::n1kv_source} \n descr=>Internal repo for Foreman \n enabled = 1 \n gpgcheck=1 \n gpgkey => ${n1kv_source::n1kv_source}/RPM-GPG-KEY\n\" >> ${n1k_vsm::Debug_Log}", + } + } - "puppet": { + puppet: { # # make sure the file does not exist # - exec {"File_VSM_Bin_Remove": - command => "/bin/rm -f $VSM_DEST || /bin/true", - before => Notify["$VSM_Bin_Prepare_Sync_Point"], + exec { 'File_VSM_Bin_Remove': + command => "/bin/rm -f ${VSM_DEST} || /bin/true", + before => Notify[ $VSM_Bin_Prepare_Sync_Point ], } -> - file {"File_VSM_Bin_Prepare": - path => "$VSM_DEST", - ensure => "present", - owner => "root", - group => "root", - mode => "664", - source => "$n1k_vsm::n1kv_source", - before => Notify["$VSM_Bin_Prepare_Sync_Point"], + file { 'File_VSM_Bin_Prepare': + ensure => present, + path => $VSM_DEST, + owner => 'root', + group => 'root', + mode => '0664', + source => $n1k_vsm::n1kv_source, + before => Notify[ $VSM_Bin_Prepare_Sync_Point ], } -> - exec {"Exec_RPM_TO_ISO": + exec { 'Exec_RPM_TO_ISO': # # If it's an RPM, we do a local rpm installation ..." # - command => "/bin/rpm -i --force $VSM_DEST && /bin/cp $VSM_RPM_Install_Dir/*.iso $VSM_Spool_Dir/$VSM_ISO", - unless => "/usr/bin/file $VSM_DEST | /bin/grep -c ' ISO '", - before => Notify["$VSM_Bin_Prepare_Sync_Point"], + command => "/bin/rpm -i --force ${VSM_DEST} && /bin/cp ${VSM_RPM_Install_Dir}/*.iso ${VSM_Spool_Dir}/${VSM_ISO}", + unless => '/usr/bin/file $VSM_DEST | /bin/grep -c \' ISO \'', + before => Notify[ $VSM_Bin_Prepare_Sync_Point], } -> - exec {"Debug_File_VSM_Bin_Prepare_Exec_RPM_TO_ISO": - command => "${n1k_vsm::Debug_Print} \"[INFO]\n Debug_File_VSM_Bin_Prepare_Exec_RPM_TO_ISO \n path=$VSM_DEST \n ensure=directory \n owner=root\n group=root\n mode=664\n source=$n1k_vsm::n1kv_source\n \" >> ${n1k_vsm::Debug_Log}", + exec { 'Debug_File_VSM_Bin_Prepare_Exec_RPM_TO_ISO': + command => "${n1k_vsm::Debug_Print} \"[INFO]\n Debug_File_VSM_Bin_Prepare_Exec_RPM_TO_ISO \n path=${VSM_DEST} \n ensure=directory \n owner=root\n group=root\n mode=664\n source=${n1k_vsm::n1kv_source}\n \" >> ${n1k_vsm::Debug_Log}", } } default: { - fail(": Unknown sourcing method [$source_method] is not supported") + fail(": Unknown sourcing method [${sourcemethod}] is not supported") } } - notify {"$VSM_Bin_Prepare_Sync_Point":} - + notify { $VSM_Bin_Prepare_Sync_Point :} + # # copy repackiso.py to local place # - file {"File_VSM_Repackage_Script_Name": - path => "$VSM_Repackage_Script", - ensure => "present", - owner => "root", - group => "root", - mode => "774", - source => "puppet:///modules/n1k_vsm/$VSM_Repackage_Script_Name", + file { 'File_VSM_Repackage_Script_Name': + ensure => present, + path => $VSM_Repackage_Script, + owner => 'root', + group => 'root', + mode => '0774', + source => "puppet:///modules/n1k_vsm/${VSM_Repackage_Script_Name}", } -> - exec {"Debug_File_VSM_Repackage_Script_Name": - command => "${n1k_vsm::Debug_Print} \"[INFO]\n Debug_VSM_Repackage_Script_Name \n path=$VSM_Repackage_Script \n ensure=present \n owner=root \n group=root \n mode=774\n source=puppet:///modules/n1k_vsm/$VSM_REPACKAGE_SCRIPT_NAME \n\" >> ${n1k_vsm::Debug_Log}", + exec { 'Debug_File_VSM_Repackage_Script_Name': + command => "${n1k_vsm::Debug_Print} \"[INFO]\n Debug_VSM_Repackage_Script_Name \n path=${VSM_Repackage_Script} \n ensure=present \n owner=root \n group=root \n mode=774\n source=puppet:///modules/n1k_vsm/${VSM_Repackage_Script_Name} \n\" >> ${n1k_vsm::Debug_Log}", } # # Now generate ovf xml file and repackage the iso # - exec {"Exec_VSM_Repackage_Script_Name": - command => "${VSM_Repackage_Script} -i$VSM_Spool_Dir/$VSM_ISO -d${n1k_vsm::domainid} -n${n1k_vsm::vsmname} -m${n1k_vsm::mgmtip} -s${n1k_vsm::mgmtnetmask} -g${n1k_vsm::mgmtgateway} -p${n1k_vsm::adminpasswd} -r${n1k_vsm::role} -f${VSM_Spool_Dir}/${n1k_vsm::role}_repacked.iso >> ${n1k_vsm::Debug_Log}", + exec { 'Exec_VSM_Repackage_Script_Name': + command => "${VSM_Repackage_Script} -i${VSM_Spool_Dir}/${VSM_ISO} -d${n1k_vsm::vsm_domain_id} -n${n1k_vsm::vsmname} -m${n1k_vsm::mgmtip} -s${n1k_vsm::mgmtnetmask} -g${n1k_vsm::mgmtgateway} -p${n1k_vsm::vsm_admin_passwd} -r${n1k_vsm::vsm_role} -f${VSM_Spool_Dir}/${n1k_vsm::vsm_role}_repacked.iso >> ${n1k_vsm::Debug_Log}", } -> - exec {"Debug_Exec_VSM_Repackage_Script_Name": - command => "${n1k_vsm::Debug_Print} \"[INFO]\n Exec_VSM_Repackage_Script_Name\n command=$VSM_Repackage_Script -i$VSM_ISO -d${n1k_vsm::domainid} -n${n1k_vsm::vsmname} -m${n1k_vsm::mgmtip} -s${n1k_vsm::mgmtnetmask} -g${n1k_vsm::mgmtgateway} -p${n1k_vsm::adminpasswd} -r${n1k_vsm::role} -f${VSM_Spool_Dir}/${n1k_vsm::role}_repacked.iso \n\" >> ${n1k_vsm::Debug_Log}" + exec { 'Debug_Exec_VSM_Repackage_Script_Name': + command => "${n1k_vsm::Debug_Print} \"[INFO]\n Exec_VSM_Repackage_Script_Name\n command=${VSM_Repackage_Script} -i${VSM_ISO} -d${n1k_vsm::vsm_domain_id} -n${n1k_vsm::vsmname} -m${n1k_vsm::mgmtip} -s${n1k_vsm::mgmtnetmask} -g${n1k_vsm::mgmtgateway} -p${n1k_vsm::vsm_admin_passwd} -r${n1k_vsm::vsm_role} -f${VSM_Spool_Dir}/${n1k_vsm::vsm_role}_repacked.iso \n\" >> ${n1k_vsm::Debug_Log}" } - File["File_VSM_Spool_Dir"]-> Notify["$VSM_Bin_Prepare_Sync_Point"]->File["File_VSM_Repackage_Script_Name"]->Exec["Exec_VSM_Repackage_Script_Name"] + File['File_VSM_Spool_Dir']->File['File_RPM_Install_Dir']->Notify[$VSM_Bin_Prepare_Sync_Point]->File['File_VSM_Repackage_Script_Name']->Exec['Exec_VSM_Repackage_Script_Name'] }