diff options
-rw-r--r-- | ansible/library/rancher1_api.py | 598 | ||||
-rw-r--r-- | ansible/roles/nfs/molecule/default/cleanup.yml | 3 | ||||
-rw-r--r-- | ansible/roles/nfs/molecule/default/molecule.yml | 2 | ||||
-rw-r--r-- | ansible/roles/rancher/defaults/main.yml | 27 | ||||
-rw-r--r-- | ansible/roles/rancher/tasks/rancher_server.yml | 54 | ||||
-rw-r--r-- | ansible/roles/resource-data/molecule/default/group_vars/all.yml | 2 | ||||
-rw-r--r-- | ansible/test/images/docker/centos7/Dockerfile | 2 | ||||
-rw-r--r-- | ansible/test/molecule-docker/Dockerfile | 10 | ||||
-rwxr-xr-x | ansible/test/molecule-docker/build.sh | 2 | ||||
-rw-r--r-- | ansible/test/roles/prepare-resource-data/tasks/prepare-infra-server.yml | 1 | ||||
-rw-r--r-- | ansible/test/roles/prepare-resource-data/tasks/prepare-resource-server.yml | 6 | ||||
-rw-r--r-- | build/data_lists/onap_3.0.x-npm.list | 1036 |
12 files changed, 1009 insertions, 734 deletions
diff --git a/ansible/library/rancher1_api.py b/ansible/library/rancher1_api.py new file mode 100644 index 00000000..5d74da1e --- /dev/null +++ b/ansible/library/rancher1_api.py @@ -0,0 +1,598 @@ +#!/usr/bin/python + +from ansible.module_utils.basic import AnsibleModule + +import requests +import json +import functools +import time + +DOCUMENTATION = """ +--- +module: rancher1_api +short_description: Client library for rancher API +description: + - This module modifies a rancher 1.6 using it's API (v1). + - It supports some rancher features by the virtue of a 'mode'. + - 'modes' hide from you some necessary cruft and expose you to the only + important and interestig variables wich must be set. The mode mechanism + makes this module more easy to use and you don't have to create an + unnecessary boilerplate for the API. + - Only a few modes are/will be implemented so far - as they are/will be + needed. In the future the 'raw' mode can be added to enable you to craft + your own API requests, but that would be on the same level of a user + experience as running curl commands, and because the rancher 1.6 is already + obsoleted by the project, it would be a wasted effort. +options: + rancher: + description: + - The domain name or the IP address and the port of the rancher + where API is exposed. + - For example: http://10.0.0.1:8080 + required: true + aliases: + - server + - rancher_server + - rancher_api + - api + account_key: + description: + - The public and secret part of the API key-pair separated by colon. + - You can find all your keys in web UI. + - For example: + B1716C4133D3825051CB:3P2eb3QhokFKYUiXRNZLxvGNSRYgh6LHjuMicCHQ + required: false + mode: + description: + - A recognized mode how to deal with some concrete configuration task + in rancher API to ease the usage. + - The implemented modes so far are: + 'settings': + Many options under <api_server>/v1/settings API url and some can + be seen also under advanced options in the web UI. + 'access_control': + It setups user and password for the account (defaults to 'admin') + and it enables the local authentication - so the web UI and API + will require username/password (UI) or apikey (API). + required: true + aliases: + - rancher_mode + - api_mode + choices: + - settings + - access_control + data: + description: + - Dictionary with key/value pairs. The actual names and meaning of pairs + depends on the used mode. + - settings mode: + option - Option/path in JSON API (url). + value - A new value to replace the current one. + - access_control mode: + account_id - The unique ID of the account - the default rancher admin + has '1a1'. Better way would be to just create arbitrary username and + set credentials for that, but due to time constraints, the route with + an ID is simpler. The designated '1a1' could be hardcoded and hidden + but if the user will want to use some other account (there are many), + then it can be just changed to some other ID. + password - A new password in a plaintext. + required: true + timeout: + description: + - How long in seconds to wait for a response before raising error + required: false + default: 10.0 +""" + +default_timeout = 10.0 + + +class ModeError(Exception): + pass + + +def _decorate_rancher_api_request(request_method): + + @functools.wraps(request_method) + def wrap_request(*args, **kwargs): + + response = request_method(*args, **kwargs) + authorized = True + + if response.status_code == 401: + authorized = False + elif response.status_code != requests.codes.ok: + response.raise_for_status() + + try: + json_data = response.json() + except Exception: + json_data = None + + return json_data, authorized + + return wrap_request + + +@_decorate_rancher_api_request +def get_rancher_api_value(url, headers=None, timeout=default_timeout, + username=None, password=None): + + if username and password: + return requests.get(url, headers=headers, + timeout=timeout, + allow_redirects=False, + auth=(username, password)) + else: + return requests.get(url, headers=headers, + timeout=timeout, + allow_redirects=False) + + +@_decorate_rancher_api_request +def set_rancher_api_value(url, payload, headers=None, timeout=default_timeout, + username=None, password=None, method='PUT'): + + if method == 'PUT': + request_set_method = requests.put + elif method == 'POST': + request_set_method = requests.post + else: + raise ModeError('ERROR: Wrong request method: %s' % str(method)) + + if username and password: + return request_set_method(url, headers=headers, + timeout=timeout, + allow_redirects=False, + data=json.dumps(payload), + auth=(username, password)) + else: + return request_set_method(url, headers=headers, + timeout=timeout, + allow_redirects=False, + data=json.dumps(payload)) + + +def create_rancher_api_url(server, mode, option): + request_url = server.strip('/') + '/v1/' + + if mode == 'raw': + request_url += option.strip('/') + elif mode == 'settings': + request_url += 'settings/' + option.strip('/') + elif mode == 'access_control': + request_url += option.strip('/') + + return request_url + + +def get_keypair(keypair): + if keypair: + keypair = keypair.split(':') + if len(keypair) == 2: + return keypair[0], keypair[1] + + return None, None + + +def mode_access_control(api_url, data=None, headers=None, + timeout=default_timeout, access_key=None, + secret_key=None, dry_run=False): + + # returns true if local auth was enabled or false if passwd changed + def is_admin_enabled(json_data, password): + try: + if json_data['type'] == "localAuthConfig" and \ + json_data['accessMode'] == "unrestricted" and \ + json_data['username'] == "admin" and \ + json_data['password'] == password and \ + json_data['enabled']: + return True + except Exception: + pass + + try: + if json_data['type'] == "error" and \ + json_data['code'] == "IncorrectPassword": + return False + except Exception: + pass + + # this should never happen + raise ModeError('ERROR: Unknown status of the local authentication') + + def create_localauth_payload(password): + payload = { + "enabled": True, + "accessMode": "unrestricted", + "username": "admin", + "password": password + } + + return payload + + def get_admin_password_id(): + # assemble request URL + request_url = api_url + 'accounts/' + data['account_id'].strip('/') \ + + '/credentials' + + # API get current value + try: + json_response, authorized = \ + get_rancher_api_value(request_url, + username=access_key, + password=secret_key, + headers=headers, + timeout=timeout) + except requests.HTTPError as e: + raise ModeError(str(e)) + except requests.Timeout as e: + raise ModeError(str(e)) + + if not authorized or not json_response: + raise ModeError('ERROR: BAD RESPONSE (GET) - no json value in ' + + 'the response') + + try: + for item in json_response['data']: + if item['type'] == 'password' and \ + item['accountId'] == data['account_id']: + return item['id'] + except Exception: + pass + + return None + + def remove_password(password_id, action): + if action == 'deactivate': + action_status = 'deactivating' + elif action == 'remove': + action_status = 'removing' + + request_url = api_url + 'passwords/' + password_id + \ + '/?action=' + action + + try: + json_response, authorized = \ + set_rancher_api_value(request_url, + {}, + username=access_key, + password=secret_key, + headers=headers, + method='POST', + timeout=timeout) + except requests.HTTPError as e: + raise ModeError(str(e)) + except requests.Timeout as e: + raise ModeError(str(e)) + + if not authorized or not json_response: + raise ModeError('ERROR: BAD RESPONSE (POST) - no json value in ' + + 'the response') + + if json_response['state'] != action_status: + raise ModeError("ERROR: Failed to '%s' the password: %s" % + (action, password_id)) + + # check if data contains all required fields + try: + if not isinstance(data['account_id'], str) or data['account_id'] == '': + raise ModeError("ERROR: 'account_id' must contain an id of the " + + "affected account") + except KeyError: + raise ModeError("ERROR: Mode 'access_control' requires the field: " + + "'account_id': %s" % str(data)) + try: + if not isinstance(data['password'], str) or data['password'] == '': + raise ModeError("ERROR: 'password' must contain some password") + except KeyError: + raise ModeError("ERROR: Mode 'access_control' requires the field: " + + "'password': %s" % str(data)) + + # assemble request URL + request_url = api_url + 'localauthconfigs' + + # API get current value + try: + json_response, authorized = \ + get_rancher_api_value(request_url, + username=access_key, + password=secret_key, + headers=headers, + timeout=timeout) + except requests.HTTPError as e: + raise ModeError(str(e)) + except requests.Timeout as e: + raise ModeError(str(e)) + + if not authorized or not json_response: + raise ModeError('ERROR: BAD RESPONSE (GET) - no json value in the ' + + 'response') + + # we will check if local auth is enabled or not + enabled = False + try: + for item in json_response['data']: + if item['type'] == 'localAuthConfig' and \ + item['accessMode'] == 'unrestricted' and \ + item['enabled']: + enabled = True + break + except Exception: + enabled = False + + if dry_run: + # we will not set anything and only signal potential change + if enabled: + changed = False + else: + changed = True + else: + # we will try to enable again with the same password + localauth_payload = create_localauth_payload(data['password']) + try: + json_response, authorized = \ + set_rancher_api_value(request_url, + localauth_payload, + username=access_key, + password=secret_key, + headers=headers, + method='POST', + timeout=timeout) + except requests.HTTPError as e: + raise ModeError(str(e)) + except requests.Timeout as e: + raise ModeError(str(e)) + + # here we ignore authorized status - we will try to reset password + if not json_response: + raise ModeError('ERROR: BAD RESPONSE (POST) - no json value in ' + + 'the response') + + # we check if the admin was already set or not... + if enabled and is_admin_enabled(json_response, data['password']): + # it was enabled before and password is the same - no change + changed = False + elif is_admin_enabled(json_response, data['password']): + # we enabled it for the first time + changed = True + # ...and reset password if needed (unauthorized access) + else: + # local auth is enabled but the password differs + # we must reset the admin's password + password_id = get_admin_password_id() + + if password_id is None: + raise ModeError("ERROR: admin's password is set, but we " + + "cannot identify it") + + # One of the way to reset the password is to remove it first + # TODO - refactor this + remove_password(password_id, 'deactivate') + time.sleep(2) + remove_password(password_id, 'remove') + time.sleep(1) + + try: + json_response, authorized = \ + set_rancher_api_value(request_url, + localauth_payload, + username=access_key, + password=secret_key, + headers=headers, + method='POST', + timeout=timeout) + except requests.HTTPError as e: + raise ModeError(str(e)) + except requests.Timeout as e: + raise ModeError(str(e)) + + # finally we signal the change + changed = True + + if changed: + msg = "Local authentication is enabled, admin has assigned password" + else: + msg = "Local authentication was already enabled, admin's password " \ + + "is unchanged" + + return changed, msg + + +def mode_settings(api_url, data=None, headers=None, timeout=default_timeout, + access_key=None, secret_key=None, dry_run=False): + + def is_valid_rancher_api_option(json_data): + + try: + api_activeValue = json_data['activeValue'] + api_source = json_data['source'] + except Exception: + return False + + if api_activeValue is None and api_source is None: + return False + + return True + + def create_rancher_api_payload(json_data, new_value): + + payload = {} + differs = False + + try: + api_id = json_data['id'] + api_activeValue = json_data['activeValue'] + api_name = json_data['name'] + api_source = json_data['source'] + except Exception: + raise ValueError + + payload.update({"activeValue": api_activeValue, + "id": api_id, + "name": api_name, + "source": api_source, + "value": new_value}) + + if api_activeValue != new_value: + differs = True + + return differs, payload + + # check if data contains all required fields + try: + if not isinstance(data['option'], str) or data['option'] == '': + raise ModeError("ERROR: 'option' must contain a name of the " + + "option") + except KeyError: + raise ModeError("ERROR: Mode 'settings' requires the field: 'option': " + + "%s" % str(data)) + try: + if not isinstance(data['value'], str) or data['value'] == '': + raise ModeError("ERROR: 'value' must contain a value") + except KeyError: + raise ModeError("ERROR: Mode 'settings' requires the field: 'value': " + + "%s" % str(data)) + + # assemble request URL + request_url = api_url + 'settings/' + data['option'].strip('/') + + # API get current value + try: + json_response, authorized = \ + get_rancher_api_value(request_url, + username=access_key, + password=secret_key, + headers=headers, + timeout=timeout) + except requests.HTTPError as e: + raise ModeError(str(e)) + except requests.Timeout as e: + raise ModeError(str(e)) + + if not authorized or not json_response: + raise ModeError('ERROR: BAD RESPONSE (GET) - no json value in the ' + + 'response') + + if is_valid_rancher_api_option(json_response): + valid = True + try: + differs, payload = create_rancher_api_payload(json_response, + data['value']) + except ValueError: + raise ModeError('ERROR: INVALID JSON - missing json values in ' + + 'the response') + else: + valid = False + + if valid and differs and dry_run: + # ansible dry-run mode + changed = True + elif valid and differs: + # API set new value + try: + json_response, authorized = \ + set_rancher_api_value(request_url, + payload, + username=access_key, + password=secret_key, + headers=headers, + timeout=timeout) + except requests.HTTPError as e: + raise ModeError(str(e)) + except requests.Timeout as e: + raise ModeError(str(e)) + + if not authorized or not json_response: + raise ModeError('ERROR: BAD RESPONSE (PUT) - no json value in ' + + 'the response') + else: + changed = True + else: + changed = False + + if changed: + msg = "Option '%s' is now set to the new value: %s" \ + % (data['option'], data['value']) + else: + msg = "Option '%s' is unchanged." % (data['option']) + + return changed, msg + + +def mode_handler(server, rancher_mode, data=None, timeout=default_timeout, + account_key=None, dry_run=False): + + changed = False + msg = 'UNKNOWN: UNAPPLICABLE MODE' + + # check API key-pair + if account_key: + access_key, secret_key = get_keypair(account_key) + if not (access_key and secret_key): + raise ModeError('ERROR: INVALID API KEY-PAIR') + + # all requests share these headers + http_headers = {'Content-Type': 'application/json', + 'Accept': 'application/json'} + + # assemble API url + api_url = server.strip('/') + '/v1/' + + if rancher_mode == 'settings': + changed, msg = mode_settings(api_url, data=data, + headers=http_headers, + timeout=timeout, + access_key=access_key, + secret_key=secret_key, + dry_run=dry_run) + elif rancher_mode == 'access_control': + changed, msg = mode_access_control(api_url, data=data, + headers=http_headers, + timeout=timeout, + access_key=access_key, + secret_key=secret_key, + dry_run=dry_run) + + return changed, msg + + +def main(): + module = AnsibleModule( + argument_spec=dict( + rancher=dict(type='str', required=True, + aliases=['server', + 'rancher_api', + 'rancher_server', + 'api']), + account_key=dict(type='str', required=False), + mode=dict(required=True, + choices=['settings', 'access_control'], + aliases=['api_mode']), + data=dict(type='dict', required=True), + timeout=dict(type='float', default=default_timeout), + ), + supports_check_mode=True + ) + + rancher_server = module.params['rancher'] + rancher_account_key = module.params['account_key'] + rancher_mode = module.params['mode'] + rancher_data = module.params['data'] + rancher_timeout = module.params['timeout'] + + try: + changed, msg = mode_handler(rancher_server, + rancher_mode, + data=rancher_data, + account_key=rancher_account_key, + timeout=rancher_timeout, + dry_run=module.check_mode) + except ModeError as e: + module.fail_json(msg=str(e)) + + module.exit_json(changed=changed, msg=msg) + + +if __name__ == '__main__': + main() diff --git a/ansible/roles/nfs/molecule/default/cleanup.yml b/ansible/roles/nfs/molecule/default/cleanup.yml index a085bd5a..af47ed82 100644 --- a/ansible/roles/nfs/molecule/default/cleanup.yml +++ b/ansible/roles/nfs/molecule/default/cleanup.yml @@ -1,6 +1,5 @@ --- - name: Cleanup - hosts: all - ignore_unreachable: true + hosts: all:!nfs-server roles: - cleanup-nfs diff --git a/ansible/roles/nfs/molecule/default/molecule.yml b/ansible/roles/nfs/molecule/default/molecule.yml index f6610ece..7bacf3c4 100644 --- a/ansible/roles/nfs/molecule/default/molecule.yml +++ b/ansible/roles/nfs/molecule/default/molecule.yml @@ -35,8 +35,6 @@ platforms: - /sys/fs/cgroup:/sys/fs/cgroup:ro provisioner: name: ansible - playbooks: - cleanup: cleanup.yml env: ANSIBLE_ROLES_PATH: "../../../../test/roles" inventory: diff --git a/ansible/roles/rancher/defaults/main.yml b/ansible/roles/rancher/defaults/main.yml index 6ab52e64..6d354e6e 100644 --- a/ansible/roles/rancher/defaults/main.yml +++ b/ansible/roles/rancher/defaults/main.yml @@ -4,3 +4,30 @@ rancher_remove_other_env: true rancher_redeploy_k8s_env: true rancher_cluster_health_state: healthy rancher_cluster_health_check_retries: 30 +rancher: + # The following variables can be set via the UI under advanced/settings. + # All of these affect tables in the cattle db and are uninteresting + # to the user (they serve the internal logic of the cattle), but + # they can eat a lot of space when a deployment is busy or faulty. + # + # Audit-Log is the only user-facing option here and it is represented + # in the UI. + # + # Auto-purge deleted entries from most tables after this long (seconds) + main_tables_purge_after_seconds: 28800 # 8 hours + # Auto-purge Event entries after this long (seconds) + events_purge_after_seconds: 28800 # 8 hours + # Auto-purge Service Log entries after this long (seconds) + service_log_purge_after_seconds: 86400 # 1 day + # Auto-purge Audit Log entries after this long (seconds) + audit_log_purge_after_seconds: 2592000 # 30 days + + # By default we don't enable local authentication (mainly due to + # to the fact that rancher_k8s_environment.py would have to be + # rewritten completely) + # But if you don't need to run rancher_kubernetes playbook more + # than once (you should not have to under the terms of a regular + # installation), then you can safely enable it. + auth_enabled: false + # Set this password for the rancher admin account: + admin_password: "admin" diff --git a/ansible/roles/rancher/tasks/rancher_server.yml b/ansible/roles/rancher/tasks/rancher_server.yml index e1eb5a5d..4cda3722 100644 --- a/ansible/roles/rancher/tasks/rancher_server.yml +++ b/ansible/roles/rancher/tasks/rancher_server.yml @@ -32,6 +32,14 @@ delay: 5 until: env.data is defined +# There is a lack of idempotency in the previous task and so there are new api +# key-pairs created with each run. +# +# ToDo: fix idempotency of rancher role +# +# Anyway as rke will be default k8s orchestrator in Dublin, it's supposed to be +# low prio topic. The following tasks dealing with the API are ignoring this problem +# and they simply use the new created API key-pair, which is set as a fact here: - name: Set apikey values set_fact: k8s_env_id: "{{ env.data.environment.id }}" @@ -39,3 +47,49 @@ key_private: "{{ env.data.apikey.private }}" rancher_agent_image: "{{ env.data.registration_tokens.image }}" rancher_agent_reg_url: "{{ env.data.registration_tokens.reg_url }}" + +# By default disabled - when enabled this playbook cannot be run more than once. +- name: Setup rancher admin password and enable authentication + rancher1_api: + server: "{{ rancher_server_url }}" + account_key: "{{ key_public }}:{{ key_private }}" + mode: access_control + data: + account_id: 1a1 # default rancher admin account + password: "{{ rancher.admin_password }}" + when: "rancher.auth_enabled is defined and rancher.auth_enabled" + +- name: Configure the size of the rancher cattle db and logs + block: + - name: Main tables + rancher1_api: + server: "{{ rancher_server_url }}" + account_key: "{{ key_public }}:{{ key_private }}" + mode: settings + data: + option: main_tables.purge.after.seconds + value: "{{ rancher.main_tables_purge_after_seconds }}" + - name: Events + rancher1_api: + server: "{{ rancher_server_url }}" + account_key: "{{ key_public }}:{{ key_private }}" + mode: settings + data: + option: events.purge.after.seconds + value: "{{ rancher.events_purge_after_seconds }}" + - name: Service log + rancher1_api: + server: "{{ rancher_server_url }}" + account_key: "{{ key_public }}:{{ key_private }}" + mode: settings + data: + option: service_log.purge.after.seconds + value: "{{ rancher.service_log_purge_after_seconds }}" + - name: Audit log + rancher1_api: + server: "{{ rancher_server_url }}" + account_key: "{{ key_public }}:{{ key_private }}" + mode: settings + data: + option: audit_log.purge.after.seconds + value: "{{ rancher.audit_log_purge_after_seconds }}" diff --git a/ansible/roles/resource-data/molecule/default/group_vars/all.yml b/ansible/roles/resource-data/molecule/default/group_vars/all.yml index 558eacb2..46ab3e04 100644 --- a/ansible/roles/resource-data/molecule/default/group_vars/all.yml +++ b/ansible/roles/resource-data/molecule/default/group_vars/all.yml @@ -1,5 +1,5 @@ --- -app_data_path: /opt/myleculeapp +app_data_path: /opt/moleculeapp aux_data_path: "{{ app_data_path }}/runtime_images_source_dir" resources_dir: /data resources_filename: resources_package.tar diff --git a/ansible/test/images/docker/centos7/Dockerfile b/ansible/test/images/docker/centos7/Dockerfile index 67e3fb93..0f6e5596 100644 --- a/ansible/test/images/docker/centos7/Dockerfile +++ b/ansible/test/images/docker/centos7/Dockerfile @@ -3,7 +3,7 @@ FROM centos/systemd RUN yum -y update && yum clean all RUN yum -y install openssh-server sudo openssh-clients \ - epel-release python-docker-py iproute e2fsprogs + epel-release python-docker-py iproute e2fsprogs file RUN systemctl enable sshd.service VOLUME ["/run"] diff --git a/ansible/test/molecule-docker/Dockerfile b/ansible/test/molecule-docker/Dockerfile index e4207f2e..61817317 100644 --- a/ansible/test/molecule-docker/Dockerfile +++ b/ansible/test/molecule-docker/Dockerfile @@ -3,6 +3,7 @@ FROM quay.io/ansible/molecule:2.20 ARG USER_ID ARG GROUP_ID ARG DOCKER_GROUP_ID +ARG DOCKER_USER # When user/group provided, create user to have matching ids (for the host user) # to avoid this docker writing files as root owned @@ -10,11 +11,12 @@ RUN if [ ${USER_ID:-0} -ne 0 ] && [ ${GROUP_ID:-0} -ne 0 ]; then \ # shadow needed for addgroup # sshpass needed for accessing docker_host (localhost) with ssh and without password prompt apk --no-cache add shadow sshpass && \ - addgroup -g ${GROUP_ID} molecule && \ - adduser -D -u ${USER_ID} -G molecule molecule && \ + addgroup -g ${GROUP_ID} ${DOCKER_USER} && \ + adduser -D -u ${USER_ID} -G ${DOCKER_USER} ${DOCKER_USER} && \ # Add user to same docker group as in docker_host to be able to use docker driver as sudo groupadd docker-host -g ${DOCKER_GROUP_ID} && \ - usermod -aG ${DOCKER_GROUP_ID} molecule \ + usermod -aG ${DOCKER_GROUP_ID} ${DOCKER_USER} \ ;fi -USER molecule +USER ${DOCKER_USER} + diff --git a/ansible/test/molecule-docker/build.sh b/ansible/test/molecule-docker/build.sh index 0b65f2a7..b613e466 100755 --- a/ansible/test/molecule-docker/build.sh +++ b/ansible/test/molecule-docker/build.sh @@ -20,6 +20,7 @@ SCRIPT_DIR=$(dirname "${0}") LOCAL_PATH=$(readlink -f "$SCRIPT_DIR") +if [ $(id -u ${USER}) -eq "0" ]; then DOCKER_USER="root"; else DOCKER_USER="molecule"; fi set -e @@ -27,6 +28,7 @@ docker build \ --build-arg USER_ID=$(id -u ${USER}) \ --build-arg GROUP_ID=$(id -g ${USER}) \ --build-arg DOCKER_GROUP_ID=$(getent group docker | cut -f 3 -d ':') \ + --build-arg DOCKER_USER=${DOCKER_USER} \ -t molecule-dev:2.20.0 \ ${LOCAL_PATH} diff --git a/ansible/test/roles/prepare-resource-data/tasks/prepare-infra-server.yml b/ansible/test/roles/prepare-resource-data/tasks/prepare-infra-server.yml index b55842ac..dfaca80b 100644 --- a/ansible/test/roles/prepare-resource-data/tasks/prepare-infra-server.yml +++ b/ansible/test/roles/prepare-resource-data/tasks/prepare-infra-server.yml @@ -12,5 +12,4 @@ name: nfs-utils state: present when: - - resources_on_nfs is defined - resources_on_nfs diff --git a/ansible/test/roles/prepare-resource-data/tasks/prepare-resource-server.yml b/ansible/test/roles/prepare-resource-data/tasks/prepare-resource-server.yml index 4057ba14..1f125557 100644 --- a/ansible/test/roles/prepare-resource-data/tasks/prepare-resource-server.yml +++ b/ansible/test/roles/prepare-resource-data/tasks/prepare-resource-server.yml @@ -1,9 +1,4 @@ --- -- name: Install file exacutable if not there for archive compression checking - package: - name: file - state: present - - name: "Create resource dir {{ resources_dir }}" file: path: "{{ resources_dir }}/{{ subdir }}" @@ -68,5 +63,4 @@ - name: Export nfs command: exportfs -ar when: - - resources_on_nfs is defined - resources_on_nfs diff --git a/build/data_lists/onap_3.0.x-npm.list b/build/data_lists/onap_3.0.x-npm.list index 14c68612..a22b237e 100644 --- a/build/data_lists/onap_3.0.x-npm.list +++ b/build/data_lists/onap_3.0.x-npm.list @@ -1,787 +1,389 @@ -abbrev@1.0.9 -abbrev@1.1.1 -abs@1.3.12 -accepts@1.1.4 -accepts@1.2.13 -accepts@1.3.5 -active-x-obfuscator@0.0.1 -addressparser@0.3.2 -adm-zip@0.4.7 -amdefine@1.0.1 +async@0.1.22 +bl@0.9.5 +brace-expansion@1.1.11 +commander@2.1.0 +compression@1.1.2 +connect@2.26.1 +cookiejar@1.3.2 +csurf@1.6.6 +debug@0.7.4 +depd@0.4.5 +domelementtype@1.1.3 +domutils@1.4.3 +errorhandler@1.2.4 +express@3.17.2 +extend@1.2.1 +formidable@1.0.14 +fresh@0.2.4 +fs.extra@1.3.2 +graceful-fs@2.0.3 +grunt-cli@0.1.13 +grunt-legacy-util@0.2.0 +htmlparser2@3.7.3 +inflight@1.0.6 +isarray@0.0.1 +js-yaml@2.0.5 +libmime@0.1.7 +load-json-file@1.1.0 +lodash@4.17.11 +mime-types@2.0.14 +morgan@1.3.2 +ncp@0.6.0 +object-assign@3.0.0 +pause@0.0.1 +proxy-addr@1.0.10 +punycode@2.1.1 +range-parser@1.0.3 +redent@1.0.0 +request@2.42.0 +send@0.9.3 +sigmund@1.0.1 +smtp-connection@1.3.8 +sntp@0.2.4 +statuses@1.5.0 +strip-indent@1.0.1 +thenify@3.3.0 +through@2.2.7 +tough-cookie@2.5.0 +uglify-to-browserify@1.0.2 +underscore.string@2.3.3 +validate-npm-package-license@3.0.4 +wordwrap@0.0.3 ansi-color@0.2.1 -ansi-regex@2.1.1 -ansi-styles@2.2.1 -anymatch@1.3.2 any-promise@1.3.0 -append-field@0.1.0 -append-field@1.0.0 -argparse@0.1.16 -argparse@1.0.10 array-find-index@1.0.2 -array-flatten@1.1.1 -array-unique@0.2.1 -array-unique@0.3.2 -arr-diff@2.0.0 -arr-diff@4.0.0 -arr-flatten@1.1.0 -arr-union@3.1.0 -asn1@0.1.11 -asn1@0.2.4 +balanced-match@1.0.0 +basic-auth@1.0.0 +builtin-modules@1.1.1 +coffee-script@1.3.3 +combined-stream@0.0.7 +core-util-is@1.0.2 +crc@3.4.4 +csrf@2.0.7 +csv-stringify@0.0.8 +entities@1.0.0 +etag@1.4.0 +exit@0.1.2 +finalhandler@0.2.0 +follow-redirects@0.0.3 +hoek@0.9.1 +ipaddr.js@1.0.5 +is-builtin-module@1.0.0 +is-utf8@0.2.1 +method-override@2.2.0 +minimatch@3.0.4 +mkdirp@0.3.5 +ms@2.0.0 +needle@0.9.2 +nodemailer-direct-transport@1.1.0 +node-uuid@1.4.8 +normalize-package-data@2.4.0 +oauth@0.9.12 +on-finished@2.3.0 +options@0.0.6 +parseurl@1.3.2 +path-is-absolute@1.0.1 +pinkie@2.0.4 +pretty-data@0.40.0 +rimraf@2.2.8 +sentiment@0.2.3 +stream-counter@0.2.0 +string_decoder@1.1.1 +trim-newlines@1.0.0 +twitter-ng@0.6.2 +type-is@1.6.16 +underscore.string@2.4.0 +walk@2.3.14 +xml2js@0.4.4 +abbrev@1.1.1 assert-plus@0.1.5 -assert-plus@0.2.0 -assert-plus@1.0.0 -assign-symbols@1.0.0 -async@0.1.22 async@0.2.10 +bootstrap@3.4.0 +cookie-parser@1.3.5 +debug@2.0.0 +dicer@0.2.5 +domelementtype@1.3.1 +domutils@1.5.1 +ee-first@1.0.5 +etag@1.5.1 +formatio@1.0.2 +fs.realpath@1.0.0 +getobject@0.1.0 +glob@3.1.21 +grunt-contrib-jshint@0.10.0 +grunt-simple-mocha@0.4.0 +htmlparser2@3.8.3 +http-signature@0.10.1 +iconv-lite@0.4.24 +inherits@1.0.2 +isarray@1.0.0 +libmime@1.2.0 +lodash@0.9.2 +media-typer@0.3.0 +mime-db@1.12.0 +mime-types@2.1.21 +minimist@0.0.8 +mkdirp@0.5.0 +multer@1.1.0 +native-or-bluebird@1.1.2 +object-assign@4.1.1 +on-headers@1.0.1 +properties-reader@0.0.9 +readable-stream@1.0.27-1 +signal-exit@3.0.2 +spdx-license-ids@3.0.3 +stringstream@0.0.6 +strip-json-comments@1.0.4 +thenify-all@1.6.0 +uid-safe@1.0.1 +underscore@1.6.0 +utf7@1.0.0 +vary@1.0.1 +addressparser@0.3.2 +append-field@0.1.0 async@0.9.2 +bignumber.js@2.0.7 +busboy@0.2.14 +component-emitter@1.1.2 +concat-map@0.0.1 +connect-timeout@1.3.0 +cors@2.4.2 +csv@0.4.6 +csvtojson@0.5.14 +dateformat@1.0.12 +domhandler@2.2.1 +duplexer@0.1.1 +entities@1.1.2 +express@4.9.8 +foreachasync@3.0.0 +graceful-fs@4.1.15 +http-errors@1.2.8 +iconv-lite@0.4.4 +irc@0.3.7 +is-arrayish@0.2.1 +jshint@2.5.11 +keypress@0.1.0 +libqp@0.1.1 +loud-rejection@1.6.0 +minimatch@0.2.14 +mkdirp@0.5.1 +mqtt@0.3.13 +mysql@2.7.0 +negotiator@0.4.9 +nodemailer-smtp-transport@0.1.13 +oauth-sign@0.4.0 +once@1.4.0 +path-to-regexp@0.1.3 +pinkie-promise@2.0.1 +process@0.11.10 +qs@0.6.6 +raw-body@1.3.0 +samsam@1.1.3 +semver@5.6.0 +serve-favicon@2.1.7 +shelljs@0.3.0 +spdx-correct@3.1.0 +streamsearch@0.1.2 +utils-merge@1.0.0 +when@3.4.6 +wrappy@1.0.2 async@1.5.2 -async@2.6.1 -async-each@1.0.1 -asynckit@0.4.0 -atob@2.1.2 -aws4@1.8.0 -aws-sign2@0.5.0 -aws-sign2@0.6.0 -balanced-match@1.0.0 -base@0.11.2 -base64id@0.1.0 -base64-url@1.2.1 -basic-auth@1.0.0 -basic-auth@1.0.4 basic-auth-connect@1.0.0 -batch@0.5.1 -batch@0.5.3 -bcrypt-pbkdf@1.0.2 -bignumber.js@2.0.7 -bignumber.js@4.1.0 -binary-extensions@1.12.0 -bl@0.9.5 -body-parser@1.13.3 -body-parser@1.18.2 -body-parser@1.18.3 -body-parser@1.8.4 -boom@0.4.2 -boom@2.10.1 -bootstrap@3.4.0 bootstrap-submenu@2.0.4 -bootstrap-table@1.13.1 -brace-expansion@1.1.11 -braces@1.8.5 -braces@2.3.2 -buffer-from@1.1.1 -buildmail@1.3.0 -builtin-modules@1.1.1 -busboy@0.2.14 -bytes@1.0.0 -bytes@2.1.0 -bytes@2.4.0 -bytes@3.0.0 -cache-base@1.0.1 camelcase@2.1.1 -camelcase-keys@2.1.0 -capture-stack-trace@1.0.1 -caseless@0.11.0 caseless@0.6.0 -chalk@1.1.3 -cheerio@0.17.0 -chokidar@1.7.0 -class-utils@0.3.6 -cli@0.6.6 -clone@0.1.18 -coffee-script@1.3.3 -coffee-script@1.8.0 -collection-visit@1.0.0 -colors@0.6.2 -colors@1.3.2 -combined-stream@0.0.7 -combined-stream@1.0.7 commander@0.6.1 -commander@1.3.2 -commander@2.0.0 -commander@2.1.0 -commander@2.17.1 -commander@2.19.0 -component-emitter@1.1.2 -component-emitter@1.2.1 -compressible@2.0.15 -compression@1.1.2 -compression@1.5.2 -concat-map@0.0.1 -concat-stream@1.5.0 -concat-stream@1.6.2 -connect@2.26.1 -connect@2.30.2 -connect-timeout@1.3.0 -connect-timeout@1.6.2 -console-browserify@1.1.0 -content-disposition@0.5.2 -content-type@1.0.4 cookie@0.1.2 -cookie@0.1.3 -cookie@0.3.1 -cookiejar@1.3.2 -cookie-parser@1.3.5 cookie-signature@1.0.5 -cookie-signature@1.0.6 -copy-descriptor@0.1.1 -core-util-is@1.0.2 -cors@2.4.2 -crc@3.0.0 -crc@3.2.1 -crc@3.3.0 -crc@3.4.4 -create-error-class@3.0.2 cron@1.0.4 -cryptiles@0.2.2 -cryptiles@2.0.5 -csrf@2.0.7 -csrf@3.0.6 CSSselect@0.4.1 -CSSwhat@0.4.7 -csurf@1.6.6 -csurf@1.8.3 -csv@0.4.6 +debug@2.6.9 +depd@1.1.2 +diff@1.0.7 +ee-first@1.1.1 +form-data@0.1.2 +forwarded@0.1.2 +fs-extra@0.11.1 +glob@3.2.11 +growl@1.8.1 +grunt-legacy-log@0.1.3 +hooker@0.2.3 +iconv-lite@0.2.11 +imap@0.8.13 +inherits@2.0.3 +is-finite@1.0.2 +json-stringify-safe@5.0.1 +lodash@1.3.1 +map-obj@1.0.1 +meow@3.7.0 +methods@0.0.1 +mime@1.2.11 +minimist@1.2.0 +mocha@1.21.4 +multer@1.4.1 +mz@1.3.0 +optimist@0.3.7 +psl@1.1.31 +readable-stream@1.0.34 +read-pkg@1.1.0 +reduce-component@1.0.1 +repeating@2.0.1 +response-time@2.0.1 +rimraf@2.6.3 +serve-static@1.6.5 +sinon@1.10.3 +spdx-exceptions@2.2.0 +tinycolor@0.0.1 +uid-safe@1.1.0 +underscore@1.7.0 +util@0.10.4 +xmlbuilder@9.0.7 +accepts@1.1.4 +append-field@1.0.0 +async@2.6.1 +buffer-from@1.1.1 +bytes@1.0.0 +cli@0.6.6 +crc@3.0.0 csv-generate@0.0.6 -csv-parse@1.3.3 -csv-stringify@0.0.8 -csvtojson@0.5.14 ctype@0.5.3 -currently-unhandled@0.4.1 -dashdash@1.14.1 -dateformat@1.0.12 dateformat@1.0.2-1.2.3 -date-now@0.1.4 -debug@0.7.4 -debug@2.0.0 -debug@2.2.0 -debug@2.6.9 decamelize@1.2.0 -decode-uri-component@0.2.0 -deep-equal@1.0.1 -deep-extend@0.6.0 -deep-is@0.1.3 -deffy@2.2.2 -define-property@0.2.5 -define-property@1.0.0 -define-property@2.0.2 delayed-stream@0.0.5 -delayed-stream@1.0.0 -depd@0.4.5 -depd@1.0.1 -depd@1.1.1 -depd@1.1.2 destroy@1.0.3 -destroy@1.0.4 -di@0.0.1 -dicer@0.2.5 -diff@1.0.7 -dns-sync@0.1.3 -domelementtype@1.1.3 -domelementtype@1.3.1 -domhandler@2.2.1 domhandler@2.3.0 -dom-serializer@0.0.1 -domutils@1.4.3 -domutils@1.5.1 -duplexer@0.1.1 duplexer2@0.0.2 -duplexer2@0.1.4 -ecc-jsbn@0.1.2 -ee-first@1.0.5 -ee-first@1.1.1 ejs@0.8.8 -encodeurl@1.0.2 -entities@1.0.0 -entities@1.1.2 -err@1.1.1 -error-ex@1.3.2 -errorhandler@1.2.4 -errorhandler@1.4.3 -es6-promise@4.0.5 escape-html@1.0.1 -escape-html@1.0.2 -escape-html@1.0.3 -escape-string-regexp@1.0.5 -escodegen@1.7.1 esprima@1.0.4 -esprima@1.2.5 -esprima@2.5.0 -esprima@4.0.1 -estraverse@1.8.0 -estraverse@1.9.3 -esutils@2.0.2 -etag@1.3.1 -etag@1.4.0 -etag@1.5.1 -etag@1.7.0 -etag@1.8.1 eventemitter2@0.4.14 -exec-limiter@3.2.11 -exit@0.1.2 -expand-brackets@0.1.5 -expand-brackets@2.1.4 -expand-range@1.8.2 -express@3.17.2 -express@4.16.3 -express@4.9.8 -express-session@1.11.3 -express-session@1.15.6 -express-session@1.8.2 -extend@1.2.1 -extend@3.0.2 -extend-shallow@2.0.1 -extend-shallow@3.0.2 -extglob@0.3.2 -extglob@2.0.4 -extract-zip@1.5.0 -extsprintf@1.3.0 -fast-levenshtein@1.0.7 -fd-slicer@1.0.1 -filename-regex@2.0.1 -fileset@0.1.8 -fileset@0.2.1 -fill-range@2.2.4 -fill-range@4.0.0 -finalhandler@0.2.0 -finalhandler@0.4.0 -finalhandler@1.1.1 find-up@1.1.2 -findup-sync@0.1.3 -follow-redirects@0.0.3 -foreachasync@3.0.0 forever-agent@0.5.2 -forever-agent@0.6.1 -for-in@1.0.2 -formatio@1.0.2 -form-data@0.1.2 +glob@3.2.3 +hyperquest@0.3.0 +jsonfile@1.0.1 +libqp@1.1.0 +lodash@2.4.2 +mime-db@1.37.0 +minimatch@0.3.0 +ms@0.6.2 +multiparty@3.3.2 +nodemailer-wellknown@0.1.10 +nopt@1.0.10 +number-is-nan@1.0.1 +parse-json@2.2.0 +path@0.12.7 +qs@1.2.2 +readable-stream@1.1.14 +require-all@1.0.0 +sax@0.6.1 +shelljs@0.5.3 +stream-transform@0.1.2 +superagent@0.18.0 +tunnel-agent@0.4.3 +typedarray@0.0.6 +underscore@1.9.1 +utils-merge@1.0.1 +which@1.0.9 +ws@0.4.32 +argparse@0.1.16 +aws-sign2@0.5.0 +batch@0.5.1 +body-parser@1.8.4 +bootstrap-table@1.13.1 +camelcase-keys@2.1.0 +colors@0.6.2 +commander@1.3.2 +compressible@2.0.15 +console-browserify@1.1.0 +cookie@0.1.3 +cookie-signature@1.0.6 +cryptiles@0.2.2 +CSSwhat@0.4.7 +date-now@0.1.4 +dns-sync@0.1.3 +dom-serializer@0.0.1 +error-ex@1.3.2 +express-session@1.15.6 form-data@0.1.4 -form-data@2.1.4 -formidable@1.0.14 -for-own@0.1.5 -forwarded@0.1.2 -fragment-cache@0.2.1 -fresh@0.2.4 -fresh@0.3.0 -fresh@0.5.2 -fs-extra@0.11.1 fs-extra@0.6.4 -fs-extra@1.0.0 -fs.extra@1.3.2 -fs.realpath@1.0.0 -function.name@1.0.11 -generate-function@2.3.1 -generate-object-property@1.2.0 -getobject@0.1.0 -getpass@0.1.7 get-stdin@4.0.1 -get-value@2.0.6 -git-package-json@1.4.8 -git-source@1.1.8 -git-up@1.2.1 -git-url-parse@5.0.1 -glob@3.1.21 -glob@3.2.11 -glob@3.2.3 glob@5.0.15 -glob@7.1.3 -glob-base@0.3.0 -glob-parent@2.0.0 -got@5.7.1 graceful-fs@1.2.3 -graceful-fs@2.0.3 -graceful-fs@3.0.11 -graceful-fs@4.1.11 -graceful-fs@4.1.15 -growl@1.8.1 grunt@0.4.5 -grunt-cli@0.1.13 -grunt-contrib-jshint@0.10.0 -grunt-legacy-log@0.1.3 grunt-legacy-log-utils@0.1.1 -grunt-legacy-util@0.2.0 -grunt-simple-mocha@0.4.0 -gry@5.0.7 -handlebars@4.0.12 -har-validator@2.0.6 -has-ansi@2.0.0 -has-flag@1.0.0 -hasha@2.2.0 -has-value@0.3.1 -has-value@1.0.0 -has-values@0.1.4 -has-values@1.0.0 hawk@1.1.1 -hawk@3.1.3 -hoek@0.9.1 -hoek@2.16.3 -hooker@0.2.3 hosted-git-info@2.7.1 -htmlparser2@3.7.3 -htmlparser2@3.8.3 -http-errors@1.2.8 -http-errors@1.3.1 -http-errors@1.6.2 -http-errors@1.6.3 -http-proxy@0.10.4 -http-signature@0.10.1 -http-signature@1.1.1 -hyperquest@0.3.0 -hyperquest@1.3.0 -i@0.3.6 -ibrik@2.0.0 -iconv-lite@0.2.11 -iconv-lite@0.4.11 -iconv-lite@0.4.13 -iconv-lite@0.4.19 -iconv-lite@0.4.23 -iconv-lite@0.4.24 -iconv-lite@0.4.4 -imap@0.8.13 indent-string@2.1.0 -inflight@1.0.6 -inherits@1.0.2 -inherits@2.0.3 -ini@1.3.5 -ipaddr.js@0.1.2 -ipaddr.js@1.0.5 -ipaddr.js@1.8.0 -irc@0.3.7 -is-accessor-descriptor@0.1.6 -is-accessor-descriptor@1.0.0 -isarray@0.0.1 -isarray@1.0.0 -is-arrayish@0.2.1 -is-binary-path@1.0.1 -is-buffer@1.1.6 -is-builtin-module@1.0.0 -is-data-descriptor@0.1.4 -is-data-descriptor@1.0.0 -is-descriptor@0.1.6 -is-descriptor@1.0.2 -is-dotfile@1.0.3 -is-equal-shallow@0.1.3 -isexe@2.0.0 -is-extendable@0.1.1 -is-extendable@1.0.1 -is-extglob@1.0.0 -is-finite@1.0.2 -is-glob@2.0.1 -is-my-ip-valid@1.0.0 -is-my-json-valid@2.19.0 -is-number@2.1.0 -is-number@3.0.0 -is-number@4.0.0 -isobject@2.1.0 -isobject@3.0.1 -is-plain-object@2.0.4 -is-posix-bracket@0.1.1 -is-primitive@2.0.0 -is-property@1.0.2 -is-redirect@1.0.0 -is-retry-allowed@1.1.0 -is-ssh@1.3.0 -isstream@0.1.2 -is-stream@1.1.0 -istanbul@0.3.22 -is-typedarray@1.0.0 -is-utf8@0.2.1 -is-windows@1.0.2 -iterate-object@1.3.2 -jade@0.26.3 -jsbn@0.1.1 -jshint@2.5.11 -jsonfile@1.0.1 -jsonfile@2.4.0 -jsonpointer@4.0.1 -json-schema@0.2.3 -json-stringify-safe@5.0.1 -jsprim@1.4.1 -js-yaml@2.0.5 -js-yaml@3.12.0 -karma@0.12.37 -karma-chrome-launcher@0.1.12 -karma-coverage@0.2.7 -karma-firefox-launcher@0.1.7 -karma-jasmine@0.2.3 -karma-phantomjs-launcher@1.0.4 -karma-spec-reporter@0.0.23 -kew@0.7.0 -keypress@0.1.0 -kind-of@3.2.2 -kind-of@4.0.0 -kind-of@5.1.0 -kind-of@6.0.2 -klaw@1.3.1 -levn@0.2.5 libbase64@0.1.0 -libmime@0.1.7 -libmime@1.2.0 -libqp@0.1.1 -libqp@1.1.0 -limit-it@3.2.8 -load-json-file@1.1.0 -lodash@0.9.2 -lodash@1.3.1 -lodash@2.4.2 lodash@3.10.1 -lodash@3.7.0 -lodash@4.17.11 -log4js@0.6.38 -loud-rejection@1.6.0 -lowercase-keys@1.0.1 -lru-cache@2.7.3 -lru-cache@4.1.3 -map-cache@0.2.2 -map-obj@1.0.1 -map-visit@1.0.0 -math-random@1.0.1 -media-typer@0.3.0 -meow@3.7.0 merge-descriptors@0.0.2 -merge-descriptors@1.0.1 -method-override@2.2.0 -method-override@2.3.10 -methods@0.0.1 methods@1.0.0 -methods@1.1.0 -methods@1.1.2 -micromatch@2.3.11 -micromatch@3.1.10 -mime@1.2.11 mime@1.2.5 -mime@1.3.4 -mime@1.4.1 -mime@1.6.0 -mime-db@1.12.0 -mime-db@1.36.0 -mime-db@1.37.0 mime-types@1.0.2 -mime-types@2.0.14 -mime-types@2.1.20 -mime-types@2.1.21 -minimatch@0.2.14 -minimatch@0.3.0 -minimatch@0.4.0 -minimatch@1.0.0 -minimatch@2.0.10 -minimatch@3.0.4 -minimist@0.0.8 -minimist@1.2.0 -mixin-deep@1.3.1 -mkdirp@0.3.0 -mkdirp@0.3.5 -mkdirp@0.5.0 -mkdirp@0.5.1 -mocha@1.21.4 moment@2.23.0 -morgan@1.3.2 -morgan@1.6.1 -mqtt@0.3.13 -ms@0.6.2 -ms@0.7.1 -ms@0.7.2 -ms@2.0.0 -multer@1.1.0 -multer@1.4.1 -multiparty@3.3.2 -mustache@0.8.2 -mysql@2.16.0 -mysql@2.7.0 -mz@1.3.0 nan@1.0.0 -nanomatch@1.2.13 -native-or-bluebird@1.1.2 -natives@1.1.6 ncp@0.4.2 -ncp@0.6.0 -needle@0.9.2 -negotiator@0.4.9 -negotiator@0.5.3 -negotiator@0.6.1 +path-type@1.1.0 +proxy-addr@1.0.1 +qs@2.2.3 +random-bytes@1.0.0 +read-pkg-up@1.0.1 +safe-buffer@5.1.2 +serve-index@1.2.1 +should@4.0.4 +spdx-expression-parse@3.0.0 +strip-bom@2.0.0 +through2@0.6.5 +uglify-js@2.4.15 +underscore.string@2.2.1 +util@0.11.1 +amdefine@1.0.1 +asn1@0.1.11 +base64-url@1.2.1 +boom@0.4.2 +buildmail@1.3.0 +cheerio@0.17.0 +clone@0.1.18 +commander@2.0.0 +concat-stream@1.6.2 +cookie@0.3.1 +crc@3.2.1 +csv-parse@1.3.3 +currently-unhandled@0.4.1 +etag@1.3.1 +express-session@1.8.2 +findup-sync@0.1.3 +glob@7.1.3 +hyperquest@1.3.0 +ipaddr.js@0.1.2 +jade@0.26.3 +jsonfile@2.4.0 +lodash@3.7.0 +lru-cache@2.7.3 +methods@1.1.0 +minimatch@1.0.0 +mkdirp@0.3.0 +mustache@0.8.2 nodemailer@1.3.0 -nodemailer-direct-transport@1.1.0 -nodemailer-smtp-transport@0.1.13 -nodemailer-wellknown@0.1.10 -node-status-codes@1.0.0 -node-uuid@1.4.8 -noop6@1.0.7 -nopt@1.0.10 nopt@3.0.1 -nopt@3.0.6 -normalize-package-data@2.4.0 -normalize-path@2.1.1 -number-is-nan@1.0.1 -oargv@3.4.8 -oauth@0.9.12 -oauth-sign@0.4.0 -oauth-sign@0.8.2 -obj-def@1.0.6 -object-assign@3.0.0 -object-assign@4.1.1 -object-copy@0.1.0 -object.omit@2.0.1 -object.pick@1.3.0 -object-visit@1.0.1 -once@1.4.0 -one-by-one@3.2.6 on-finished@2.1.0 -on-finished@2.3.0 -on-headers@1.0.1 -optimist@0.3.7 -optimist@0.6.1 -optionator@0.5.0 -options@0.0.6 -os-tmpdir@1.0.2 -package.json@2.0.1 -package-json@2.4.0 -package-json-path@1.0.7 -parse-glob@3.0.4 -parse-json@2.2.0 -parse-url@1.3.11 -parseurl@1.3.2 -pascalcase@0.1.1 -path@0.12.7 path-exists@2.1.0 -path-is-absolute@1.0.1 -path-to-regexp@0.1.3 -path-to-regexp@0.1.7 -path-type@1.1.0 -pause@0.0.1 -pause@0.1.0 -pend@1.2.0 -phantomjs-prebuilt@2.1.14 pify@2.3.0 -pinkie@2.0.4 -pinkie-promise@2.0.1 -pkginfo@0.3.1 -policyfile@0.0.4 -posix-character-classes@0.1.1 -prelude-ls@1.1.2 -prepend-http@1.0.4 -preserve@0.2.0 -pretty-data@0.40.0 -process@0.11.10 -process-nextick-args@1.0.7 process-nextick-args@2.0.0 -progress@1.1.8 -properties-reader@0.0.9 -protocols@1.4.6 -proxy-addr@1.0.1 -proxy-addr@1.0.10 -proxy-addr@2.0.4 -pseudomap@1.0.2 -psl@1.1.31 -punycode@1.4.1 -punycode@2.1.1 -q@1.5.1 -qs@0.6.6 -qs@1.2.2 -qs@2.2.3 qs@2.2.4 -qs@4.0.0 -qs@6.3.2 -qs@6.5.1 -qs@6.5.2 -randomatic@3.1.0 -random-bytes@1.0.0 -range-parser@1.0.3 -range-parser@1.2.0 -raw-body@1.3.0 -raw-body@2.1.7 -raw-body@2.3.2 -raw-body@2.3.3 -rc@1.2.8 -readable-stream@1.0.27-1 -readable-stream@1.0.34 -readable-stream@1.1.14 -readable-stream@2.0.6 readable-stream@2.3.6 -read-all-stream@3.1.0 -readdirp@2.2.1 -read-pkg@1.1.0 -read-pkg-up@1.0.1 -redent@1.0.0 -redis@0.7.3 -reduce-component@1.0.1 -regex-cache@0.4.4 -regex-not@1.0.2 -registry-auth-token@3.3.2 -registry.npmjs.org@1.0.1 -registry-url@3.1.0 -remove-trailing-separator@1.1.0 -repeat-element@1.1.3 -repeating@2.0.1 -repeat-string@1.6.1 -request@2.42.0 -request@2.79.0 -request-progress@2.0.1 -require-all@1.0.0 resolve@0.3.1 -resolve@1.1.7 -resolve-url@0.2.1 -response-time@2.0.1 -response-time@2.3.2 -ret@0.1.15 -rimraf@2.2.8 -rimraf@2.6.2 -rimraf@2.6.3 -r-json@1.2.8 rndm@1.1.1 -rndm@1.2.0 -r-package-json@1.0.7 -safe-buffer@5.1.1 -safe-buffer@5.1.2 safer-buffer@2.1.2 -safe-regex@1.1.0 -samsam@1.1.3 -sax@0.6.1 scmp@1.0.0 -semver@4.3.6 -semver@5.6.0 -send@0.13.2 -send@0.16.2 send@0.9.2 -send@0.9.3 -sentiment@0.2.3 -serve-favicon@2.1.7 -serve-favicon@2.3.2 -serve-index@1.2.1 -serve-index@1.7.3 -serve-static@1.10.3 -serve-static@1.13.2 -serve-static@1.6.5 -setprototypeof@1.0.3 -setprototypeof@1.1.0 -set-value@0.4.3 -set-value@2.0.0 -shelljs@0.3.0 -shelljs@0.5.3 -should@4.0.4 -sigmund@1.0.1 -signal-exit@3.0.2 -sinon@1.10.3 -sliced@1.0.1 -smtp-connection@1.3.8 -snapdragon@0.8.2 -snapdragon-node@2.1.1 -snapdragon-util@3.0.1 -sntp@0.2.4 -sntp@1.0.9 -socket.io@0.9.16 -socket.io-client@0.9.16 source-map@0.1.34 -source-map@0.2.0 -source-map@0.4.4 -source-map@0.5.7 -source-map@0.6.1 -source-map-resolve@0.5.2 -source-map-url@0.4.0 -spdx-correct@3.0.2 -spdx-correct@3.1.0 -spdx-exceptions@2.2.0 -spdx-expression-parse@3.0.0 -spdx-license-ids@3.0.1 -spdx-license-ids@3.0.3 -split-string@3.1.0 -sprintf-js@1.0.3 -sqlstring@2.3.1 -sshpk@1.15.1 -static-extend@0.1.2 -statuses@1.2.1 -statuses@1.4.0 -statuses@1.5.0 -stream-counter@0.2.0 -streamsearch@0.1.2 -stream-transform@0.1.2 string_decoder@0.10.31 -string_decoder@1.1.1 -stringstream@0.0.6 -strip-ansi@3.0.1 -strip-bom@2.0.0 -strip-indent@1.0.1 -strip-json-comments@1.0.4 -strip-json-comments@2.0.1 -superagent@0.18.0 supertest@0.13.0 -supports-color@2.0.0 -supports-color@3.2.3 -swagger-ui-dist@3.19.3 -swagger-ui-express@4.0.1 -thenify@3.3.0 -thenify-all@1.6.0 -throttleit@1.0.0 -through2@0.6.5 -through@2.2.7 -timed-out@3.1.3 -tinycolor@0.0.1 -tmp@0.0.28 -to-object-path@0.3.0 -to-regex@3.0.2 -to-regex-range@2.1.1 -tough-cookie@2.3.4 -tough-cookie@2.5.0 -trim-newlines@1.0.0 -tsscmp@1.0.5 -tunnel-agent@0.4.3 -tweetnacl@0.14.5 -twitter-ng@0.6.2 -type-check@0.3.2 -typedarray@0.0.6 type-is@1.5.7 -type-is@1.6.16 -typpy@2.3.10 -uglify-js@1.2.5 -uglify-js@2.4.15 -uglify-js@3.4.9 -uglify-to-browserify@1.0.2 -uid-safe@1.0.1 -uid-safe@1.1.0 -uid-safe@2.0.0 -uid-safe@2.1.4 uid-safe@2.1.5 -ul@5.2.13 -underscore@1.6.0 -underscore@1.7.0 -underscore@1.9.1 -underscore.string@2.2.1 -underscore.string@2.3.3 -underscore.string@2.4.0 -union-value@1.0.0 -unpipe@1.0.0 -unset-value@1.0.0 -unzip-response@1.0.2 -urix@0.1.0 -url-parse-lax@1.0.0 -use@3.1.1 -useragent@2.3.0 -utf7@1.0.0 -util@0.10.4 -util@0.11.1 util-deprecate@1.0.2 -utile@0.2.1 -utils-merge@1.0.0 -utils-merge@1.0.1 -uuid@3.3.2 -validate-npm-package-license@3.0.4 -vary@1.0.1 -vary@1.1.2 -verror@1.10.0 vhost@3.0.2 -walk@2.3.14 -when@3.4.6 -which@1.0.9 -which@1.2.14 -wordwrap@0.0.3 -wordwrap@1.0.0 -wrappy@1.0.2 -ws@0.4.32 xml2js@0.4.19 -xml2js@0.4.4 -xmlbuilder@10.1.1 -xmlbuilder@9.0.7 -xmlhttprequest@1.4.2 -xtend@4.0.1 -yallist@2.1.2 -yamljs@0.3.0 -yauzl@2.4.1 -zeparser@0.0.5 +xtend@4.0.1
\ No newline at end of file |