Add CPU pinning support for node context 09/31009/1
authorJingLu5 <lvjing5@huawei.com>
Wed, 8 Mar 2017 03:28:27 +0000 (03:28 +0000)
committerJing Lu <lvjing5@huawei.com>
Mon, 20 Mar 2017 09:34:00 +0000 (09:34 +0000)
JIRA: YARDSTICK-573

Since the yardstick framework now has supported an improved node type context,
this patch adds support for VM vcpu pinning ability in the node type context.
It provides several scripts that can be used to configurate the controller and
compute nodes.

Change-Id: If2c6e7b1b85ff78b9d2a5997bf03bdc6877aaf74
Signed-off-by: JingLu5 <lvjing5@huawei.com>
(cherry picked from commit f138b480ea4c9954d107555d7a46ec3d4375653f)

16 files changed:
ansible/ansible.cfg [new file with mode: 0644]
ansible/cpu_pin_setup.yaml [new file with mode: 0644]
ansible/cpu_pin_teardown.yaml [new file with mode: 0644]
ansible/inventory.ini [new file with mode: 0644]
ansible/roles/cpu_pin_local_setup/tasks/main.yaml [new file with mode: 0644]
ansible/roles/cpu_pin_local_teardowm/tasks/main.yaml [new file with mode: 0644]
ansible/roles/restart_nova_compute/tasks/main.yaml [new file with mode: 0644]
ansible/roles/restart_nova_scheduler/tasks/main.yaml [new file with mode: 0644]
ansible/roles/scheduler_default_filters_reset/tasks/main.yaml [new file with mode: 0644]
ansible/roles/scheduler_default_filters_setup/tasks/main.yaml [new file with mode: 0644]
ansible/roles/scheduler_default_filters_setup/vars/main.yaml [new file with mode: 0644]
ansible/roles/vcpu_pin_set_reset/tasks/main.yaml [new file with mode: 0644]
ansible/roles/vcpu_pin_set_setup/tasks/main.yaml [new file with mode: 0644]
ansible/roles/vcpu_pin_set_setup/vars/main.yaml [new file with mode: 0644]
tests/unit/benchmark/contexts/test_node.py
yardstick/benchmark/contexts/node.py

