Class: Syskit::RobyApp::RESTDeploymentManager

Inherits:
Object
  • Object
show all
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

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

#clearObject

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

Returns:

  • (Boolean)


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

Returns:

  • (Boolean)

    true if the deployment ID was valid, false otherwise



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

Returns:

  • (Boolean)

    true if the deployment ID was valid, false otherwise



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

Parameters:

Returns:

  • (Array, nil)

    the list of the IDs of the newly created deployments, or nil if the given ID does not match any registered deployment



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

Returns:

  • (Boolean)


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

Returns:

  • (Boolean)


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

Returns:

  • (Integer)

    the new deployment ID



126
127
128
129
130
# File 'lib/syskit/roby_app/rest_deployment_manager.rb', line 126

def use_deployment(*names, **run_options)
    c = @deployment_group.use_deployment(*names, **run_options).first
    @new_deployments << c
    c.object_id
end

#used_in_override?(deployment) ⇒ Boolean

Whether the given deployment is used as override

Returns:

  • (Boolean)


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