mirror of
https://github.com/valitydev/salt.git
synced 2024-11-07 17:09:03 +00:00
Merge branch '2015.5' of https://github.com/saltstack/salt into 2015.5
This commit is contained in:
commit
1c2af5c685
@ -245,6 +245,27 @@ def update(version=None):
|
||||
return ret
|
||||
|
||||
|
||||
def sync_beacons(saltenv=None, refresh=True):
|
||||
'''
|
||||
Sync the beacons from the _beacons directory on the salt master file
|
||||
server. This function is environment aware, pass the desired environment
|
||||
to grab the contents of the _beacons directory, base is the default
|
||||
environment.
|
||||
|
||||
.. versionadded:: 2015.5.1
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt '*' saltutil.sync_beacons
|
||||
'''
|
||||
ret = _sync('beacons', saltenv)
|
||||
if refresh:
|
||||
refresh_beacons()
|
||||
return ret
|
||||
|
||||
|
||||
def sync_modules(saltenv=None, refresh=True):
|
||||
'''
|
||||
Sync the modules from the _modules directory on the salt master file
|
||||
@ -252,6 +273,8 @@ def sync_modules(saltenv=None, refresh=True):
|
||||
to grab the contents of the _modules directory, base is the default
|
||||
environment.
|
||||
|
||||
.. versionadded:: 2015.5.1
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
@ -395,6 +418,7 @@ def sync_all(saltenv=None, refresh=True):
|
||||
'''
|
||||
log.debug('Syncing all')
|
||||
ret = {}
|
||||
ret['beacons'] = sync_beacons(saltenv, False)
|
||||
ret['modules'] = sync_modules(saltenv, False)
|
||||
ret['states'] = sync_states(saltenv, False)
|
||||
ret['grains'] = sync_grains(saltenv, False)
|
||||
@ -407,6 +431,24 @@ def sync_all(saltenv=None, refresh=True):
|
||||
return ret
|
||||
|
||||
|
||||
def refresh_beacons():
|
||||
'''
|
||||
Signal the minion to refresh the beacons.
|
||||
|
||||
CLI Example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
salt '*' saltutil.refresh_beacons
|
||||
'''
|
||||
try:
|
||||
ret = __salt__['event.fire']({}, 'beacons_refresh')
|
||||
except KeyError:
|
||||
log.error('Event module not available. Module refresh failed.')
|
||||
ret = False # Effectively a no-op, since we can't really return without an event system
|
||||
return ret
|
||||
|
||||
|
||||
def refresh_pillar():
|
||||
'''
|
||||
Signal the minion to refresh the pillar data.
|
||||
|
@ -292,7 +292,7 @@ def add(name, **kwargs):
|
||||
|
||||
if name in current_schedule:
|
||||
ret['comment'] = 'Job {0} already exists in schedule.'.format(name)
|
||||
ret['result'] = True
|
||||
ret['result'] = False
|
||||
return ret
|
||||
|
||||
if not name:
|
||||
|
@ -1,9 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
'''
|
||||
:codeauthor: :email:`Nicole Thomas <nicole@saltstack.com>`
|
||||
Integration tests for DigitalOcean APIv2
|
||||
'''
|
||||
|
||||
# Import Python Libs
|
||||
from __future__ import absolute_import
|
||||
import os
|
||||
import random
|
||||
import string
|
||||
@ -17,6 +18,9 @@ ensure_in_syspath('../../../')
|
||||
import integration
|
||||
from salt.config import cloud_providers_config
|
||||
|
||||
# Import 3rd-party libs
|
||||
from salt.ext.six.moves import range # pylint: disable=import-error,redefined-builtin
|
||||
|
||||
|
||||
def __random_name(size=6):
|
||||
'''
|
||||
@ -54,21 +58,23 @@ class DigitalOceanTest(integration.ShellCase):
|
||||
.format(PROVIDER_NAME)
|
||||
)
|
||||
|
||||
# check if client_key, api_key, ssh_key_file, and ssh_key_name are present
|
||||
path = os.path.join(integration.FILES,
|
||||
'conf',
|
||||
'cloud.providers.d',
|
||||
PROVIDER_NAME + '.conf')
|
||||
config = cloud_providers_config(path)
|
||||
# check if personal access token, ssh_key_file, and ssh_key_names are present
|
||||
config = cloud_providers_config(
|
||||
os.path.join(
|
||||
integration.FILES,
|
||||
'conf',
|
||||
'cloud.providers.d',
|
||||
PROVIDER_NAME + '.conf'
|
||||
)
|
||||
)
|
||||
|
||||
api = config[profile_str][PROVIDER_NAME]['api_key']
|
||||
client = config[profile_str][PROVIDER_NAME]['client_key']
|
||||
personal_token = config[profile_str][PROVIDER_NAME]['personal_access_token']
|
||||
ssh_file = config[profile_str][PROVIDER_NAME]['ssh_key_file']
|
||||
ssh_name = config[profile_str][PROVIDER_NAME]['ssh_key_name']
|
||||
|
||||
if api == '' or client == '' or ssh_file == '' or ssh_name == '':
|
||||
if personal_token == '' or ssh_file == '' or ssh_name == '':
|
||||
self.skipTest(
|
||||
'A client key, an api key, an ssh key file, and an ssh key name '
|
||||
'A personal access token, an ssh key file, and an ssh key name '
|
||||
'must be provided to run these tests. Check '
|
||||
'tests/integration/files/conf/cloud.providers.d/{0}.conf'
|
||||
.format(PROVIDER_NAME)
|
||||
@ -78,61 +84,101 @@ class DigitalOceanTest(integration.ShellCase):
|
||||
'''
|
||||
Tests the return of running the --list-images command for digital ocean
|
||||
'''
|
||||
image_name = '14.10 x64'
|
||||
ret_str = ' {0}'.format(image_name)
|
||||
list_images = self.run_cloud('--list-images {0}'.format(PROVIDER_NAME))
|
||||
self.assertIn(ret_str, list_images)
|
||||
image_list = self.run_cloud('--list-images {0}'.format(PROVIDER_NAME))
|
||||
|
||||
self.assertIn(
|
||||
'14.10 x64',
|
||||
[i.strip() for i in image_list]
|
||||
)
|
||||
|
||||
def test_list_locations(self):
|
||||
'''
|
||||
Tests the return of running the --list-locations command for digital ocean
|
||||
'''
|
||||
location_name = 'San Francisco 1'
|
||||
ret_str = ' {0}'.format(location_name)
|
||||
list_locations = self.run_cloud('--list-locations {0}'.format(PROVIDER_NAME))
|
||||
self.assertIn(ret_str, list_locations)
|
||||
_list_locations = self.run_cloud('--list-locations {0}'.format(PROVIDER_NAME))
|
||||
|
||||
self.assertIn(
|
||||
'San Francisco 1',
|
||||
[i.strip() for i in _list_locations]
|
||||
)
|
||||
|
||||
def test_list_sizes(self):
|
||||
'''
|
||||
Tests the return of running the --list-sizes command for digital ocean
|
||||
'''
|
||||
size_name = '16GB'
|
||||
ret_str = ' {0}'.format(size_name)
|
||||
list_sizes = self.run_cloud('--list-sizes {0}'.format(PROVIDER_NAME))
|
||||
self.assertIn(ret_str, list_sizes)
|
||||
_list_size = self.run_cloud('--list-sizes {0}'.format(PROVIDER_NAME))
|
||||
|
||||
self.assertIn(
|
||||
'16gb',
|
||||
[i.strip() for i in _list_size]
|
||||
)
|
||||
|
||||
def test_key_management(self):
|
||||
'''
|
||||
Test key management
|
||||
'''
|
||||
pub = 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAQQDDHr/jh2Jy4yALcK4JyWbVkPRaWmhck3IgCoeOO3z1e2dBowLh64QAM+Qb72pxekALga2oi4GvT+TlWNhzPH4V example'
|
||||
finger_print = '3b:16:bf:e4:8b:00:8b:b8:59:8c:a9:d3:f0:19:45:fa'
|
||||
|
||||
_key = self.run_cloud('-f create_key {0} name="MyPubKey" public_key="{1}"'.format(PROVIDER_NAME, pub))
|
||||
|
||||
# Upload public key
|
||||
self.assertIn(
|
||||
finger_print,
|
||||
[i.strip() for i in _key]
|
||||
)
|
||||
|
||||
try:
|
||||
# List all keys
|
||||
list_keypairs = self.run_cloud('-f list_keypairs {0}'.format(PROVIDER_NAME))
|
||||
|
||||
self.assertIn(
|
||||
finger_print,
|
||||
[i.strip() for i in list_keypairs]
|
||||
)
|
||||
|
||||
# List key
|
||||
show_keypair = self.run_cloud('-f show_keypair {0} keyname={1}'.format(PROVIDER_NAME, 'MyPubKey'))
|
||||
|
||||
self.assertIn(
|
||||
finger_print,
|
||||
[i.strip() for i in show_keypair]
|
||||
)
|
||||
except AssertionError:
|
||||
# Delete the public key if the above assertions fail
|
||||
self.run_cloud('-f remove_key {0} id={1}'.format(PROVIDER_NAME, finger_print))
|
||||
raise
|
||||
|
||||
# Delete public key
|
||||
self.assertTrue(self.run_cloud('-f remove_key {0} id={1}'.format(PROVIDER_NAME, finger_print)))
|
||||
|
||||
def test_instance(self):
|
||||
'''
|
||||
Test creating an instance on DigitalOcean
|
||||
'''
|
||||
|
||||
# create the instance
|
||||
instance = self.run_cloud('-p digitalocean-test {0}'.format(INSTANCE_NAME))
|
||||
ret_str = ' {0}'.format(INSTANCE_NAME)
|
||||
|
||||
# check if instance with salt installed returned
|
||||
try:
|
||||
self.assertIn(ret_str, instance)
|
||||
self.assertIn(
|
||||
INSTANCE_NAME,
|
||||
[i.strip() for i in self.run_cloud('-p digitalocean-test {0}'.format(INSTANCE_NAME))]
|
||||
)
|
||||
except AssertionError:
|
||||
self.run_cloud('-d {0} --assume-yes'.format(INSTANCE_NAME))
|
||||
raise
|
||||
|
||||
# delete the instance
|
||||
delete = self.run_cloud('-d {0} --assume-yes'.format(INSTANCE_NAME))
|
||||
ret_str = ' OK'
|
||||
try:
|
||||
self.assertIn(ret_str, delete)
|
||||
self.assertIn(
|
||||
'True',
|
||||
[i.strip() for i in self.run_cloud('-d {0} --assume-yes'.format(INSTANCE_NAME))]
|
||||
)
|
||||
except AssertionError:
|
||||
raise
|
||||
|
||||
# Final clean-up of created instance, in case something went wrong.
|
||||
# This was originally in a tearDown function, but that didn't make sense
|
||||
# To run this for each test when not all tests create instances.
|
||||
query = self.run_cloud('--query')
|
||||
ret_str = ' {0}:'.format(INSTANCE_NAME)
|
||||
|
||||
# if test instance is still present, delete it
|
||||
if ret_str in query:
|
||||
if INSTANCE_NAME in [i.strip() for i in self.run_cloud('--query')]:
|
||||
self.run_cloud('-d {0} --assume-yes'.format(INSTANCE_NAME))
|
||||
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
digitalocean-config:
|
||||
provider: digital_ocean
|
||||
client_key: ''
|
||||
api_key: ''
|
||||
personal_access_token: ''
|
||||
ssh_key_file: ''
|
||||
ssh_key_name: ''
|
||||
location: New York 1
|
||||
|
Loading…
Reference in New Issue
Block a user