diff --git a/ansible/ansible.cfg b/ansible/ansible.cfg
new file mode 100644 (file)
index 0000000..14c8065
--- /dev/null
@@ -0,0 +1,2 @@
+[defaults]
+host_key_checking = False
diff --git a/ansible/cpu_pin_setup.yaml b/ansible/cpu_pin_setup.yaml
new file mode 100644 (file)
index 0000000..2a3fb5b
--- /dev/null
@@ -0,0 +1,23 @@
+---
+##############################################################################
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+- hosts: localhost
+  roles:
+    - cpu_pin_local_setup
+
+- hosts: controller
+  roles:
+    - scheduler_default_filters_setup
+    - restart_nova_scheduler
+
+- hosts: compute
+  roles:
+    - vcpu_pin_set_setup
+    - restart_nova_compute
diff --git a/ansible/cpu_pin_teardown.yaml b/ansible/cpu_pin_teardown.yaml
new file mode 100644 (file)
index 0000000..7647eeb
--- /dev/null
@@ -0,0 +1,23 @@
+---
+##############################################################################
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+- hosts: compute
+  roles:
+      - vcpu_pin_set_reset
+      - restart_nova_compute
+
+- hosts: controller
+  roles:
+      - scheduler_default_filters_reset
+      - restart_nova_scheduler
+
+- hosts: localhost
+  roles:
+      - cpu_pin_local_teardown
diff --git a/ansible/inventory.ini b/ansible/inventory.ini
new file mode 100644 (file)
index 0000000..440e625
--- /dev/null
@@ -0,0 +1,8 @@
+[controller]
+host1 ansible_host=10.1.0.50 ansible_user=root ansible_ssh_pass=root
+host2 ansible_host=10.1.0.51 ansible_user=root ansible_ssh_pass=root
+host3 ansible_host=10.1.0.52 ansible_user=root ansible_ssh_pass=root
+
+[compute]
+host4 ansible_host=10.1.0.53 ansible_user=root ansible_ssh_pass=root
+host5 ansible_host=10.1.0.54 ansible_user=root ansible_ssh_pass=root
diff --git a/ansible/roles/cpu_pin_local_setup/tasks/main.yaml b/ansible/roles/cpu_pin_local_setup/tasks/main.yaml
new file mode 100644 (file)
index 0000000..c25b801
--- /dev/null
@@ -0,0 +1,63 @@
+---
+##############################################################################
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+- name: get nova-compute host
+  shell:
+    source /etc/yardstick/openstack.creds;
+    openstack availability zone list --long | grep nova-compute | sort | awk '{print $7}';
+  args:
+      executable: /bin/bash
+  register: compute_nodes
+
+- name: get existing flavor list
+  shell:
+    source /etc/yardstick/openstack.creds;
+    openstack flavor list | grep "True" | cut -f 2 -d ' ';
+  args:
+      executable: /bin/bash
+  register: flavors
+
+- name: create pinned-cpu and regular host aggregate
+  shell:
+    source /etc/yardstick/openstack.creds;
+    openstack aggregate create pinned-cpu;
+    openstack aggregate create regular;
+    nova aggregate-set-metadata pinned-cpu pinned=true;
+    nova aggregate-set-metadata regular pinned=false;
+    nova aggregate-add-host pinned-cpu {{ compute_nodes.stdout_lines[0] }};
+    nova aggregate-add-host regular {{ compute_nodes.stdout_lines[1] }};
+  args:
+      executable: /bin/bash
+
+- name: set flavor default property
+  shell:
+    source /etc/yardstick/openstack.creds;
+    openstack flavor set --property aggregate_instance_extra_specs:pinned=false {{item}};
+  args:
+      executable: /bin/bash
+  with_items:
+      - '{{ flavors.stdout_lines }}'
+
+- name: create flavor yardstick-pinned-flavor
+  os_nova_flavor:
+    cloud: opnfv
+    state: present
+    name: yardstick-pinned-flavor
+    ram: 512
+    vcpus: 3
+    disk: 3
+
+- name: set yardstick-pinned-flavor property
+  shell:
+    source /etc/yardstick/openstack.creds;
+    openstack flavor set --property hw:cpu_policy=dedicated yardstick-pinned-flavor;
+    openstack flavor set --property aggregate_instance_extra_specs:pinned=true yardstick-pinned-flavor;
+  args:
+      executable: /bin/bash
diff --git a/ansible/roles/cpu_pin_local_teardowm/tasks/main.yaml b/ansible/roles/cpu_pin_local_teardowm/tasks/main.yaml
new file mode 100644 (file)
index 0000000..2947542
--- /dev/null
@@ -0,0 +1,50 @@
+---
+##############################################################################
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+- name: get nova-compute host
+  shell:
+    source /etc/yardstick/openstack.creds;
+    openstack availability zone list --long | grep nova-compute | sort | awk '{print $7}';
+  args:
+      executable: /bin/bash
+  register: compute_nodes
+
+- name: delete flavor yardstick-pinned-flavor
+  os_nova_flavor:
+    cloud: opnfv
+    state: absent
+    name: yardstick-pinned-flavor
+
+- name: get flavor list
+  shell:
+    source /etc/yardstick/openstack.creds;
+    openstack flavor list | grep "True" | cut -f 2 -d ' ';
+  args:
+      executable: /bin/bash
+  register: flavors
+
+- name: unset flavor default property
+  shell:
+    source /etc/yardstick/openstack.creds;
+    openstack flavor unset --property aggregate_instance_extra_specs:pinned {{item}};
+  args:
+      executable: /bin/bash
+  with_items:
+      - '{{ flavors.stdout_lines }}'
+
+- name: delete pinned-cpu and regular host aggregate
+  shell:
+    source /etc/yardstick/openstack.creds;
+    nova aggregate-remove-host pinned-cpu {{ compute_nodes.stdout_lines[0] }};
+    nova aggregate-remove-host regular {{ compute_nodes.stdout_lines[1] }};
+    openstack aggregate delete pinned-cpu;
+    openstack aggregate delete regular;
+  args:
+      executable: /bin/bash
diff --git a/ansible/roles/restart_nova_compute/tasks/main.yaml b/ansible/roles/restart_nova_compute/tasks/main.yaml
new file mode 100644 (file)
index 0000000..77c2d4d
--- /dev/null
@@ -0,0 +1,14 @@
+---
+##############################################################################
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+- name: restart nova compute service
+  service:
+    name: nova-compute
+    state: restarted
diff --git a/ansible/roles/restart_nova_scheduler/tasks/main.yaml b/ansible/roles/restart_nova_scheduler/tasks/main.yaml
new file mode 100644 (file)
index 0000000..543e946
--- /dev/null
@@ -0,0 +1,14 @@
+---
+##############################################################################
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+- name: restart nova scheduler service
+  service:
+    name: nova-scheduler
+    state: restarted
diff --git a/ansible/roles/scheduler_default_filters_reset/tasks/main.yaml b/ansible/roles/scheduler_default_filters_reset/tasks/main.yaml
new file mode 100644 (file)
index 0000000..21e0efc
--- /dev/null
@@ -0,0 +1,15 @@
+---
+##############################################################################
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+- name: reset scheduler default filters
+  lineinfile:
+    dest: /etc/nova/nova.conf
+    state: absent
+    regexp: 'scheduler_default_filters'
diff --git a/ansible/roles/scheduler_default_filters_setup/tasks/main.yaml b/ansible/roles/scheduler_default_filters_setup/tasks/main.yaml
new file mode 100644 (file)
index 0000000..5429ca9
--- /dev/null
@@ -0,0 +1,15 @@
+---
+##############################################################################
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+- name: add scheduler_default_filters for cpu pinning
+  lineinfile:
+    dest: /etc/nova/nova.conf
+    insertafter: 'DEFAULT'
+    line: 'scheduler_default_filters={{cpu_pin_filters}}'
diff --git a/ansible/roles/scheduler_default_filters_setup/vars/main.yaml b/ansible/roles/scheduler_default_filters_setup/vars/main.yaml
new file mode 100644 (file)
index 0000000..47b9444
--- /dev/null
@@ -0,0 +1 @@
+cpu_pin_filters: NUMATopologyFilter,AggregateInstanceExtraSpecsFilter
diff --git a/ansible/roles/vcpu_pin_set_reset/tasks/main.yaml b/ansible/roles/vcpu_pin_set_reset/tasks/main.yaml
new file mode 100644 (file)
index 0000000..f862c3c
--- /dev/null
@@ -0,0 +1,21 @@
+---
+##############################################################################
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+- name: remove vcpu pin set
+  lineinfile:
+    dest: /etc/nova/nova.conf
+    state: absent
+    regexp: 'vcpu_pin_set'
+
+- name: remove memory reserved for host
+  lineinfile:
+    dest: /etc/nova/nova.conf
+    state: absent
+    regexp: 'reserved_host_memory_mb'
diff --git a/ansible/roles/vcpu_pin_set_setup/tasks/main.yaml b/ansible/roles/vcpu_pin_set_setup/tasks/main.yaml
new file mode 100644 (file)
index 0000000..2a456ab
--- /dev/null
@@ -0,0 +1,21 @@
+---
+##############################################################################
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+- name: set memory reserved for host
+  lineinfile:
+    dest: /etc/nova/nova.conf
+    insertafter: 'DEFAULT'
+    line: 'reserved_host_memory_mb={{host_memory}}'
+
+- name: set vcpu pin set
+  lineinfile:
+    dest: /etc/nova/nova.conf
+    insertafter: 'DEFAULT'
+    line: 'vcpu_pin_set={{cpu_set}}
diff --git a/ansible/roles/vcpu_pin_set_setup/vars/main.yaml b/ansible/roles/vcpu_pin_set_setup/vars/main.yaml
new file mode 100644 (file)
index 0000000..e5d407b
--- /dev/null
@@ -0,0 +1,2 @@
+cpu_set: 0,2,4,6,8,10,12,14,16
+host_memory: 512
index 53a8ffa..4b35ca4 100644 (file)
@@ -127,27 +127,23 @@ class NodeContextTestCase(unittest.TestCase):
 
     prefix = 'yardstick.benchmark.contexts.node'
 
