Class: Syskit::RobyApp::RESTDeploymentManager
- Defined in:
- lib/syskit/roby_app/rest_deployment_manager.rb
Overview
Management of the deployments for the REST API
Defined Under Namespace
Classes: AlreadyOverriden, CannotOverride, Forbidden, NotCreatedHere, NotFound, NotOrogen, NotOverriden, UsedInOverride
Instance Method Summary collapse
-
#clear ⇒ Object
Clear all overrides and new deployments.
-
#command_line(id, tracing: false, name_service_ip: 'localhost', working_directory: @conf.app.log_dir, loader: @conf.app.default_pkgconfig_loader) ⇒ Object
Returns the command line needed to start the given deployment with the given spawn options.
-
#created_here?(deployment) ⇒ Boolean
Whether this deployment has been created by this manager.
-
#deregister_deployment(id) ⇒ Boolean
Remove a deployment.
-
#deregister_override(id) ⇒ Boolean
Remove overrides created by #make_unmanaged.
-
#each_overriden_deployment(&block) ⇒ Object
Enumerate the deployments that are being overriden.
-
#find_new_deployment_by_id(id) ⇒ Object
Finds a newly defined deployment by ID.
-
#find_overriden_deployment_by_id(id) ⇒ Object
Finds an overriden deployment by ID.
-
#find_registered_deployment_by_id(id) ⇒ Object
Finds a registered deployment by ID.
-
#initialize(conf) ⇒ RESTDeploymentManager
constructor
A new instance of RESTDeploymentManager.
-
#make_unmanaged(id) ⇒ Array?
Change the configuration so that all tasks from the given deployment are declared as unmanaged.
-
#orogen_deployment?(deployment) ⇒ Boolean
Whether the given deployment is an oroGen deployment.
-
#overriden?(id) ⇒ Boolean
Whether the given deployment is already overriden.
-
#use_deployment(*names, **run_options) ⇒ Integer
Define a new deployment.
-
#used_in_override?(deployment) ⇒ Boolean
Whether the given deployment is used as override.
Constructor Details
#initialize(conf) ⇒ RESTDeploymentManager
Returns a new instance of RESTDeploymentManager
5 6 7 8 9 10 |
# File 'lib/syskit/roby_app/rest_deployment_manager.rb', line 5 def initialize(conf) @conf = conf @deployment_group = conf.deployment_group @new_deployments = Array.new @overrides = Hash.new end |
Instance Method Details
#clear ⇒ Object
Clear all overrides and new deployments
69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/syskit/roby_app/rest_deployment_manager.rb', line 69 def clear @overrides.delete_if do |original, overriden_by| overriden_by.delete_if do |c| @deployment_group.deregister_configured_deployment(c) true end @deployment_group.register_configured_deployment(original) true end @new_deployments.delete_if do |c| @deployment_group.deregister_configured_deployment(c) true end end |
#command_line(id, tracing: false, name_service_ip: 'localhost', working_directory: @conf.app.log_dir, loader: @conf.app.default_pkgconfig_loader) ⇒ Object
Returns the command line needed to start the given deployment with the given spawn options
The returned command line assumes that the Syskit process runs on the machine where it will be executed
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 |
# File 'lib/syskit/roby_app/rest_deployment_manager.rb', line 186 def command_line(id, tracing: false, name_service_ip: 'localhost', working_directory: @conf.app.log_dir, loader: @conf.app.default_pkgconfig_loader) deployment = find_registered_deployment_by_id(id) || find_overriden_deployment_by_id(id) if !deployment raise NotFound, "#{id} is not a known deployment" elsif !orogen_deployment?(deployment) raise NotOrogen, "#{id} is not an oroGen deployment, cannot generate a command line" end deployment.command_line( working_directory: working_directory, tracing: tracing, name_service_ip: name_service_ip, loader: loader) end |
#created_here?(deployment) ⇒ Boolean
Whether this deployment has been created by this manager
90 91 92 93 |
# File 'lib/syskit/roby_app/rest_deployment_manager.rb', line 90 def created_here?(deployment) @new_deployments.include?(deployment) || used_in_override?(deployment) end |
#deregister_deployment(id) ⇒ Boolean
Remove a deployment
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
# File 'lib/syskit/roby_app/rest_deployment_manager.rb', line 135 def deregister_deployment(id) deployment = find_new_deployment_by_id(id) if !deployment if deployment = find_registered_deployment_by_id(id) if used_in_override?(deployment) raise UsedInOverride, "#{id} has been created for the purpose of an override, cannot deregister it" else raise NotCreatedHere, "#{id} has not been registered through the REST API, cannot deregister it" end else raise NotFound, "#{id} is not a known deployment" end end @deployment_group.deregister_configured_deployment(deployment) @new_deployments.delete(deployment) end |
#deregister_override(id) ⇒ Boolean
Remove overrides created by #make_unmanaged
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
# File 'lib/syskit/roby_app/rest_deployment_manager.rb', line 156 def deregister_override(id) overriden_deployment = @overrides.keys.find { |c| c.object_id == id } if !overriden_deployment deployment = find_registered_deployment_by_id(id) if !deployment raise NotFound, "#{id} is not an existing deployment" else raise NotOverriden, "#{id} is not an overriden deployment, cannot deregister" end end overrides = @overrides[overriden_deployment] overrides.delete_if do |c| @deployment_group.deregister_configured_deployment(c) true end @overrides.delete(overriden_deployment) true end |
#each_overriden_deployment(&block) ⇒ Object
Enumerate the deployments that are being overriden
85 86 87 |
# File 'lib/syskit/roby_app/rest_deployment_manager.rb', line 85 def each_overriden_deployment(&block) @overrides.each_key(&block) end |
#find_new_deployment_by_id(id) ⇒ Object
Finds a newly defined deployment by ID
119 120 121 |
# File 'lib/syskit/roby_app/rest_deployment_manager.rb', line 119 def find_new_deployment_by_id(id) @new_deployments.find { |c| c.object_id == id } end |
#find_overriden_deployment_by_id(id) ⇒ Object
Finds an overriden deployment by ID
114 115 116 |
# File 'lib/syskit/roby_app/rest_deployment_manager.rb', line 114 def find_overriden_deployment_by_id(id) @overrides.keys.find { |c| c.object_id == id } end |
#find_registered_deployment_by_id(id) ⇒ Object
Finds a registered deployment by ID
108 109 110 111 |
# File 'lib/syskit/roby_app/rest_deployment_manager.rb', line 108 def find_registered_deployment_by_id(id) @deployment_group.each_configured_deployment. find { |c| c.object_id == id } end |
#make_unmanaged(id) ⇒ Array?
Change the configuration so that all tasks from the given deployment are declared as unmanaged
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/syskit/roby_app/rest_deployment_manager.rb', line 28 def make_unmanaged(id) # Define early to simplify the rescue clause overrides = [] configured_deployment = find_registered_deployment_by_id(id) if !configured_deployment if overriden?(id) raise AlreadyOverriden, "#{id} is already overriden, cannot override it again" else raise NotFound, "#{id} is not a known deployment" end elsif used_in_override?(configured_deployment) raise UsedInOverride, "#{id} is already used in an override, cannot override it" end @deployment_group.deregister_configured_deployment(configured_deployment) configured_deployment.each_orogen_deployed_task_context_model do |orogen_m| task_m = Syskit::TaskContext.find_model_by_orogen(orogen_m.task_model) @conf.process_server_config_for('unmanaged_tasks') new_deployments = @deployment_group.use_unmanaged_task( { task_m => orogen_m.name }, process_managers: @conf) # Update overrides at each iteration (instead of using a functional # construct) so that the rescue clause can undo the overrides that # have already been done when an exception is raised overrides.concat(new_deployments) end @overrides[configured_deployment] = overrides overrides.map(&:object_id) rescue Exception overrides.each do |c| @deployment_group.deregister_configured_deployment(c) end if configured_deployment @deployment_group.register_configured_deployment(configured_deployment) end raise end |
#orogen_deployment?(deployment) ⇒ Boolean
Whether the given deployment is an oroGen deployment
177 178 179 180 |
# File 'lib/syskit/roby_app/rest_deployment_manager.rb', line 177 def orogen_deployment?(deployment) manager = @conf.process_server_config_for(deployment.process_server_name) manager.client.kind_of?(Orocos::RemoteProcesses::Client) end |
#overriden?(id) ⇒ Boolean
Whether the given deployment is already overriden
96 97 98 |
# File 'lib/syskit/roby_app/rest_deployment_manager.rb', line 96 def overriden?(id) @overrides.keys.any? { |c| c.object_id == id } end |
#use_deployment(*names, **run_options) ⇒ Integer
Define a new deployment
126 127 128 129 130 |
# File 'lib/syskit/roby_app/rest_deployment_manager.rb', line 126 def use_deployment(*names, **) c = @deployment_group.use_deployment(*names, **).first @new_deployments << c c.object_id end |
#used_in_override?(deployment) ⇒ Boolean
Whether the given deployment is used as override
101 102 103 104 105 |
# File 'lib/syskit/roby_app/rest_deployment_manager.rb', line 101 def used_in_override?(deployment) @overrides.each_value.any? do |overrides| overrides.include?(deployment) end end |