Support userdata for instances in aws
In some cases we need to be able to launch instances with custom userdata also in aws. Change-Id: I0891961f16bb3bd728622d3413bd185978d79324
This commit is contained in:
parent
190b5a7315
commit
761a9ee00e
@ -1812,6 +1812,14 @@ section of the configuration.
|
|||||||
|
|
||||||
If given, the size of the root EBS volume, in GiB.
|
If given, the size of the root EBS volume, in GiB.
|
||||||
|
|
||||||
|
.. attr:: userdata
|
||||||
|
:type: str
|
||||||
|
:default: None
|
||||||
|
|
||||||
|
A string of userdata for a node. Example usage is to install
|
||||||
|
cloud-init package on image which will apply the userdata.
|
||||||
|
Additional info about options in cloud-config:
|
||||||
|
https://cloudinit.readthedocs.io/en/latest/topics/examples.html
|
||||||
|
|
||||||
.. _`EBS volume type`: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html
|
.. _`EBS volume type`: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html
|
||||||
.. _`AWS region`: https://docs.aws.amazon.com/general/latest/gr/rande.html
|
.. _`AWS region`: https://docs.aws.amazon.com/general/latest/gr/rande.html
|
||||||
|
@ -56,6 +56,7 @@ class ProviderLabel(ConfigValue):
|
|||||||
self.key_name = None
|
self.key_name = None
|
||||||
self.volume_size = None
|
self.volume_size = None
|
||||||
self.volume_type = None
|
self.volume_type = None
|
||||||
|
self.userdata = None
|
||||||
# The ProviderPool object that owns this label.
|
# The ProviderPool object that owns this label.
|
||||||
self.pool = None
|
self.pool = None
|
||||||
|
|
||||||
@ -68,7 +69,9 @@ class ProviderLabel(ConfigValue):
|
|||||||
and other.instance_type == self.instance_type
|
and other.instance_type == self.instance_type
|
||||||
and other.key_name == self.key_name
|
and other.key_name == self.key_name
|
||||||
and other.volume_size == self.volume_size
|
and other.volume_size == self.volume_size
|
||||||
and other.volume_type == self.volume_type)
|
and other.volume_type == self.volume_type
|
||||||
|
and other.userdata == self.userdata
|
||||||
|
)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
@ -121,6 +124,7 @@ class ProviderPool(ConfigPool):
|
|||||||
pl.key_name = label['key-name']
|
pl.key_name = label['key-name']
|
||||||
pl.volume_type = label.get('volume-type')
|
pl.volume_type = label.get('volume-type')
|
||||||
pl.volume_size = label.get('volume-size')
|
pl.volume_size = label.get('volume-size')
|
||||||
|
pl.userdata = label.get('userdata', None)
|
||||||
full_config.labels[label['name']].pools.append(self)
|
full_config.labels[label['name']].pools.append(self)
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
@ -223,7 +227,8 @@ class AwsProviderConfig(ProviderConfig):
|
|||||||
v.Required('instance-type'): str,
|
v.Required('instance-type'): str,
|
||||||
v.Required('key-name'): str,
|
v.Required('key-name'): str,
|
||||||
'volume-type': str,
|
'volume-type': str,
|
||||||
'volume-size': int
|
'volume-size': int,
|
||||||
|
'userdata': str,
|
||||||
}
|
}
|
||||||
|
|
||||||
pool = ConfigPool.getCommonSchemaDict()
|
pool = ConfigPool.getCommonSchemaDict()
|
||||||
|
@ -179,6 +179,9 @@ class AwsProvider(Provider):
|
|||||||
if label.pool.subnet_id:
|
if label.pool.subnet_id:
|
||||||
args['NetworkInterfaces'][0]['SubnetId'] = label.pool.subnet_id
|
args['NetworkInterfaces'][0]['SubnetId'] = label.pool.subnet_id
|
||||||
|
|
||||||
|
if label.userdata:
|
||||||
|
args['UserData'] = label.userdata
|
||||||
|
|
||||||
# Default block device mapping parameters are embedded in AMIs.
|
# Default block device mapping parameters are embedded in AMIs.
|
||||||
# We might need to supply our own mapping before lauching the instance.
|
# We might need to supply our own mapping before lauching the instance.
|
||||||
# We basically want to make sure DeleteOnTermination is true and be
|
# We basically want to make sure DeleteOnTermination is true and be
|
||||||
|
6
nodepool/tests/fixtures/aws.yaml
vendored
6
nodepool/tests/fixtures/aws.yaml
vendored
@ -10,6 +10,7 @@ labels:
|
|||||||
- name: ubuntu1404-by-capitalized-filters
|
- name: ubuntu1404-by-capitalized-filters
|
||||||
- name: ubuntu1404-bad-config
|
- name: ubuntu1404-bad-config
|
||||||
- name: ubuntu1404-non-host-key-checking
|
- name: ubuntu1404-non-host-key-checking
|
||||||
|
- name: ubuntu1404-userdata
|
||||||
|
|
||||||
providers:
|
providers:
|
||||||
- name: ec2-us-west-2
|
- name: ec2-us-west-2
|
||||||
@ -67,6 +68,11 @@ providers:
|
|||||||
cloud-image: ubuntu1404-bad-config
|
cloud-image: ubuntu1404-bad-config
|
||||||
instance-type: t3.medium
|
instance-type: t3.medium
|
||||||
key-name: zuul
|
key-name: zuul
|
||||||
|
- name: ubuntu1404-userdata
|
||||||
|
cloud-image: ubuntu1404
|
||||||
|
instance-type: t3.medium
|
||||||
|
key-name: zuul
|
||||||
|
userdata: fake-user-data
|
||||||
- name: non-host-key-checking
|
- name: non-host-key-checking
|
||||||
max-servers: 1
|
max-servers: 1
|
||||||
subnet-id: null
|
subnet-id: null
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
# implied.
|
# implied.
|
||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
import base64
|
||||||
|
|
||||||
import fixtures
|
import fixtures
|
||||||
import logging
|
import logging
|
||||||
@ -34,7 +35,8 @@ class TestDriverAws(tests.DBTestCase):
|
|||||||
@mock_ec2
|
@mock_ec2
|
||||||
def _test_ec2_machine(self, label,
|
def _test_ec2_machine(self, label,
|
||||||
is_valid_config=True,
|
is_valid_config=True,
|
||||||
host_key_checking=True):
|
host_key_checking=True,
|
||||||
|
userdata=None):
|
||||||
aws_id = 'AK000000000000000000'
|
aws_id = 'AK000000000000000000'
|
||||||
aws_key = '0123456789abcdef0123456789abcdef0123456789abcdef'
|
aws_key = '0123456789abcdef0123456789abcdef0123456789abcdef'
|
||||||
self.useFixture(
|
self.useFixture(
|
||||||
@ -42,6 +44,7 @@ class TestDriverAws(tests.DBTestCase):
|
|||||||
self.useFixture(
|
self.useFixture(
|
||||||
fixtures.EnvironmentVariable('AWS_SECRET_ACCESS_KEY', aws_key))
|
fixtures.EnvironmentVariable('AWS_SECRET_ACCESS_KEY', aws_key))
|
||||||
|
|
||||||
|
ec2_resource = boto3.resource('ec2', region_name='us-west-2')
|
||||||
ec2 = boto3.client('ec2', region_name='us-west-2')
|
ec2 = boto3.client('ec2', region_name='us-west-2')
|
||||||
|
|
||||||
# TEST-NET-3
|
# TEST-NET-3
|
||||||
@ -104,6 +107,14 @@ class TestDriverAws(tests.DBTestCase):
|
|||||||
port=22,
|
port=22,
|
||||||
timeout=180,
|
timeout=180,
|
||||||
gather_hostkeys=True)
|
gather_hostkeys=True)
|
||||||
|
if userdata:
|
||||||
|
instance = ec2_resource.Instance(node.external_id)
|
||||||
|
response = instance.describe_attribute(
|
||||||
|
Attribute='userData')
|
||||||
|
self.assertIn('UserData', response)
|
||||||
|
userdata = base64.b64decode(
|
||||||
|
response['UserData']['Value']).decode()
|
||||||
|
self.assertEqual('fake-user-data', userdata)
|
||||||
|
|
||||||
# A new request will be paused and for lack of quota
|
# A new request will be paused and for lack of quota
|
||||||
# until this one is deleted
|
# until this one is deleted
|
||||||
@ -154,3 +165,7 @@ class TestDriverAws(tests.DBTestCase):
|
|||||||
def test_ec2_machine_non_host_key_checking(self):
|
def test_ec2_machine_non_host_key_checking(self):
|
||||||
self._test_ec2_machine('ubuntu1404-non-host-key-checking',
|
self._test_ec2_machine('ubuntu1404-non-host-key-checking',
|
||||||
host_key_checking=False)
|
host_key_checking=False)
|
||||||
|
|
||||||
|
def test_ec2_machine_userdata(self):
|
||||||
|
self._test_ec2_machine('ubuntu1404-userdata',
|
||||||
|
userdata=True)
|
||||||
|
5
releasenotes/notes/aws-userdata-0ed096fdce83a2b1.yaml
Normal file
5
releasenotes/notes/aws-userdata-0ed096fdce83a2b1.yaml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
The AWS driver now supports custom
|
||||||
|
:attr:`providers.[aws].pools.labels.userdata` when launching instances.
|
Loading…
x
Reference in New Issue
Block a user