-    @mock.patch('{}.NodeContext._execute_script'.format(prefix))
-    def test_deploy(self, execute_script_mock):
+    @mock.patch('{}.NodeContext._dispatch_script'.format(prefix))
+    def test_deploy(self, dispatch_script_mock):
         obj = node.NodeContext()
         obj.env = {
-            'setup': [
-                {'node5': {}}
-            ]
+            'type': 'script'
         }
         obj.deploy()
-        self.assertTrue(execute_script_mock.called)
+        self.assertTrue(dispatch_script_mock.called)
 
-    @mock.patch('{}.NodeContext._execute_script'.format(prefix))
-    def test_undeploy(self, execute_script_mock):
+    @mock.patch('{}.NodeContext._dispatch_script'.format(prefix))
+    def test_undeploy(self, dispatch_script_mock):
         obj = node.NodeContext()
         obj.env = {
-            'teardown': [
-                {'node5': {}}
-            ]
+            'type': 'script'
         }
         obj.undeploy()
-        self.assertTrue(execute_script_mock.called)
+        self.assertTrue(dispatch_script_mock.called)
 
     @mock.patch('{}.ssh.SSH._put_file_shell'.format(prefix))
     @mock.patch('{}.ssh.SSH.execute'.format(prefix))
index f8c38cb..8bf9156 100644 (file)
@@ -78,18 +78,39 @@ class NodeContext(Context):
         LOG.debug("Env: %r", self.env)
 
     def deploy(self):
