Class: Bolt::ProjectManager
- Inherits:
-
Object
- Object
- Bolt::ProjectManager
- Defined in:
- lib/bolt/project_manager.rb,
lib/bolt/project_manager/migrator.rb,
lib/bolt/project_manager/config_migrator.rb,
lib/bolt/project_manager/module_migrator.rb,
lib/bolt/project_manager/inventory_migrator.rb
Defined Under Namespace
Classes: ConfigMigrator, InventoryMigrator, Migrator, ModuleMigrator
Constant Summary collapse
- INVENTORY_TEMPLATE =
<<~INVENTORY # This is an example inventory.yaml # To read more about inventory files, see https://pup.pt/bolt-inventory # # groups: # - name: linux # targets: # - target1.example.com # - target2.example.com # config: # transport: ssh # ssh: # private-key: /path/to/private_key.pem # - name: windows # targets: # - name: win1 # uri: target3.example.com # - name: win2 # uri: target4.example.com # config: # transport: winrm # config: # ssh: # host-key-check: false # winrm: # user: Administrator # password: Bolt! # ssl: false INVENTORY
Instance Method Summary collapse
-
#create(path, name, modules) ⇒ Object
Creates a new project at the specified directory.
-
#initialize(config, outputter, pal) ⇒ ProjectManager
constructor
A new instance of ProjectManager.
-
#migrate ⇒ Object
Migrates a project to use the latest file versions and best practices.
Constructor Details
#initialize(config, outputter, pal) ⇒ ProjectManager
Returns a new instance of ProjectManager.
39 40 41 42 43 |
# File 'lib/bolt/project_manager.rb', line 39 def initialize(config, outputter, pal) @config = config @outputter = outputter @pal = pal end |
Instance Method Details
#create(path, name, modules) ⇒ Object
Creates a new project at the specified directory.
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
# File 'lib/bolt/project_manager.rb', line 47 def create(path, name, modules) require 'bolt/module_installer' project = Pathname.new(File.(path)) old_config = project + 'bolt.yaml' config = project + 'bolt-project.yaml' puppetfile = project + 'Puppetfile' moduledir = project + '.modules' inventoryfile = project + 'inventory.yaml' project_name = name || File.basename(project) if config.exist? if modules command = Bolt::Util.powershell? ? 'Add-BoltModule -Module' : 'bolt module add' raise Bolt::Error.new( "Found existing project directory with #{config.basename} at #{project}, "\ "unable to initialize project with modules. To add modules to the project, "\ "run '#{command} <module>' instead.", 'bolt/existing-project-error' ) else raise Bolt::Error.new( "Found existing project directory with #{config.basename} at #{project}, "\ "unable to initialize project.", 'bolt/existing-project-error' ) end elsif old_config.exist? command = Bolt::Util.powershell? ? 'Update-BoltProject' : 'bolt project migrate' raise Bolt::Error.new( "Found existing project directory with #{old_config.basename} at #{project}, "\ "unable to initialize project. #{old_config.basename} is deprecated. To "\ "update the project to current best practices, run '#{command}'.", 'bolt/existing-project-error' ) elsif modules && puppetfile.exist? raise Bolt::Error.new( "Found existing Puppetfile at #{puppetfile}, unable to initialize project "\ "with modules.", 'bolt/existing-puppetfile-error' ) elsif project_name !~ Bolt::Module::MODULE_NAME_REGEX if name raise Bolt::ValidationError, "The provided project name '#{project_name}' is invalid; project name must "\ "begin with a lowercase letter and can include lowercase letters, "\ "numbers, and underscores." else command = Bolt::Util.powershell? ? 'New-BoltProject -Name' : 'bolt project init' raise Bolt::ValidationError, "The current directory name '#{project_name}' is an invalid project name. "\ "Please specify a name using '#{command} <name>'." end end # If modules were specified, resolve and install first. We want to error # early here and not initialize the project if the modules cannot be # resolved and installed. if modules @outputter.start_spin Bolt::ModuleInstaller.new(@outputter, @pal).install(modules, puppetfile, moduledir) @outputter.stop_spin end data = { 'name' => project_name } data['modules'] = modules || [] begin File.write(config.to_path, data.to_yaml) rescue StandardError => e raise Bolt::FileError.new("Could not create bolt-project.yaml at #{project}: #{e.}", nil) end unless inventoryfile.exist? begin File.write(inventoryfile.to_path, INVENTORY_TEMPLATE) rescue StandardError => e raise Bolt::FileError.new("Could not create inventory.yaml at #{project}: #{e.}", nil) end end @outputter.("Successfully created Bolt project at #{project}") 0 end |
#migrate ⇒ Object
Migrates a project to use the latest file versions and best practices.
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
# File 'lib/bolt/project_manager.rb', line 135 def migrate unless $stdin.tty? raise Bolt::Error.new( "stdin is not a tty, unable to migrate project", 'bolt/stdin-not-a-tty-error' ) end @outputter.("Migrating project #{@config.project.path}\n\n") @outputter.print_action_step( "Migrating a Bolt project might make irreversible changes to the project's "\ "configuration and inventory files. Before continuing, make sure the "\ "project has a backup or uses a version control system." ) return 0 unless Bolt::Util.prompt_yes_no("Continue with project migration?", @outputter) @outputter.('') ok = migrate_inventory && migrate_config && migrate_modules if ok @outputter.("Project successfully migrated") else @outputter.print_error("Project could not be migrated completely") end ok ? 0 : 1 end |