foreman_google 0.0.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +16 -4
- data/app/controllers/concerns/foreman/controller/parameters/compute_resource_extension.rb +21 -0
- data/app/controllers/foreman_google/api/v2/apipie_extensions.rb +16 -0
- data/app/controllers/foreman_google/api/v2/compute_resources_extensions.rb +22 -0
- data/app/lib/foreman_google/google_compute_adapter.rb +178 -0
- data/app/lib/google_cloud_compute/compute_attributes.rb +98 -0
- data/app/lib/google_cloud_compute/compute_collection.rb +23 -0
- data/app/lib/google_extensions/attached_disk.rb +22 -0
- data/app/models/concerns/foreman_google/host_managed_extensions.rb +11 -0
- data/app/models/foreman_google/gce.rb +102 -38
- data/app/models/foreman_google/google_compute.rb +68 -58
- data/app/views/compute_resources/form/_gce.html.erb +10 -0
- data/app/views/compute_resources/show/_gce.html.erb +0 -0
- data/app/views/compute_resources_vms/form/gce/_base.html.erb +18 -0
- data/app/views/compute_resources_vms/form/gce/_volume.html.erb +5 -0
- data/app/views/compute_resources_vms/index/_gce.html.erb +26 -0
- data/app/views/compute_resources_vms/show/_gce.html.erb +21 -0
- data/app/views/images/form/_gce.html.erb +3 -0
- data/db/migrate/20220331113745_foreman_gce_to_foreman_google_gce.rb +24 -0
- data/lib/foreman_google/engine.rb +10 -2
- data/lib/foreman_google/version.rb +1 -1
- data/locale/action_names.rb +6 -0
- data/locale/en/foreman_google.edit.po +116 -0
- data/locale/en/foreman_google.po +74 -2
- data/locale/en/foreman_google.po.time_stamp +0 -0
- data/locale/foreman_google.pot +112 -8
- data/locale/gemspec.rb +1 -1
- data/package.json +7 -7
- data/test/fixtures/disks_delete.json +14 -0
- data/test/fixtures/disks_get.json +13 -0
- data/test/fixtures/disks_insert.json +12 -0
- data/test/fixtures/instance.json +1 -1
- data/test/fixtures/instance_insert.json +15 -0
- data/test/fixtures/instance_list.json +86 -0
- data/test/fixtures/instance_set_disk_auto_delete.json +14 -0
- data/test/fixtures/operation_error.json +26 -0
- data/test/fixtures/operation_get.json +13 -0
- data/test/models/foreman_google/gce_test.rb +43 -5
- data/test/models/foreman_google/google_compute_test.rb +90 -32
- data/test/unit/foreman_google/google_compute_adapter_test.rb +103 -4
- data/test/unit/google_extensions/attached_disk_test.rb +17 -0
- data/webpack/global_index.js +2 -13
- data/webpack/legacy.js +16 -0
- metadata +66 -16
- data/app/controllers/concerns/foreman_google/temporary_prepend_path.rb +0 -16
- data/lib/foreman_google/google_compute_adapter.rb +0 -91
@@ -1,25 +1,19 @@
|
|
1
|
+
require 'google/apis/compute_v1'
|
2
|
+
|
1
3
|
module ForemanGoogle
|
2
4
|
class GoogleCompute
|
3
|
-
attr_reader :identity, :name, :hostname, :machine_type, :network_interfaces,
|
4
|
-
:associate_external_ip, :image_id, :disks, :metadata
|
5
|
+
attr_reader :identity, :name, :hostname, :creation_timestamp, :machine_type, :network_interfaces, :volumes,
|
6
|
+
:associate_external_ip, :network, :zone, :zone_name, :image_id, :disks, :metadata
|
5
7
|
|
6
|
-
|
7
|
-
def initialize(client:, zone:, identity: nil, args: {})
|
8
|
+
def initialize(client:, zone:, identity: nil, instance: nil, args: {})
|
8
9
|
@client = client
|
9
10
|
@zone = zone
|
10
11
|
@identity = identity
|
12
|
+
@instance = instance
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
@machine_type = args[:machine_type]
|
15
|
-
@network_interfaces = construct_network(args[:network] || 'default', args[:associate_external_ip] || '0', args[:network_interfaces] || [])
|
16
|
-
@image_id = args[:image_id]
|
17
|
-
@disks = load_disks(args[:image_id], args[:volumes])
|
18
|
-
@metadata = construct_metadata(args[:user_data])
|
19
|
-
|
20
|
-
identity && load
|
14
|
+
load if identity && instance.nil?
|
15
|
+
load_attributes(args)
|
21
16
|
end
|
22
|
-
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
23
17
|
|
24
18
|
def persisted?
|
25
19
|
!!identity
|
@@ -38,8 +32,9 @@ module ForemanGoogle
|
|
38
32
|
# @returns [String] one of PROVISIONING, STAGING, RUNNING, STOPPING, SUSPENDING, SUSPENDED, REPAIRING, and TERMINATED
|
39
33
|
# if nil, instance is not persisted as VM on GCE
|
40
34
|
def status
|
41
|
-
persisted? && instance.status
|
35
|
+
persisted? && @instance.status
|
42
36
|
end
|
37
|
+
alias_method :state, :status
|
43
38
|
|
44
39
|
def start
|
45
40
|
raise Foreman::Exception('unable to start machine that is not persisted') unless persisted?
|
@@ -52,76 +47,91 @@ module ForemanGoogle
|
|
52
47
|
end
|
53
48
|
|
54
49
|
def to_s
|
50
|
+
@name
|
55
51
|
end
|
56
52
|
|
57
53
|
def interfaces
|
58
54
|
@network_interfaces
|
59
55
|
end
|
60
56
|
|
61
|
-
def
|
57
|
+
def create_volumes
|
58
|
+
@volumes.each do |vol|
|
59
|
+
@client.insert_disk(@zone, vol.insert_attrs)
|
60
|
+
wait_for { @client.disk(@zone, vol.device_name).status == 'READY' }
|
61
|
+
end
|
62
62
|
end
|
63
63
|
|
64
|
-
def
|
65
|
-
@
|
64
|
+
def destroy_volumes
|
65
|
+
@volumes.each do |volume|
|
66
|
+
@client.delete_disk(@zone, volume.device_name)
|
67
|
+
end
|
66
68
|
end
|
67
69
|
|
68
|
-
|
70
|
+
def create_instance
|
71
|
+
args = GoogleCloudCompute::ComputeAttributes.new(@client).for_create(self)
|
72
|
+
@client.insert_instance(@zone, args)
|
73
|
+
end
|
69
74
|
|
70
|
-
def
|
71
|
-
|
72
|
-
@instance || load
|
75
|
+
def set_disk_auto_delete
|
76
|
+
@client.set_disk_auto_delete(@zone, @name)
|
73
77
|
end
|
74
78
|
|
75
|
-
def
|
76
|
-
@
|
79
|
+
def pretty_machine_type
|
80
|
+
return @machine_type unless @instance
|
81
|
+
@instance.machine_type.split('/').last
|
77
82
|
end
|
78
83
|
|
79
|
-
def
|
80
|
-
|
84
|
+
def vm_description
|
85
|
+
pretty_machine_type
|
81
86
|
end
|
82
87
|
|
83
|
-
def
|
84
|
-
|
85
|
-
# assign ephemeral external IP address using associate_external_ip
|
86
|
-
if ActiveModel::Type::Boolean.new.cast(associate_external_ip)
|
87
|
-
network_interfaces = [{ network: 'global/networks/default' }] if network_interfaces.empty?
|
88
|
-
access_config = { name: 'External NAT', type: 'ONE_TO_ONE_NAT' }
|
88
|
+
def vm_ip_address
|
89
|
+
return if @instance.network_interfaces.empty?
|
89
90
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
91
|
+
@instance.network_interfaces.first.access_configs.first&.nat_i_p
|
92
|
+
end
|
93
|
+
alias_method :public_ip_address, :vm_ip_address
|
94
|
+
|
95
|
+
def private_ip_address
|
96
|
+
return unless @instance.network_interfaces.any?
|
95
97
|
|
96
|
-
|
97
|
-
[{ network: network }]
|
98
|
+
@instance.network_interfaces.first.network_i_p
|
98
99
|
end
|
99
100
|
|
100
|
-
def
|
101
|
-
return unless
|
101
|
+
def pretty_image_name
|
102
|
+
return unless @instance.disks.any?
|
103
|
+
|
104
|
+
disk_name = @instance.disks.first.source.split('/').last
|
105
|
+
image_name = @client.disk(@zone_name, disk_name).source_image
|
102
106
|
|
103
|
-
|
104
|
-
raise ::Foreman::Exception, N_('selected image does not exist') if image.nil?
|
105
|
-
image
|
107
|
+
image_name.split('/').last
|
106
108
|
end
|
107
109
|
|
108
|
-
def
|
109
|
-
|
110
|
-
image = load_image(image_id)
|
110
|
+
def volumes_attributes=(_attrs)
|
111
|
+
end
|
111
112
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
113
|
+
def serial_port_output
|
114
|
+
@client.serial_port_output(@zone, @identity)&.contents
|
115
|
+
end
|
116
|
+
|
117
|
+
def ip_addresses
|
118
|
+
[vm_ip_address, private_ip_address]
|
119
|
+
end
|
120
|
+
|
121
|
+
def wait_for(&block)
|
122
|
+
@client.wait_for(&block)
|
123
|
+
end
|
124
|
+
|
125
|
+
private
|
126
|
+
|
127
|
+
def load
|
128
|
+
@instance = @client.instance(@zone.split('/').last, identity)
|
118
129
|
end
|
119
130
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
{ items: [{ key: 'user-data', value: user_data }] }
|
131
|
+
def load_attributes(args_for_new)
|
132
|
+
klass = GoogleCloudCompute::ComputeAttributes.new(@client)
|
133
|
+
attrs = @instance ? klass.for_instance(@instance) : klass.for_new(args_for_new)
|
134
|
+
attrs.each { |name, value| instance_variable_set("@#{name}", value) }
|
125
135
|
end
|
126
136
|
end
|
127
137
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<%= http_proxy_field f %>
|
2
|
+
|
3
|
+
<%= textarea_f f, :password, :label => _("JSON key"),
|
4
|
+
:help_inline => file_field(:password, :json, accept: "application/JSON", onchange: 'tfm.gce.jsonLoader(this)'),
|
5
|
+
:id => 'gce_json', :class => 'col-md-8' %>
|
6
|
+
|
7
|
+
<% zones = f.object.zones rescue [] %>
|
8
|
+
|
9
|
+
<%= selectable_f(f, :zone, zones, {}, {:label => _('Zone'), :disabled => zones.empty?,
|
10
|
+
:help_inline_permanent => load_button_f(f, zones.any?, _("Load Zones")) }) %>
|
File without changes
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<%= select_f f, :machine_type, compute_resource.machine_types, :name, :name,
|
2
|
+
{ :selected => f.object.pretty_machine_type },
|
3
|
+
{ :label => _('Machine type'), :label_size => "col-md-2" } %>
|
4
|
+
|
5
|
+
<% if controller_name != "compute_attributes" %>
|
6
|
+
<%
|
7
|
+
arch ||= nil ; os ||= nil
|
8
|
+
images = possible_images(compute_resource, arch, os)
|
9
|
+
%>
|
10
|
+
<div id='image_selection'>
|
11
|
+
<%= select_f f, :image_id, images, :uuid, :name,
|
12
|
+
{ :include_blank => (images.empty? || images.size == 1) ? false : _('Please select an image') },
|
13
|
+
{ :disabled => images.empty?, :label => _('Image'), :label_size => "col-md-2" } %>
|
14
|
+
</div>
|
15
|
+
<% end %>
|
16
|
+
|
17
|
+
<%= selectable_f f, :network, compute_resource.networks, {}, :label => _('Network'), :label_size => "col-md-2" %>
|
18
|
+
<%= checkbox_f f, :associate_external_ip, :label => _('Associate Ephemeral External IP'), :label_size => "col-md-2" %>
|
@@ -0,0 +1,5 @@
|
|
1
|
+
<%
|
2
|
+
# For backwards compatibility, Fog has :size_gb, Google has :disk_size_gb
|
3
|
+
field_name = f.object.class == Google::Cloud::Compute::V1::AttachedDisk ? :disk_size_gb : :size_gb
|
4
|
+
%>
|
5
|
+
<%= text_f f, field_name, class: "col-md-2", label: _("Size (GB)"), label_size: "col-md-2", onchange: 'tfm.computeResource.capacityEdit(this)' %>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<thead>
|
2
|
+
<tr>
|
3
|
+
<th><%= _('Name') %></th>
|
4
|
+
<th><%= _('Type') %></th>
|
5
|
+
<th><%= _('State') %></th>
|
6
|
+
<th><%= _('Actions') %></th>
|
7
|
+
</tr>
|
8
|
+
</thead>
|
9
|
+
<tbody>
|
10
|
+
<% @vms.each do |vm| %>
|
11
|
+
<%
|
12
|
+
view_path = hash_for_compute_resource_vm_path(compute_resource_id: @compute_resource, id: vm.identity).merge(auth_object: @compute_resource.id, auth_action: 'view', authorizer: authorizer)
|
13
|
+
delete_link = display_delete_if_authorized(hash_for_compute_resource_vm_path(compute_resource_id: @compute_resource, id: vm.identity).merge(auth_object: @compute_resource, authorizer: authorizer))
|
14
|
+
%>
|
15
|
+
<tr>
|
16
|
+
<td><%= link_to_if_authorized vm.name, view_path %></td>
|
17
|
+
<td><%= vm.pretty_machine_type %></td>
|
18
|
+
<td><%= vm.status.downcase %></td>
|
19
|
+
<td>
|
20
|
+
<%= action_buttons(vm_power_action(vm, authorizer),
|
21
|
+
vm_import_action(vm),vm_associate_link(vm),
|
22
|
+
delete_link) %>
|
23
|
+
</td>
|
24
|
+
</tr>
|
25
|
+
<% end %>
|
26
|
+
</tbody>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<% title @vm.name %>
|
2
|
+
|
3
|
+
<div class='col-md-12'>
|
4
|
+
<table class="<%= table_css_classes %>">
|
5
|
+
<thead>
|
6
|
+
<tr><th colspan="2"><%=_("Properties") %></th></tr>
|
7
|
+
</thead>
|
8
|
+
<tbody>
|
9
|
+
<%= prop :state %>
|
10
|
+
<%= prop :pretty_machine_type, _("Machine Type") %>
|
11
|
+
<%= prop :zone_name, _("Zone") %>
|
12
|
+
<tr>
|
13
|
+
<td>Created</td>
|
14
|
+
<td><%= date_time_relative(@vm.creation_timestamp) %></td>
|
15
|
+
</tr>
|
16
|
+
<%= prop :private_ip_address %>
|
17
|
+
<%= prop :public_ip_address %>
|
18
|
+
<%= prop :pretty_image_name, _("Image") %>
|
19
|
+
</tbody>
|
20
|
+
</table>
|
21
|
+
</div>
|
@@ -0,0 +1,3 @@
|
|
1
|
+
<%= text_f f, :username, :value => @image.username || "user", :help_inline => _("The user that is used to ssh into the instance, normally cloud-user, ec2-user, ubuntu, etc. Note: Google engine doesn't support SSH for the root user.") %>
|
2
|
+
<%= image_field(f) %>
|
3
|
+
<%= checkbox_f f, :user_data, :help_inline => _("Does this image support user data input (e.g. via cloud-init)?") %>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# rubocop:disable Metrics/MethodLength
|
2
|
+
class ForemanGceToForemanGoogleGce < ActiveRecord::Migration[6.0]
|
3
|
+
def up
|
4
|
+
User.without_auditing do
|
5
|
+
original_type = 'Foreman::Model::GCE'
|
6
|
+
new_type = 'ForemanGoogle::GCE'
|
7
|
+
|
8
|
+
# First update the type to avoid error:
|
9
|
+
# ActiveRecord::SubclassNotFound: The single-table inheritance
|
10
|
+
# mechanism failed to locate the subclass: 'Foreman::Model::GCE'
|
11
|
+
ComputeResource.unscoped.where(type: original_type).update_all(type: new_type)
|
12
|
+
|
13
|
+
ComputeResource.unscoped.where(type: new_type).each do |cr|
|
14
|
+
unless cr.attrs[:key_path]
|
15
|
+
say("Compute resource [#{cr.name}] is missing path to JSON key file, can't load the data. Please update the resource manually.")
|
16
|
+
next
|
17
|
+
end
|
18
|
+
json_data = File.read(cr.attrs[:key_path])
|
19
|
+
cr.update(password: json_data)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
# rubocop:enable Metrics/MethodLength
|
@@ -12,7 +12,8 @@ module ForemanGoogle
|
|
12
12
|
|
13
13
|
initializer 'foreman_google.register_plugin', before: :finisher_hook do |_app|
|
14
14
|
Foreman::Plugin.register :foreman_google do
|
15
|
-
requires_foreman '>=
|
15
|
+
requires_foreman '>= 3.5.0'
|
16
|
+
register_global_js_file 'global'
|
16
17
|
|
17
18
|
in_to_prepare do
|
18
19
|
compute_resource(ForemanGoogle::GCE)
|
@@ -22,7 +23,14 @@ module ForemanGoogle
|
|
22
23
|
|
23
24
|
# Include concerns in this config.to_prepare block
|
24
25
|
config.to_prepare do
|
25
|
-
|
26
|
+
require 'google/cloud/compute/v1'
|
27
|
+
|
28
|
+
::Host::Managed.include ForemanGoogle::HostManagedExtensions
|
29
|
+
::Api::V2::ComputeResourcesController.include ForemanGoogle::Api::V2::ComputeResourcesExtensions
|
30
|
+
::Api::V2::ComputeResourcesController.include ForemanGoogle::Api::V2::ApipieExtensions
|
31
|
+
::Api::V2::ComputeResourcesController.include Foreman::Controller::Parameters::ComputeResourceExtension
|
32
|
+
::ComputeResourcesController.include Foreman::Controller::Parameters::ComputeResourceExtension
|
33
|
+
Google::Cloud::Compute::V1::AttachedDisk.include GoogleExtensions::AttachedDisk
|
26
34
|
rescue StandardError => e
|
27
35
|
Rails.logger.warn "ForemanGoogle: skipping engine hook (#{e})"
|
28
36
|
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
# foreman_google
|
2
|
+
#
|
3
|
+
# This file is distributed under the same license as foreman_google.
|
4
|
+
#
|
5
|
+
msgid ""
|
6
|
+
msgstr ""
|
7
|
+
"Project-Id-Version: version 0.0.1\n"
|
8
|
+
"Report-Msgid-Bugs-To: \n"
|
9
|
+
"PO-Revision-Date: 2014-08-20 08:54+0100\n"
|
10
|
+
"Last-Translator: Foreman Team <foreman-dev@googlegroups.com>\n"
|
11
|
+
"Language-Team: Foreman Team <foreman-dev@googlegroups.com>\n"
|
12
|
+
"Language: \n"
|
13
|
+
"MIME-Version: 1.0\n"
|
14
|
+
"Content-Type: text/plain; charset=UTF-8\n"
|
15
|
+
"Content-Transfer-Encoding: 8bit\n"
|
16
|
+
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
17
|
+
|
18
|
+
#: ../app/models/foreman_google/gce.rb:126
|
19
|
+
msgid "console is not available at this time because the instance is powered off"
|
20
|
+
msgstr ""
|
21
|
+
|
22
|
+
#: ../app/models/foreman_google/gce.rb:170
|
23
|
+
msgid "Missing an image for operating system!"
|
24
|
+
msgstr ""
|
25
|
+
|
26
|
+
#: ../app/views/compute_resources/form/_gce.html.erb:3
|
27
|
+
msgid "JSON key"
|
28
|
+
msgstr ""
|
29
|
+
|
30
|
+
#: ../app/views/compute_resources/form/_gce.html.erb:9 ../app/views/compute_resources_vms/show/_gce.html.erb:11
|
31
|
+
msgid "Zone"
|
32
|
+
msgstr ""
|
33
|
+
|
34
|
+
#: ../app/views/compute_resources/form/_gce.html.erb:10
|
35
|
+
msgid "Load Zones"
|
36
|
+
msgstr ""
|
37
|
+
|
38
|
+
#: ../app/views/compute_resources_vms/form/gce/_base.html.erb:3
|
39
|
+
msgid "Machine type"
|
40
|
+
msgstr ""
|
41
|
+
|
42
|
+
#: ../app/views/compute_resources_vms/form/gce/_base.html.erb:12
|
43
|
+
msgid "Please select an image"
|
44
|
+
msgstr ""
|
45
|
+
|
46
|
+
#: ../app/views/compute_resources_vms/form/gce/_base.html.erb:13 ../app/views/compute_resources_vms/show/_gce.html.erb:18
|
47
|
+
msgid "Image"
|
48
|
+
msgstr ""
|
49
|
+
|
50
|
+
#: ../app/views/compute_resources_vms/form/gce/_base.html.erb:17
|
51
|
+
msgid "Network"
|
52
|
+
msgstr ""
|
53
|
+
|
54
|
+
#: ../app/views/compute_resources_vms/form/gce/_base.html.erb:18
|
55
|
+
msgid "Associate Ephemeral External IP"
|
56
|
+
msgstr ""
|
57
|
+
|
58
|
+
#: ../app/views/compute_resources_vms/form/gce/_volume.html.erb:5
|
59
|
+
msgid "Size (GB)"
|
60
|
+
msgstr ""
|
61
|
+
|
62
|
+
#: ../app/views/compute_resources_vms/index/_gce.html.erb:3
|
63
|
+
msgid "Name"
|
64
|
+
msgstr ""
|
65
|
+
|
66
|
+
#: ../app/views/compute_resources_vms/index/_gce.html.erb:4
|
67
|
+
msgid "Type"
|
68
|
+
msgstr ""
|
69
|
+
|
70
|
+
#: ../app/views/compute_resources_vms/index/_gce.html.erb:5
|
71
|
+
msgid "State"
|
72
|
+
msgstr ""
|
73
|
+
|
74
|
+
#: ../app/views/compute_resources_vms/index/_gce.html.erb:6
|
75
|
+
msgid "Actions"
|
76
|
+
msgstr ""
|
77
|
+
|
78
|
+
#: ../app/views/compute_resources_vms/show/_gce.html.erb:6
|
79
|
+
msgid "Properties"
|
80
|
+
msgstr ""
|
81
|
+
|
82
|
+
#: ../app/views/compute_resources_vms/show/_gce.html.erb:10
|
83
|
+
msgid "Machine Type"
|
84
|
+
msgstr ""
|
85
|
+
|
86
|
+
#: ../app/views/images/form/_gce.html.erb:1
|
87
|
+
msgid "The user that is used to ssh into the instance, normally cloud-user, ec2-user, ubuntu, etc. Note: Google engine doesn't support SSH for the root user."
|
88
|
+
msgstr ""
|
89
|
+
|
90
|
+
#: ../app/views/images/form/_gce.html.erb:3
|
91
|
+
msgid "Does this image support user data input (e.g. via cloud-init)?"
|
92
|
+
msgstr ""
|
93
|
+
|
94
|
+
#: action_names.rb:2
|
95
|
+
msgid "Preupgrade job"
|
96
|
+
msgstr ""
|
97
|
+
|
98
|
+
#: action_names.rb:3
|
99
|
+
msgid "Action with sub plans"
|
100
|
+
msgstr ""
|
101
|
+
|
102
|
+
#: action_names.rb:4
|
103
|
+
msgid "Import facts"
|
104
|
+
msgstr ""
|
105
|
+
|
106
|
+
#: action_names.rb:5
|
107
|
+
msgid "Import Puppet classes"
|
108
|
+
msgstr ""
|
109
|
+
|
110
|
+
#: action_names.rb:6
|
111
|
+
msgid "Remote action:"
|
112
|
+
msgstr ""
|
113
|
+
|
114
|
+
#: gemspec.rb:2
|
115
|
+
msgid "Google Compute Engine plugin for the Foreman."
|
116
|
+
msgstr ""
|
data/locale/en/foreman_google.po
CHANGED
@@ -2,12 +2,10 @@
|
|
2
2
|
#
|
3
3
|
# This file is distributed under the same license as foreman_google.
|
4
4
|
#
|
5
|
-
#, fuzzy
|
6
5
|
msgid ""
|
7
6
|
msgstr ""
|
8
7
|
"Project-Id-Version: version 0.0.1\n"
|
9
8
|
"Report-Msgid-Bugs-To: \n"
|
10
|
-
"POT-Creation-Date: 2014-08-20 08:46+0100\n"
|
11
9
|
"PO-Revision-Date: 2014-08-20 08:54+0100\n"
|
12
10
|
"Last-Translator: Foreman Team <foreman-dev@googlegroups.com>\n"
|
13
11
|
"Language-Team: Foreman Team <foreman-dev@googlegroups.com>\n"
|
@@ -17,3 +15,77 @@ msgstr ""
|
|
17
15
|
"Content-Transfer-Encoding: 8bit\n"
|
18
16
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
19
17
|
|
18
|
+
msgid "Action with sub plans"
|
19
|
+
msgstr ""
|
20
|
+
|
21
|
+
msgid "Actions"
|
22
|
+
msgstr ""
|
23
|
+
|
24
|
+
msgid "Associate Ephemeral External IP"
|
25
|
+
msgstr ""
|
26
|
+
|
27
|
+
msgid "Does this image support user data input (e.g. via cloud-init)?"
|
28
|
+
msgstr ""
|
29
|
+
|
30
|
+
msgid "Google Compute Engine plugin for the Foreman."
|
31
|
+
msgstr ""
|
32
|
+
|
33
|
+
msgid "Image"
|
34
|
+
msgstr ""
|
35
|
+
|
36
|
+
msgid "Import Puppet classes"
|
37
|
+
msgstr ""
|
38
|
+
|
39
|
+
msgid "Import facts"
|
40
|
+
msgstr ""
|
41
|
+
|
42
|
+
msgid "JSON key"
|
43
|
+
msgstr ""
|
44
|
+
|
45
|
+
msgid "Load Zones"
|
46
|
+
msgstr ""
|
47
|
+
|
48
|
+
msgid "Machine Type"
|
49
|
+
msgstr ""
|
50
|
+
|
51
|
+
msgid "Machine type"
|
52
|
+
msgstr ""
|
53
|
+
|
54
|
+
msgid "Missing an image for operating system!"
|
55
|
+
msgstr ""
|
56
|
+
|
57
|
+
msgid "Name"
|
58
|
+
msgstr ""
|
59
|
+
|
60
|
+
msgid "Network"
|
61
|
+
msgstr ""
|
62
|
+
|
63
|
+
msgid "Please select an image"
|
64
|
+
msgstr ""
|
65
|
+
|
66
|
+
msgid "Preupgrade job"
|
67
|
+
msgstr ""
|
68
|
+
|
69
|
+
msgid "Properties"
|
70
|
+
msgstr ""
|
71
|
+
|
72
|
+
msgid "Remote action:"
|
73
|
+
msgstr ""
|
74
|
+
|
75
|
+
msgid "Size (GB)"
|
76
|
+
msgstr ""
|
77
|
+
|
78
|
+
msgid "State"
|
79
|
+
msgstr ""
|
80
|
+
|
81
|
+
msgid "The user that is used to ssh into the instance, normally cloud-user, ec2-user, ubuntu, etc. Note: Google engine doesn't support SSH for the root user."
|
82
|
+
msgstr ""
|
83
|
+
|
84
|
+
msgid "Type"
|
85
|
+
msgstr ""
|
86
|
+
|
87
|
+
msgid "Zone"
|
88
|
+
msgstr ""
|
89
|
+
|
90
|
+
msgid "console is not available at this time because the instance is powered off"
|
91
|
+
msgstr ""
|
File without changes
|