-        setups = self.env.get('setup', [])
-        for setup in setups:
-            for host, info in setup.items():
-                self._execute_script(host, info)
+        config_type = self.env.get('type', '')
+        if config_type == 'ansible':
+            self._dispatch_ansible('setup')
+        elif config_type == 'script':
+            self._dispatch_script('setup')
 
     def undeploy(self):
-        teardowns = self.env.get('teardown', [])
-        for teardown in teardowns:
-            for host, info in teardown.items():
+        config_type = self.env.get('type', '')
+        if config_type == 'ansible':
+            self._dispatch_ansible('teardown')
+        elif config_type == 'script':
+            self._dispatch_script('teardown')
+        super(NodeContext, self).undeploy()
+
+    def _dispatch_script(self, key):
+        steps = self.env.get(key, [])
+        for step in steps:
+            for host, info in step.items():
                 self._execute_script(host, info)
 
-        super(NodeContext, self).undeploy()
+    def _dispatch_ansible(self, key):
+        try:
+            step = self.env[key]
+        except KeyError:
+            pass
+        else:
+            self._do_ansible_job(step)
+
+    def _do_ansible_job(self, path):
+        cmd = 'ansible-playbook -i inventory.ini %s' % path
+        base = '/home/opnfv/repos/yardstick/ansible'
+        p = subprocess.Popen(cmd, shell=True, cwd=base)
+        p.communicate()
 
     def _get_server(self, attr_name):
         """lookup server info by name from context