Tempest: admin-policy scenario basic operation test
The admin-policy scenario test configures test topology that allows VMs at 2 tenants to talk to each other or rejected based on the NSX policy being applied to their security-group. Traffic forwarding is validated using different policy-ID assigned to tenant VMs' security-group. Ping-test uses CONF.scenario.waitfor_connectivity for how long it should wait for ping test to PASS or FAIL. If ping not in expected condition, additinoal ping-test will be conducted. All three router types are tested. policy-AA and policy-BB blueprint to be imported to NSX. Change-Id: I6960a1bbccdb6c4664a36a22ec4ccc28b368f2c0
This commit is contained in:
parent
1fbbadb65a
commit
f3669228d9
90
vmware_nsx_tempest/doc/README-AdminPolicy.rst
Normal file
90
vmware_nsx_tempest/doc/README-AdminPolicy.rst
Normal file
@ -0,0 +1,90 @@
|
||||
Admin Policy
|
||||
============
|
||||
|
||||
Admin policy, neutron extension secuirty-group-policy provides organization
|
||||
to enforce traffic forwarding utilizing NSX security policy.
|
||||
|
||||
The "Admin Policy" feature is admin priviledge, normal project/tenant is not
|
||||
able to create security-group-policy.
|
||||
|
||||
This feature can be enabled from devstack or manually.
|
||||
|
||||
Enable security-group-policy extention at bring up devstack
|
||||
===========================================================
|
||||
|
||||
You can enable security-group-policy when starting up devstack.
|
||||
However, if the policy-id does not exist, starting will fail.
|
||||
|
||||
To enable it, add the following tokens to local.conf:
|
||||
|
||||
NSXV_USE_NSX_POLICIES=True
|
||||
NSXV_DEFAULT_POLICY_ID=policy-11
|
||||
NSXV_ALLOW_TENANT_RULES_WITH_POLICY=True
|
||||
|
||||
Change values according to your needs though.
|
||||
|
||||
Enable security-group-policy extention manually
|
||||
===============================================
|
||||
|
||||
Instruction is from the view of devstack
|
||||
|
||||
#. Add following items to /etc/neutron/policy.json::
|
||||
|
||||
"create_security_group:logging": "rule:admin_only",
|
||||
"update_security_group:logging": "rule:admin_only",
|
||||
"get_security_group:logging": "rule:admin_only",
|
||||
"create_security_group:provider": "rule:admin_only",
|
||||
"create_port:provider_security_groups": "rule:admin_only",
|
||||
"create_security_group:policy": "rule:admin_only",
|
||||
"update_security_group:policy": "rule:admin_only",
|
||||
|
||||
#. Add following key=value pair to session [nsxv] of /etc/neutron/plugin/vmware/nsx.ini::
|
||||
|
||||
use_nsx_policies = True
|
||||
default_policy_id = policy-11
|
||||
allow_tenant_rules_with_policy = False
|
||||
|
||||
# NOTE: For automation, set allow_tenant_rules_with_policy to True
|
||||
|
||||
tempest.conf
|
||||
============
|
||||
|
||||
At session [nsxv] add the following 3 key=value pair:
|
||||
|
||||
default_policy_id = policy-11
|
||||
alt_policy_id = policy-22
|
||||
allow_tenant_rules_with_policy = False
|
||||
|
||||
# NOTE: default_policy_id and allow_tenant_rules_with_policy need to match nsx.ini
|
||||
|
||||
default_policy_id and alt_policy_id:
|
||||
|
||||
For API tests, both must exist at NSX.
|
||||
|
||||
For scenario tests, please refer to nsxv/scenario/test_admin_policy_basic_ops.py
|
||||
|
||||
In short::
|
||||
|
||||
policy-11 (policy-AA at script & test-plan) firewall rules::
|
||||
action-1: dhcp-in/any/policy-security-groups/dhcp/Allow
|
||||
action-2: dhcp-out/policy-security-groups/dhcp/Allow
|
||||
action-3: ping-in/any/policy-security-groups/ICMP/Allow
|
||||
action-4: ping-out/policy-security-groups/any/ICMP/Allow/
|
||||
action-5: ssh-in/any/policy-security-groups/SSH/Allow/
|
||||
action-6: ssh-in/any/policy-security-groups/SSH/Allow/
|
||||
action-7: http-ok/any/policy-security-groups/HTTP,HTTPS/Allow/
|
||||
action-8: sorry-nothing-allowed/any/policy-security-groups/Any/Reject
|
||||
|
||||
You can import policy-AA to NSX using the admin-policy-AA.blueprint
|
||||
|
||||
policy-22 (policy-BB at script & test-plan) firewall rules::
|
||||
action-1: dhcp-in/any/policy-security-groups/dhcp/Allow
|
||||
action-2: dhcp-out/policy-security-groups/dhcp/Allow
|
||||
action-3: group-ping/policy-security-groups/policy-security-groups/ICMP/Allow/
|
||||
action-4: ssh-in/any/policy-security-groups/SSH/Allow/
|
||||
action-5: ssh-in/any/policy-security-groups/SSH/Allow/
|
||||
action-6: http-ok/any/policy-security-groups/HTTP,HTTPS/Allow/
|
||||
pction-7: sorry-nothing-allowed/any/policy-security-groups/Any/Reject
|
||||
|
||||
NOTE on ping: same as policy-11 but only allowed from policy-security-groups
|
||||
You can import policy-BB to NSX using the admin-policy-BB.blueprint
|
341
vmware_nsx_tempest/doc/admin-policy-AA.blueprint
Normal file
341
vmware_nsx_tempest/doc/admin-policy-AA.blueprint
Normal file
@ -0,0 +1,341 @@
|
||||
<securityPolicyHierarchy>
|
||||
<name>admin-policy-AA</name>
|
||||
<description>8 firewall rules - ping, ssh from anywhere are OK</description>
|
||||
<securityPolicy>
|
||||
<revision>0</revision>
|
||||
<name>security-policy-AA</name>
|
||||
<description>Security Policy AA</description>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>false</inheritanceAllowed>
|
||||
<precedence>5500</precedence>
|
||||
<actionsByCategory>
|
||||
<category>firewall</category>
|
||||
<action class="firewallSecurityAction">
|
||||
<revision>0</revision>
|
||||
<name>dhcp-in</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<category>firewall</category>
|
||||
<executionOrder>1</executionOrder>
|
||||
<isEnabled>true</isEnabled>
|
||||
<isActionEnforced>false</isActionEnforced>
|
||||
<invalidSecondaryContainers>false</invalidSecondaryContainers>
|
||||
<applications>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>DHCP-Client</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>UDP</applicationProtocol>
|
||||
<value>68</value>
|
||||
</element>
|
||||
</application>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>DHCP-Server</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>UDP</applicationProtocol>
|
||||
<value>67</value>
|
||||
</element>
|
||||
</application>
|
||||
</applications>
|
||||
<invalidApplications>false</invalidApplications>
|
||||
<logged>false</logged>
|
||||
<action>allow</action>
|
||||
<direction>inbound</direction>
|
||||
<outsideSecondaryContainer>false</outsideSecondaryContainer>
|
||||
</action>
|
||||
<action class="firewallSecurityAction">
|
||||
<revision>0</revision>
|
||||
<name>dhcp-out</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<category>firewall</category>
|
||||
<executionOrder>2</executionOrder>
|
||||
<isEnabled>true</isEnabled>
|
||||
<isActionEnforced>false</isActionEnforced>
|
||||
<invalidSecondaryContainers>false</invalidSecondaryContainers>
|
||||
<applications>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>DHCP-Client</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>UDP</applicationProtocol>
|
||||
<value>68</value>
|
||||
</element>
|
||||
</application>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>DHCP-Server</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>UDP</applicationProtocol>
|
||||
<value>67</value>
|
||||
</element>
|
||||
</application>
|
||||
</applications>
|
||||
<invalidApplications>false</invalidApplications>
|
||||
<logged>false</logged>
|
||||
<action>allow</action>
|
||||
<direction>outbound</direction>
|
||||
<outsideSecondaryContainer>false</outsideSecondaryContainer>
|
||||
</action>
|
||||
<action class="firewallSecurityAction">
|
||||
<revision>0</revision>
|
||||
<name>ping-in</name>
|
||||
<description>Everyone can ping me</description>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<category>firewall</category>
|
||||
<executionOrder>3</executionOrder>
|
||||
<isEnabled>true</isEnabled>
|
||||
<isActionEnforced>false</isActionEnforced>
|
||||
<invalidSecondaryContainers>false</invalidSecondaryContainers>
|
||||
<applications>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>ICMP Echo</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>ICMP</applicationProtocol>
|
||||
<value>echo-request</value>
|
||||
</element>
|
||||
</application>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>ICMP Redirect</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>ICMP</applicationProtocol>
|
||||
<value>redirect</value>
|
||||
</element>
|
||||
</application>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>ICMP Echo Reply</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>ICMP</applicationProtocol>
|
||||
<value>echo-reply</value>
|
||||
</element>
|
||||
</application>
|
||||
</applications>
|
||||
<invalidApplications>false</invalidApplications>
|
||||
<logged>false</logged>
|
||||
<action>allow</action>
|
||||
<direction>inbound</direction>
|
||||
<outsideSecondaryContainer>false</outsideSecondaryContainer>
|
||||
</action>
|
||||
<action class="firewallSecurityAction">
|
||||
<revision>0</revision>
|
||||
<name>ping-out</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<category>firewall</category>
|
||||
<executionOrder>4</executionOrder>
|
||||
<isEnabled>true</isEnabled>
|
||||
<isActionEnforced>false</isActionEnforced>
|
||||
<invalidSecondaryContainers>false</invalidSecondaryContainers>
|
||||
<applications>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>ICMP Echo</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>ICMP</applicationProtocol>
|
||||
<value>echo-request</value>
|
||||
</element>
|
||||
</application>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>ICMP Redirect</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>ICMP</applicationProtocol>
|
||||
<value>redirect</value>
|
||||
</element>
|
||||
</application>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>ICMP Echo Reply</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>ICMP</applicationProtocol>
|
||||
<value>echo-reply</value>
|
||||
</element>
|
||||
</application>
|
||||
</applications>
|
||||
<invalidApplications>false</invalidApplications>
|
||||
<logged>false</logged>
|
||||
<action>allow</action>
|
||||
<direction>outbound</direction>
|
||||
<outsideSecondaryContainer>false</outsideSecondaryContainer>
|
||||
</action>
|
||||
<action class="firewallSecurityAction">
|
||||
<revision>0</revision>
|
||||
<name>ssh-in-ok</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<category>firewall</category>
|
||||
<executionOrder>5</executionOrder>
|
||||
<isEnabled>true</isEnabled>
|
||||
<isActionEnforced>false</isActionEnforced>
|
||||
<invalidSecondaryContainers>false</invalidSecondaryContainers>
|
||||
<applications>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>SSH</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>TCP</applicationProtocol>
|
||||
<value>22</value>
|
||||
</element>
|
||||
</application>
|
||||
</applications>
|
||||
<invalidApplications>false</invalidApplications>
|
||||
<logged>false</logged>
|
||||
<action>allow</action>
|
||||
<direction>inbound</direction>
|
||||
<outsideSecondaryContainer>false</outsideSecondaryContainer>
|
||||
</action>
|
||||
<action class="firewallSecurityAction">
|
||||
<revision>0</revision>
|
||||
<name>ssh-out-ok</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<category>firewall</category>
|
||||
<executionOrder>6</executionOrder>
|
||||
<isEnabled>true</isEnabled>
|
||||
<isActionEnforced>false</isActionEnforced>
|
||||
<invalidSecondaryContainers>false</invalidSecondaryContainers>
|
||||
<applications>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>SSH</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>TCP</applicationProtocol>
|
||||
<value>22</value>
|
||||
</element>
|
||||
</application>
|
||||
</applications>
|
||||
<invalidApplications>false</invalidApplications>
|
||||
<logged>false</logged>
|
||||
<action>allow</action>
|
||||
<direction>outbound</direction>
|
||||
<outsideSecondaryContainer>false</outsideSecondaryContainer>
|
||||
</action>
|
||||
<action class="firewallSecurityAction">
|
||||
<revision>0</revision>
|
||||
<name>HTTP-ok</name>
|
||||
<description>All can http(s) me</description>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<category>firewall</category>
|
||||
<executionOrder>7</executionOrder>
|
||||
<isEnabled>true</isEnabled>
|
||||
<isActionEnforced>false</isActionEnforced>
|
||||
<invalidSecondaryContainers>false</invalidSecondaryContainers>
|
||||
<applications>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>HTTP</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>TCP</applicationProtocol>
|
||||
<value>80</value>
|
||||
</element>
|
||||
</application>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>HTTPS</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>TCP</applicationProtocol>
|
||||
<value>443</value>
|
||||
</element>
|
||||
</application>
|
||||
</applications>
|
||||
<invalidApplications>false</invalidApplications>
|
||||
<logged>false</logged>
|
||||
<action>allow</action>
|
||||
<direction>inbound</direction>
|
||||
<outsideSecondaryContainer>false</outsideSecondaryContainer>
|
||||
</action>
|
||||
<action class="firewallSecurityAction">
|
||||
<revision>0</revision>
|
||||
<name>sorry-nothing-allowed</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<category>firewall</category>
|
||||
<executionOrder>8</executionOrder>
|
||||
<isEnabled>true</isEnabled>
|
||||
<isActionEnforced>false</isActionEnforced>
|
||||
<invalidSecondaryContainers>false</invalidSecondaryContainers>
|
||||
<invalidApplications>false</invalidApplications>
|
||||
<logged>false</logged>
|
||||
<action>reject</action>
|
||||
<direction>inbound</direction>
|
||||
<outsideSecondaryContainer>false</outsideSecondaryContainer>
|
||||
</action>
|
||||
</actionsByCategory>
|
||||
<statusesByCategory>
|
||||
<category>firewall</category>
|
||||
<status>in_sync</status>
|
||||
</statusesByCategory>
|
||||
</securityPolicy>
|
||||
</securityPolicyHierarchy>
|
285
vmware_nsx_tempest/doc/admin-policy-BB.blueprint
Normal file
285
vmware_nsx_tempest/doc/admin-policy-BB.blueprint
Normal file
@ -0,0 +1,285 @@
|
||||
<securityPolicyHierarchy>
|
||||
<name>admin-policy-BB</name>
|
||||
<description>policy-BB, ssh from anywhere are OK, but ping limited to same security-group</description>
|
||||
<securityPolicy>
|
||||
<revision>0</revision>
|
||||
<name>security-policy-BB</name>
|
||||
<description>Security Policy BB</description>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>false</inheritanceAllowed>
|
||||
<precedence>5600</precedence>
|
||||
<actionsByCategory>
|
||||
<category>firewall</category>
|
||||
<action class="firewallSecurityAction">
|
||||
<revision>0</revision>
|
||||
<name>dhcp-in</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<category>firewall</category>
|
||||
<executionOrder>1</executionOrder>
|
||||
<isEnabled>true</isEnabled>
|
||||
<isActionEnforced>false</isActionEnforced>
|
||||
<invalidSecondaryContainers>false</invalidSecondaryContainers>
|
||||
<applications>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>DHCP-Client</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>UDP</applicationProtocol>
|
||||
<value>68</value>
|
||||
</element>
|
||||
</application>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>DHCP-Server</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>UDP</applicationProtocol>
|
||||
<value>67</value>
|
||||
</element>
|
||||
</application>
|
||||
</applications>
|
||||
<invalidApplications>false</invalidApplications>
|
||||
<logged>false</logged>
|
||||
<action>allow</action>
|
||||
<direction>inbound</direction>
|
||||
<outsideSecondaryContainer>false</outsideSecondaryContainer>
|
||||
</action>
|
||||
<action class="firewallSecurityAction">
|
||||
<revision>0</revision>
|
||||
<name>dhcp-out</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<category>firewall</category>
|
||||
<executionOrder>2</executionOrder>
|
||||
<isEnabled>true</isEnabled>
|
||||
<isActionEnforced>false</isActionEnforced>
|
||||
<invalidSecondaryContainers>false</invalidSecondaryContainers>
|
||||
<applications>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>DHCP-Client</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>UDP</applicationProtocol>
|
||||
<value>68</value>
|
||||
</element>
|
||||
</application>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>DHCP-Server</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>UDP</applicationProtocol>
|
||||
<value>67</value>
|
||||
</element>
|
||||
</application>
|
||||
</applications>
|
||||
<invalidApplications>false</invalidApplications>
|
||||
<logged>false</logged>
|
||||
<action>allow</action>
|
||||
<direction>outbound</direction>
|
||||
<outsideSecondaryContainer>false</outsideSecondaryContainer>
|
||||
</action>
|
||||
<action class="firewallSecurityAction">
|
||||
<revision>0</revision>
|
||||
<name>group-ping-ok</name>
|
||||
<description>icmp only allowed from VM with same security-policy</description>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<category>firewall</category>
|
||||
<executionOrder>3</executionOrder>
|
||||
<isEnabled>true</isEnabled>
|
||||
<isActionEnforced>false</isActionEnforced>
|
||||
<invalidSecondaryContainers>false</invalidSecondaryContainers>
|
||||
<applications>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>ICMP Echo</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>ICMP</applicationProtocol>
|
||||
<value>echo-request</value>
|
||||
</element>
|
||||
</application>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>ICMP Redirect</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>ICMP</applicationProtocol>
|
||||
<value>redirect</value>
|
||||
</element>
|
||||
</application>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>ICMP Echo Reply</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>ICMP</applicationProtocol>
|
||||
<value>echo-reply</value>
|
||||
</element>
|
||||
</application>
|
||||
</applications>
|
||||
<invalidApplications>false</invalidApplications>
|
||||
<logged>false</logged>
|
||||
<action>allow</action>
|
||||
<direction>intra</direction>
|
||||
<outsideSecondaryContainer>false</outsideSecondaryContainer>
|
||||
</action>
|
||||
<action class="firewallSecurityAction">
|
||||
<revision>0</revision>
|
||||
<name>ssh-in-ok</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<category>firewall</category>
|
||||
<executionOrder>4</executionOrder>
|
||||
<isEnabled>true</isEnabled>
|
||||
<isActionEnforced>false</isActionEnforced>
|
||||
<invalidSecondaryContainers>false</invalidSecondaryContainers>
|
||||
<applications>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>SSH</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>TCP</applicationProtocol>
|
||||
<value>22</value>
|
||||
</element>
|
||||
</application>
|
||||
</applications>
|
||||
<invalidApplications>false</invalidApplications>
|
||||
<logged>false</logged>
|
||||
<action>allow</action>
|
||||
<direction>inbound</direction>
|
||||
<outsideSecondaryContainer>false</outsideSecondaryContainer>
|
||||
</action>
|
||||
<action class="firewallSecurityAction">
|
||||
<revision>0</revision>
|
||||
<name>ssh-out-ok</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<category>firewall</category>
|
||||
<executionOrder>5</executionOrder>
|
||||
<isEnabled>true</isEnabled>
|
||||
<isActionEnforced>false</isActionEnforced>
|
||||
<invalidSecondaryContainers>false</invalidSecondaryContainers>
|
||||
<applications>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>SSH</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>TCP</applicationProtocol>
|
||||
<value>22</value>
|
||||
</element>
|
||||
</application>
|
||||
</applications>
|
||||
<invalidApplications>false</invalidApplications>
|
||||
<logged>false</logged>
|
||||
<action>allow</action>
|
||||
<direction>outbound</direction>
|
||||
<outsideSecondaryContainer>false</outsideSecondaryContainer>
|
||||
</action>
|
||||
<action class="firewallSecurityAction">
|
||||
<revision>0</revision>
|
||||
<name>group-HTTP</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<category>firewall</category>
|
||||
<executionOrder>6</executionOrder>
|
||||
<isEnabled>true</isEnabled>
|
||||
<isActionEnforced>false</isActionEnforced>
|
||||
<invalidSecondaryContainers>false</invalidSecondaryContainers>
|
||||
<applications>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>HTTP</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>TCP</applicationProtocol>
|
||||
<value>80</value>
|
||||
</element>
|
||||
</application>
|
||||
<application>
|
||||
<revision>0</revision>
|
||||
<name>HTTPS</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<inheritanceAllowed>true</inheritanceAllowed>
|
||||
<element>
|
||||
<applicationProtocol>TCP</applicationProtocol>
|
||||
<value>443</value>
|
||||
</element>
|
||||
</application>
|
||||
</applications>
|
||||
<invalidApplications>false</invalidApplications>
|
||||
<logged>false</logged>
|
||||
<action>allow</action>
|
||||
<direction>intra</direction>
|
||||
<outsideSecondaryContainer>false</outsideSecondaryContainer>
|
||||
</action>
|
||||
<action class="firewallSecurityAction">
|
||||
<revision>0</revision>
|
||||
<name>sorry-nothing-allowed</name>
|
||||
<clientHandle></clientHandle>
|
||||
<isUniversal>false</isUniversal>
|
||||
<universalRevision>0</universalRevision>
|
||||
<category>firewall</category>
|
||||
<executionOrder>7</executionOrder>
|
||||
<isEnabled>true</isEnabled>
|
||||
<isActionEnforced>false</isActionEnforced>
|
||||
<invalidSecondaryContainers>false</invalidSecondaryContainers>
|
||||
<invalidApplications>false</invalidApplications>
|
||||
<logged>false</logged>
|
||||
<action>reject</action>
|
||||
<direction>inbound</direction>
|
||||
<outsideSecondaryContainer>false</outsideSecondaryContainer>
|
||||
</action>
|
||||
</actionsByCategory>
|
||||
<statusesByCategory>
|
||||
<category>firewall</category>
|
||||
<status>in_sync</status>
|
||||
</statusesByCategory>
|
||||
</securityPolicy>
|
||||
</securityPolicyHierarchy>
|
@ -399,15 +399,21 @@ class TopoDeployScenarioManager(manager.NetworkScenarioTest):
|
||||
if port_id:
|
||||
# attached to port, will not check ip assignement & reachability
|
||||
return net_floatingip
|
||||
serv_fip = net_floatingip['floating_ip_address']
|
||||
# in some condiction, remove the serv_fip from your local known_hosts
|
||||
# can solve the ssh "Connection refused" problem.
|
||||
rm_sshkey(serv_fip)
|
||||
if not and_check_assigned:
|
||||
# caller will do the floatingip assigned to server and ping tests
|
||||
return net_floatingip
|
||||
self._waitfor_floatingip_assigned_to_server(client_mgr.servers_client,
|
||||
server.get('id'))
|
||||
server_pingable = self._waitfor_associated_floatingip(net_floatingip)
|
||||
STEPINTO_DEBUG_IF_TRUE(not server_pingable)
|
||||
self.assertTrue(
|
||||
server_pingable,
|
||||
msg="Expect server to be reachable after floatingip assigned.")
|
||||
msg=("Expect server to be reachable after"
|
||||
" floating-ip[%s] assigned." % serv_fip))
|
||||
return net_floatingip
|
||||
|
||||
def _waitfor_floatingip_assigned_to_server(self, server_client, server_id,
|
||||
@ -526,7 +532,8 @@ class TopoDeployScenarioManager(manager.NetworkScenarioTest):
|
||||
|
||||
def _check_floatingip_connectivity(self, floating_ip, server,
|
||||
should_connect=True,
|
||||
msg=None, ping_timeout=30):
|
||||
msg=None, ping_timeout=30,
|
||||
floating_ips_client=None):
|
||||
ip_address = floating_ip['floating_ip_address']
|
||||
floatingip_status = 'ACTIVE' if should_connect else 'DOWN'
|
||||
is_pingable = self.ping_ip_address(ip_address,
|
||||
@ -537,7 +544,37 @@ class TopoDeployScenarioManager(manager.NetworkScenarioTest):
|
||||
self.assertTrue(is_pingable, msg=msg)
|
||||
else:
|
||||
self.assertFalse(is_pingable, msg=msg)
|
||||
self.check_floating_ip_status(floating_ip, floatingip_status)
|
||||
self.check_floating_ip_status(floating_ip, floatingip_status,
|
||||
floating_ips_client)
|
||||
|
||||
def check_floating_ip_status(self, floating_ip, status,
|
||||
floating_ips_client=None):
|
||||
"""Verifies floatingip reaches the given status
|
||||
|
||||
:param dict floating_ip: floating IP dict to check status
|
||||
:param status: target status
|
||||
:raises: AssertionError if status doesn't match
|
||||
"""
|
||||
floating_ips_client = floating_ips_client or self.floating_ips_client
|
||||
floatingip_id = floating_ip['id']
|
||||
|
||||
def refresh():
|
||||
result = (floating_ips_client.
|
||||
show_floatingip(floatingip_id)['floatingip'])
|
||||
return status == result['status']
|
||||
|
||||
test_utils.call_until_true(refresh,
|
||||
CONF.network.build_timeout,
|
||||
CONF.network.build_interval)
|
||||
floating_ip = floating_ips_client.show_floatingip(
|
||||
floatingip_id)['floatingip']
|
||||
self.assertEqual(status, floating_ip['status'],
|
||||
message="FloatingIP: {fp} is at status: {cst}. "
|
||||
"failed to reach status: {st}"
|
||||
.format(fp=floating_ip, cst=floating_ip['status'],
|
||||
st=status))
|
||||
LOG.info("FloatingIP: {fp} is at status: {st}"
|
||||
.format(fp=floating_ip, st=status))
|
||||
|
||||
def get_image_userpass(self):
|
||||
return (CONF.validation.image_ssh_user,
|
||||
@ -769,3 +806,13 @@ def copy_file_to_host(file_from, dest, host, username, pkey):
|
||||
stdout,
|
||||
stderr)
|
||||
return stdout
|
||||
|
||||
|
||||
def STEPINTO_DEBUG_IF_TRUE(want2debug=False):
|
||||
"""Betting you are not set OS_TEST_TIMEOUT=24-hours running tempest"""
|
||||
t_timeout = int(os.environ.get('OS_TEST_TIMEOUT', 0))
|
||||
if want2debug and t_timeout > 86400:
|
||||
# uncomment following statements to turn on debuggging
|
||||
# import pdb
|
||||
# pdb.set_trace()
|
||||
pass
|
||||
|
@ -0,0 +1,593 @@
|
||||
# Copyright 2016 VMware Inc
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import six
|
||||
import time
|
||||
|
||||
from tempest.common import waiters
|
||||
from tempest import config
|
||||
from tempest.lib.common.utils import data_utils
|
||||
from tempest.lib.common.utils import test_utils
|
||||
from tempest import test
|
||||
|
||||
from vmware_nsx_tempest.tests.nsxv.scenario import (
|
||||
manager_topo_deployment as dmgr)
|
||||
from vmware_nsx_tempest.tests.nsxv.scenario import (
|
||||
network_addon_methods as HELO)
|
||||
|
||||
CONF = config.CONF
|
||||
LOG = dmgr.manager.log.getLogger(__name__)
|
||||
|
||||
|
||||
class TestAdminPolicyBasicOps(dmgr.TopoDeployScenarioManager):
|
||||
"""Test VMs with security-group-policy traffic is managed by NSX
|
||||
|
||||
Test topology:
|
||||
TOPO:
|
||||
|
||||
logical-router nasa-router] -- [ public GW]
|
||||
|
|
||||
+--- [Tenant jpl interface/subnet x.y.34.0/24]
|
||||
| | |
|
||||
| + [vm-nasa-jpl-3] + [vm-nasa-jpl-4]
|
||||
|
|
||||
+--- [Tenant ames interface/subnet x.y.12.0/24]
|
||||
| | |
|
||||
| + [vm-nasa-ames-1] + [vm-nasa-ames-2]
|
||||
|
||||
Test topology setup and traffic forwarding validation:
|
||||
|
||||
1. 2 tenants (ames, jpl) each tenant has 2 VMs, and boot with
|
||||
security-group with policy==policy_AA which must allow
|
||||
ping and ssh services as automation relys on this to make
|
||||
sure test environment network connectivity is an OK.
|
||||
NOTE:
|
||||
primary user: ames -- NASA Ames Research Center
|
||||
alt user: jpl -- NASA Jet Propulsion Laboratory
|
||||
2. Admin create router (nasa-router) with both tenants' network
|
||||
so tenant:ames and tenant:jpl can talk to each other
|
||||
according to policy_AA.
|
||||
3. under policy_AA, all servers can be ping and ssh from anywhere
|
||||
4. Admin change tenant:jpl's policy to policy_BB
|
||||
5. Tenant jpl's VMs are not pingable, ssh still OK
|
||||
Tenant ames's MVs, both ping and ssh are OK
|
||||
6. Admin change tenant:ames's policy to policy_BB
|
||||
VMs from ames and jpl are not pingalbe; ssh is OK
|
||||
|
||||
ATTENTION:
|
||||
config nsxv.default_policy_id is policy_AA
|
||||
config nsxv.alt_policy_is is policy_BB
|
||||
|
||||
The testbed needs to have policy_AA and policy_BB created
|
||||
and matched with the default_policy_id & alt_plicy_id under
|
||||
session nsxv of tempest.conf or devstack local.conf.
|
||||
|
||||
Test Configuration setup:
|
||||
please refer to vmware_nsx_tempest/doc/README-AdminPolicy.rst
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def skip_checks(cls):
|
||||
super(TestAdminPolicyBasicOps, cls).skip_checks()
|
||||
if not test.is_extension_enabled('security-group-policy', 'network'):
|
||||
msg = "Extension security-group-policy is not enabled."
|
||||
raise cls.skipException(msg)
|
||||
if not (CONF.nsxv.alt_policy_id.startswith('policy-') and
|
||||
CONF.nsxv.default_policy_id.startswith('policy-')):
|
||||
msg = "default and alt policy ids not set correctly."
|
||||
raise cls.skipException(msg)
|
||||
|
||||
@classmethod
|
||||
def setup_clients(cls):
|
||||
super(TestAdminPolicyBasicOps, cls).setup_clients()
|
||||
cls.cmgr_adm = cls.get_client_manager('admin')
|
||||
cls.cmgr_ames = cls.get_client_manager('primary')
|
||||
cls.cmgr_jpl = cls.get_client_manager('alt')
|
||||
|
||||
@classmethod
|
||||
def resource_setup(cls):
|
||||
super(TestAdminPolicyBasicOps, cls).resource_setup()
|
||||
cls.policy_AA = CONF.nsxv.default_policy_id
|
||||
cls.policy_BB = CONF.nsxv.alt_policy_id
|
||||
cls.conn_timeout = CONF.scenario.waitfor_connectivity
|
||||
|
||||
@classmethod
|
||||
def resource_cleanup(cls):
|
||||
super(TestAdminPolicyBasicOps, cls).resource_cleanup()
|
||||
|
||||
def setUp(self):
|
||||
super(TestAdminPolicyBasicOps, self).setUp()
|
||||
self.server_id_list = []
|
||||
self.exc_step = 0
|
||||
self.exc_msg = ("Admin-Policy-Traffic-Forwarding"
|
||||
" Validation Steps:\n")
|
||||
|
||||
def tearDown(self):
|
||||
# delete all servers and make sure they are terminated
|
||||
servers_client = self.cmgr_adm.servers_client
|
||||
server_id_list = getattr(self, 'server_id_list', [])
|
||||
for server_id in server_id_list:
|
||||
servers_client.delete_server(server_id)
|
||||
for server_id in server_id_list:
|
||||
waiters.wait_for_server_termination(servers_client, server_id)
|
||||
# delete all floating-ips
|
||||
if hasattr(self, 'fip_nasa_ames_1'):
|
||||
self.delete_floatingip(self.cmgr_ames, self.fip_nasa_ames_1)
|
||||
if hasattr(self, 'fip_nasa_jpl_3'):
|
||||
self.delete_floatingip(self.cmgr_jpl, self.fip_nasa_jpl_3)
|
||||
super(TestAdminPolicyBasicOps, self).tearDown()
|
||||
|
||||
def log_exc_msg(self, msg):
|
||||
self.exc_step += 1
|
||||
self.exc_msg += ("#%02d %s %s\n" %
|
||||
(self.exc_step, time.strftime("%H:%M:%S"), msg))
|
||||
|
||||
def delete_floatingip(self, cmgr, net_floatingip):
|
||||
test_utils.call_and_ignore_notfound_exc(
|
||||
cmgr.floating_ips_client.delete_floatingip,
|
||||
net_floatingip.get('id'))
|
||||
|
||||
def delete_security_group(self, sg_client, sg_id):
|
||||
sg_client.delete_security_group(sg_id)
|
||||
|
||||
def update_security_group_policy(self, sg_id, policy_id):
|
||||
sg_client = self.cmgr_adm.security_groups_client
|
||||
sg = sg_client.update_security_group(sg_id, policy=policy_id)
|
||||
sg = sg.get('security_group', sg)
|
||||
self.assertEqual(policy_id, sg.get('policy'))
|
||||
return sg
|
||||
|
||||
def create_security_group_policy(self, policy_id, tenant_id,
|
||||
name_prefix=None):
|
||||
sg_name = data_utils.rand_name(name_prefix or 'admin-policy')
|
||||
sg_client = self.cmgr_adm.security_groups_client
|
||||
sg_dict = dict(name=sg_name, policy=policy_id)
|
||||
if tenant_id:
|
||||
sg_dict['tenant_id'] = tenant_id
|
||||
sg = sg_client.create_security_group(**sg_dict)
|
||||
sg = sg.get('security_group', sg)
|
||||
self.addCleanup(test_utils.call_and_ignore_notfound_exc,
|
||||
self.delete_security_group,
|
||||
sg_client, sg.get('id'))
|
||||
return sg
|
||||
|
||||
def create_networks(self, cmgr,
|
||||
name_prefix=None, cidr_offset=0):
|
||||
net_name = data_utils.rand_name(name_prefix or 'admin-policy')
|
||||
network = self.create_network(client=cmgr.networks_client,
|
||||
name=net_name)
|
||||
network = network.get('network', network)
|
||||
subnet_kwargs = dict(name=net_name, cidr_offset=cidr_offset)
|
||||
subnet = self.create_subnet(network,
|
||||
client=cmgr.subnets_client,
|
||||
**subnet_kwargs)
|
||||
subnet = subnet.get('subnet', subnet)
|
||||
return (network, subnet)
|
||||
|
||||
def create_router_by_type(self, router_type, client=None, **kwargs):
|
||||
routers_client = client or self.cmgr_adm.routers_client
|
||||
create_kwargs = dict(namestart='nasa-router', external_gateway_info={
|
||||
"network_id": CONF.network.public_network_id})
|
||||
if router_type in ('shared', 'exclusive'):
|
||||
create_kwargs['router_type'] = router_type
|
||||
elif router_type in ('distributed'):
|
||||
create_kwargs['distributed'] = True
|
||||
create_kwargs.update(**kwargs)
|
||||
router = HELO.router_create(self, client=routers_client,
|
||||
**create_kwargs)
|
||||
return router
|
||||
|
||||
def create_router_and_add_interfaces(self, router_type, subnet_list):
|
||||
routers_client = self.cmgr_adm.routers_client
|
||||
router = self.create_router_by_type(router_type)
|
||||
for subnet in subnet_list:
|
||||
HELO.router_interface_add(self, router['id'], subnet['id'],
|
||||
client=routers_client)
|
||||
# check interfaces/subnets are added to router
|
||||
router_port_list = self.get_router_port_list(self.cmgr_adm,
|
||||
router['id'])
|
||||
for subnet in subnet_list:
|
||||
added = self.rports_have_subnet_id(router_port_list, subnet['id'])
|
||||
self.assertTrue(
|
||||
added,
|
||||
"subnet_id:%s is not added to router" % subnet['id'])
|
||||
return router
|
||||
|
||||
def rports_have_subnet_id(self, router_port_list, subnet_id):
|
||||
for rport in router_port_list:
|
||||
for fips in rport.get('fixed_ips', []):
|
||||
if subnet_id == fips['subnet_id']:
|
||||
return True
|
||||
return False
|
||||
|
||||
def get_router_port_list(self, cmgr, router_id):
|
||||
device_owner = u'network:router_interface'
|
||||
ports_client = cmgr.ports_client
|
||||
port_list = ports_client.list_ports(device_id=router_id,
|
||||
device_owner=device_owner)
|
||||
port_list = port_list.get('ports', port_list)
|
||||
return port_list
|
||||
|
||||
def create_servers_on_networks(self, cmgr, sv_name, networks_info):
|
||||
network = networks_info.get('network')
|
||||
security_group = networks_info.get('security_group')
|
||||
security_groups = [{'name': security_group['id']}]
|
||||
svr = self.create_server_on_network(
|
||||
network, security_groups, name=sv_name,
|
||||
wait_on_boot=False,
|
||||
servers_client=cmgr.servers_client)
|
||||
self.server_id_list.append(svr.get('id'))
|
||||
return svr
|
||||
|
||||
def get_server_info(self, cmgr, server_id):
|
||||
"""Get server's ip addresses"""
|
||||
svr = cmgr.servers_client.show_server(server_id)
|
||||
svr = svr.get('server', svr)
|
||||
sinfo = dict(id=svr['id'], name=svr['name'],
|
||||
security_gropus=svr['security_groups'],
|
||||
fixed_ip_address=None, floating_ip_address=None)
|
||||
addresses = svr.get('addresses')
|
||||
for n_addresses in six.itervalues(addresses):
|
||||
for n_addr in n_addresses:
|
||||
if n_addr['OS-EXT-IPS:type'] == 'fixed':
|
||||
if not sinfo['fixed_ip_address']:
|
||||
sinfo['fixed_ip_address'] = n_addr['addr']
|
||||
elif n_addr['OS-EXT-IPS:type'] == 'floating':
|
||||
if not sinfo['floating_ip_address']:
|
||||
sinfo['floating_ip_address'] = n_addr['addr']
|
||||
return sinfo
|
||||
|
||||
def create_floatingip_for_server(self, cmgr, server):
|
||||
username, password = self.get_image_userpass()
|
||||
try:
|
||||
floatingip = super(
|
||||
TestAdminPolicyBasicOps,
|
||||
self).create_floatingip_for_server(
|
||||
server, client_mgr=cmgr, and_check_assigned=True)
|
||||
except Exception as ex:
|
||||
floatingip = None
|
||||
msg = (self.exc_msg +
|
||||
("\n**FAIL to associate floatingip to server[%s]\n%s"
|
||||
% (server['name'], str(ex))))
|
||||
self.assertTrue(floatingip, msg)
|
||||
fix_ip = floatingip['fixed_ip_address']
|
||||
float_ip = floatingip['floating_ip_address']
|
||||
self.log_exc_msg((" floatingip[%s] created for server[%s,%s]"
|
||||
" and is pingable." %
|
||||
(float_ip, server.get('name'), fix_ip)))
|
||||
return floatingip
|
||||
|
||||
def wait_for_servers_become_active(self):
|
||||
servers_client = self.cmgr_adm.servers_client
|
||||
for server_id in self.server_id_list:
|
||||
waiters.wait_for_server_status(
|
||||
servers_client, server_id, 'ACTIVE')
|
||||
|
||||
def find_servers_ips(self):
|
||||
self.server_ips = {}
|
||||
self.jpl_ips = {}
|
||||
self.server_ips['1'] = self.get_server_info(
|
||||
self.cmgr_ames, self.vm_nasa_ames_1['id'])
|
||||
self.server_ips['2'] = self.get_server_info(
|
||||
self.cmgr_ames, self.vm_nasa_ames_2['id'])
|
||||
self.server_ips['3'] = self.get_server_info(
|
||||
self.cmgr_jpl, self.vm_nasa_jpl_3['id'])
|
||||
self.server_ips['4'] = self.get_server_info(
|
||||
self.cmgr_jpl, self.vm_nasa_jpl_4['id'])
|
||||
|
||||
def create_nasa_ames_network_and_servers(self, security_group=None):
|
||||
sg = security_group or self.sg_ames
|
||||
net, subnet = self.create_networks(self.cmgr_ames, 'nasa-ames', 1)
|
||||
self.netinfo_ames = dict(network=net, subnet=subnet,
|
||||
security_group=sg)
|
||||
self.vm_nasa_ames_1 = self.create_servers_on_networks(
|
||||
self.cmgr_ames, 'vm-nasa-ames-1', self.netinfo_ames)
|
||||
self.vm_nasa_ames_2 = self.create_servers_on_networks(
|
||||
self.cmgr_ames, 'vm-nasa-ames-2', self.netinfo_ames)
|
||||
|
||||
def create_nasa_jpl_network_and_servers(self, security_group=None):
|
||||
sg = security_group or self.sg_jpl
|
||||
# jpl and ames attached to the same router, CIDR cannot overlap
|
||||
net, subnet = self.create_networks(self.cmgr_jpl, 'nasa-jpl', 3)
|
||||
self.netinfo_jpl = dict(network=net, subnet=subnet,
|
||||
security_group=sg)
|
||||
self.vm_nasa_jpl_3 = self.create_servers_on_networks(
|
||||
self.cmgr_jpl, 'vm-nasa-jpl-3', self.netinfo_jpl)
|
||||
self.vm_nasa_jpl_4 = self.create_servers_on_networks(
|
||||
self.cmgr_jpl, 'vm-nasa-jpl-4', self.netinfo_jpl)
|
||||
|
||||
def create_nasa_topo(self, router_type=None):
|
||||
router_type = router_type or 'shared'
|
||||
self.sg_ames = self.create_security_group_policy(
|
||||
self.policy_AA,
|
||||
self.cmgr_ames.networks_client.tenant_id,
|
||||
name_prefix='nasa-ames')
|
||||
self.sg_jpl = self.create_security_group_policy(
|
||||
self.policy_AA,
|
||||
self.cmgr_jpl.networks_client.tenant_id,
|
||||
name_prefix='nasa-jpl')
|
||||
self.create_nasa_ames_network_and_servers(self.sg_ames)
|
||||
self.create_nasa_jpl_network_and_servers(self.sg_jpl)
|
||||
subnet_list = [self.netinfo_ames.get('subnet'),
|
||||
self.netinfo_jpl.get('subnet')]
|
||||
self.nasa_router = self.create_router_and_add_interfaces(
|
||||
router_type, subnet_list)
|
||||
self.wait_for_servers_become_active()
|
||||
# associate floating-ip to servers and pingable
|
||||
self.fip_nasa_ames_1 = self.create_floatingip_for_server(
|
||||
self.cmgr_ames, self.vm_nasa_ames_1)
|
||||
self.fip_nasa_jpl_3 = self.create_floatingip_for_server(
|
||||
self.cmgr_jpl, self.vm_nasa_jpl_3)
|
||||
self.find_servers_ips()
|
||||
|
||||
def host_ssh_reachable(self, host_id, host_ip):
|
||||
username, password = self.get_image_userpass()
|
||||
try:
|
||||
ssh_client = dmgr.get_remote_client_by_password(
|
||||
host_ip, username, password)
|
||||
except Exception as ex:
|
||||
ssh_client = None
|
||||
msg = (self.exc_msg +
|
||||
("\n**FAIL to ssh to host[%s=%s]\n%s" %
|
||||
(host_id, str(ex))))
|
||||
self.assertTrue(ssh_client, msg)
|
||||
self.log_exc_msg(
|
||||
(" SSH host[%s] floatingip[%s] OK" % (host_id, host_ip)))
|
||||
return ssh_client
|
||||
|
||||
def host_can_reach_ips(self, host_id, host_ssh, ip_type, ip_list):
|
||||
for dest_ip in ip_list:
|
||||
reachable = dmgr.is_reachable(host_ssh, dest_ip,
|
||||
time_out=self.conn_timeout)
|
||||
msg = (self.exc_msg +
|
||||
("\n *FAILURE* VM[%s] cannot PING %s[%s]" %
|
||||
(host_id, ip_type, dest_ip)))
|
||||
if not reachable:
|
||||
reachable = dmgr.is_reachable(host_ssh, dest_ip,
|
||||
time_out=self.conn_timeout)
|
||||
dmgr.STEPINTO_DEBUG_IF_TRUE(not reachable)
|
||||
self.assertTrue(reachable, msg)
|
||||
self.log_exc_msg(
|
||||
(" VM[%s] can PING %s[%s]" % (host_id, ip_type, dest_ip)))
|
||||
|
||||
def host_cannot_reach_ips(self, host_id, host_ssh, ip_type, ip_list):
|
||||
for dest_ip in ip_list:
|
||||
not_reachable = dmgr.isnot_reachable(host_ssh, dest_ip,
|
||||
time_out=self.conn_timeout,
|
||||
ping_timeout=5.0)
|
||||
msg = (self.exc_msg +
|
||||
("\n *FAILURE* VM[%s] shouldn't able to PING %s[%s]" %
|
||||
(host_id, ip_type, dest_ip)))
|
||||
if not not_reachable:
|
||||
not_reachable = dmgr.isnot_reachable(
|
||||
host_ssh, dest_ip, time_out=self.conn_timeout,
|
||||
ping_timeout=5.0)
|
||||
dmgr.STEPINTO_DEBUG_IF_TRUE(not not_reachable)
|
||||
self.assertTrue(not_reachable, msg)
|
||||
self.log_exc_msg(
|
||||
(" VM[%s] is not able to PING %s[%s]" %
|
||||
(host_id, ip_type, dest_ip)))
|
||||
|
||||
def ican_reach_ip(self, ip_addr, ping_timeout=5):
|
||||
ip_type = 'floating-ip'
|
||||
for x in range(int(self.conn_timeout / ping_timeout)):
|
||||
reachable = self.ping_ip_address(ip_addr,
|
||||
ping_timeout=ping_timeout)
|
||||
if reachable:
|
||||
break
|
||||
time.sleep(2.0)
|
||||
msg = (self.exc_msg +
|
||||
("\n *FAILURE* Tempest cannot PING %s[%s]" %
|
||||
(ip_type, ip_addr)))
|
||||
if not reachable:
|
||||
reachable = self.ping_ip_address(ip_addr,
|
||||
ping_timeout=ping_timeout)
|
||||
dmgr.STEPINTO_DEBUG_IF_TRUE(not reachable)
|
||||
self.assertTrue(reachable, msg)
|
||||
self.log_exc_msg(" Tempest can PING %s[%s]" % (ip_type, ip_addr))
|
||||
|
||||
def icannot_reach_ip(self, ip_addr, ping_timeout=5):
|
||||
ip_type = 'floating-ip'
|
||||
for x in range(int(self.conn_timeout / ping_timeout)):
|
||||
reachable = self.ping_ip_address(ip_addr,
|
||||
ping_timeout=ping_timeout)
|
||||
if not reachable:
|
||||
break
|
||||
time.sleep(ping_timeout)
|
||||
msg = (self.exc_msg +
|
||||
("\n *FAILURE* Tempest should not PING %s[%s]" %
|
||||
(ip_type, ip_addr)))
|
||||
if reachable:
|
||||
reachable = self.ping_ip_address(ip_addr,
|
||||
ping_timeout=ping_timeout)
|
||||
dmgr.STEPINTO_DEBUG_IF_TRUE(reachable)
|
||||
self.assertFalse(reachable, msg)
|
||||
self.log_exc_msg((" Tempest isnot able to PING %s[%s]" %
|
||||
(ip_type, ip_addr)))
|
||||
|
||||
def run_admin_policy_op_scenario(self, router_type):
|
||||
self.log_exc_msg(("Setup admin-policy test with router-type[%s]" %
|
||||
router_type))
|
||||
self.create_nasa_topo(router_type)
|
||||
self.jpl_private_ips = [y['fixed_ip_address']
|
||||
for x, y in six.iteritems(self.server_ips)
|
||||
if x > '2']
|
||||
self.ames_private_ips = [y['fixed_ip_address']
|
||||
for x, y in six.iteritems(self.server_ips)
|
||||
if x < '3']
|
||||
|
||||
self.run_policy_AA_on_ames_AA_on_jpl()
|
||||
self.run_policy_AA_on_ames_BB_on_jpl()
|
||||
self.run_policy_BB_on_ames_BB_on_jpl()
|
||||
|
||||
dmgr.LOG.debug(self.exc_msg)
|
||||
|
||||
def run_policy_AA_on_ames_AA_on_jpl(self):
|
||||
self.log_exc_msg(("### tenant:jpl=policy_AA[%s]"
|
||||
", tenant:ames=policy_AA[%s]" %
|
||||
(self.policy_AA, self.policy_AA)))
|
||||
# at the beginning, can ssh to VM with floating-ip
|
||||
self.log_exc_msg(
|
||||
"Tempest can ping & ssh vm-nasa-ames-1's floatingip")
|
||||
self.ican_reach_ip(self.fip_nasa_ames_1['floating_ip_address'])
|
||||
ames_1_ssh = self.host_ssh_reachable(
|
||||
"nasa-ames-1",
|
||||
self.fip_nasa_ames_1['floating_ip_address'])
|
||||
|
||||
# from vm-nasa-ames-1 can ping all other private-ips
|
||||
self.log_exc_msg(("vm-nasa-ames-1[%s] can ping all private-ips"
|
||||
% (self.server_ips['1']['fixed_ip_address'])))
|
||||
self.host_can_reach_ips('nasa-ames-1', ames_1_ssh,
|
||||
'ame-private-ip', self.ames_private_ips)
|
||||
self.host_can_reach_ips('nasa-ames-1', ames_1_ssh,
|
||||
'jp-private-ip', self.jpl_private_ips)
|
||||
# from vm-nasa-jpl_3 can ping all other private-ips
|
||||
self.log_exc_msg(
|
||||
"Tempest can ping & ssh vm-nasa-jpl-3's floatingip")
|
||||
self.ican_reach_ip(self.fip_nasa_jpl_3['floating_ip_address'])
|
||||
jpl_3_ssh = self.host_ssh_reachable(
|
||||
"nasa-jpl-3",
|
||||
self.fip_nasa_jpl_3['floating_ip_address'])
|
||||
self.log_exc_msg(("vm-nasa-jpl-3[%s] can ping all private-ips"
|
||||
% (self.server_ips['3']['fixed_ip_address'])))
|
||||
self.host_can_reach_ips('nasa-jpl-3', jpl_3_ssh,
|
||||
'jp-private-ip', self.jpl_private_ips)
|
||||
self.host_can_reach_ips('nasa-jpl-3', jpl_3_ssh,
|
||||
'ames-private-ip', self.ames_private_ips)
|
||||
# within VM can ping both tanants' floating-ips
|
||||
self.log_exc_msg(
|
||||
"vm-nasa-ames-1 can ping vm-nasa-jpl-1's floatingip")
|
||||
self.host_can_reach_ips(
|
||||
'nasa-ames-1', ames_1_ssh, 'jpl-floating-ip',
|
||||
[self.fip_nasa_jpl_3['floating_ip_address']])
|
||||
self.log_exc_msg(
|
||||
"vm-nasa-jpl-3 can ping vm-nasa-ames-3's floatingip")
|
||||
self.host_can_reach_ips(
|
||||
'nasa-jpl-3', jpl_3_ssh, 'nasa-floating-ip',
|
||||
[self.fip_nasa_ames_1['floating_ip_address']])
|
||||
|
||||
def run_policy_AA_on_ames_BB_on_jpl(self):
|
||||
# from vm-nasa-ames-1 can ping all other private-ips
|
||||
self.log_exc_msg(
|
||||
("Update tenant:jpl to use policy_BB[%s] with group-ping"
|
||||
% self.policy_BB))
|
||||
# admin update jpl to policy_BB_GP
|
||||
self.update_security_group_policy(self.sg_jpl['id'], self.policy_BB)
|
||||
# cannot ping vm-nasa-jpl-3, can ssh to both tenants' floating-ips
|
||||
self.log_exc_msg(("### tenant:jpl=policy_BB[%s]"
|
||||
", tenant:ames=policy_AA[%s]" %
|
||||
(self.policy_BB, self.policy_AA)))
|
||||
self.log_exc_msg(
|
||||
"Tempest can ping & ssh vm-nasa-ames-1's floatingip")
|
||||
self.ican_reach_ip(self.fip_nasa_ames_1['floating_ip_address'])
|
||||
ames_1_ssh = self.host_ssh_reachable(
|
||||
"nasa-ames-1",
|
||||
self.fip_nasa_ames_1['floating_ip_address'])
|
||||
self.log_exc_msg("Tempest can ssh vm-nasa-jpl-3's floatingip"
|
||||
", but not ping")
|
||||
self.icannot_reach_ip(self.fip_nasa_jpl_3['floating_ip_address'])
|
||||
jpl_3_ssh = self.host_ssh_reachable(
|
||||
"nasa-jpl-3",
|
||||
self.fip_nasa_jpl_3['floating_ip_address'])
|
||||
# vm-nasa-jpl_3 can ping its private-ips, not other tenants
|
||||
self.log_exc_msg(("vm-nasa-jpl-3[%s] can reach all private-ips"
|
||||
% (self.server_ips['3']['fixed_ip_address'])))
|
||||
self.host_can_reach_ips('nasa-jpl-3', jpl_3_ssh,
|
||||
'jpl-private-ip', self.jpl_private_ips)
|
||||
self.host_can_reach_ips('nasa-jpl-3', jpl_3_ssh,
|
||||
'ames-private-ip', self.ames_private_ips)
|
||||
# nasa_ames_1 can not ping private-ips of tenant jpl
|
||||
# as policy_BB:ping only allowed from the same security-group
|
||||
self.log_exc_msg(("vm-nasa-ames-1[%s] can reach ames's rivate-ips"
|
||||
", not jpl's private-ips"
|
||||
% (self.server_ips['1']['fixed_ip_address'])))
|
||||
self.host_can_reach_ips('nasa-ames-1', ames_1_ssh,
|
||||
'ames-private-ip', self.ames_private_ips)
|
||||
self.host_cannot_reach_ips('nasa-ames-1', ames_1_ssh,
|
||||
'jpl-private-ip', self.jpl_private_ips)
|
||||
self.log_exc_msg(
|
||||
"vm-nasa-ames-1 cannot ping vm-nasa-jpl-1's floatingip")
|
||||
self.host_cannot_reach_ips(
|
||||
'nasa-ames-1', ames_1_ssh, 'jpl-floating-ip',
|
||||
[self.fip_nasa_jpl_3['floating_ip_address']])
|
||||
self.log_exc_msg(
|
||||
"vm-nasa-jpl-3 cannot ping vm-nasa-ames-3's floatingip")
|
||||
self.host_cannot_reach_ips(
|
||||
'nasa-jpl-3', jpl_3_ssh, 'ames-floating-ip',
|
||||
[self.fip_nasa_ames_1['floating_ip_address']])
|
||||
|
||||
def run_policy_BB_on_ames_BB_on_jpl(self):
|
||||
### tenant jpl:policy_BB_GP, tenant ames:policy_BB_GP
|
||||
self.log_exc_msg(
|
||||
("Update tenant:ames to use policy_BB[%s] with group-ping"
|
||||
% self.policy_BB))
|
||||
# admin update ames to policy_BB
|
||||
self.update_security_group_policy(self.sg_ames['id'], self.policy_BB)
|
||||
# cannot ping all VMs, but can ssh to both tenants' floating-ips
|
||||
self.log_exc_msg(("### tenant:jpl=policy_BB[%s]"
|
||||
", tenant:ames=policy_BB[%s]" %
|
||||
(self.policy_BB, self.policy_BB)))
|
||||
self.log_exc_msg("Tempest can ssh vvm-nasa-ames-1's floatingip &"
|
||||
" vm-nasa-jpl-3's floatingip, but not ping.")
|
||||
self.icannot_reach_ip(self.fip_nasa_ames_1['floating_ip_address'])
|
||||
self.icannot_reach_ip(self.fip_nasa_jpl_3['floating_ip_address'])
|
||||
ames_1_ssh = self.host_ssh_reachable(
|
||||
"nasa-ames-1",
|
||||
self.fip_nasa_ames_1['floating_ip_address'])
|
||||
jpl_3_ssh = self.host_ssh_reachable(
|
||||
"nasa-jpl-3",
|
||||
self.fip_nasa_jpl_3['floating_ip_address'])
|
||||
self.log_exc_msg(("vm-nasa-jpl-3[%s] can reach jpl private-ips"
|
||||
", not ames"
|
||||
% (self.server_ips['3']['fixed_ip_address'])))
|
||||
self.host_can_reach_ips('nasa-jpl-3', jpl_3_ssh,
|
||||
'private-ip', self.jpl_private_ips)
|
||||
self.host_cannot_reach_ips('nasa-jpl-3', jpl_3_ssh,
|
||||
'private-ip', self.ames_private_ips)
|
||||
self.log_exc_msg(("vm-nasa-ames-1[%s] can reach ames private-ips"
|
||||
", not jpl"
|
||||
% (self.server_ips['1']['fixed_ip_address'])))
|
||||
self.host_can_reach_ips('nasa-ames-1', ames_1_ssh,
|
||||
'private-ip', self.ames_private_ips)
|
||||
self.host_cannot_reach_ips('nasa-ames-1', ames_1_ssh,
|
||||
'private-ip', self.jpl_private_ips)
|
||||
self.log_exc_msg(
|
||||
"vm-nasa-ames-1 cannot ping vm-nasa-jpl-1's floatingip")
|
||||
self.host_cannot_reach_ips(
|
||||
'nasa-ames-1', ames_1_ssh, 'floating-ip',
|
||||
[self.fip_nasa_jpl_3['floating_ip_address']])
|
||||
self.log_exc_msg(
|
||||
"vm-nasa-jpl-3 cannot ping vm-nasa-ames-3's floatingip")
|
||||
self.host_cannot_reach_ips(
|
||||
'nasa-jpl-3', jpl_3_ssh, 'floating-ip',
|
||||
[self.fip_nasa_ames_1['floating_ip_address']])
|
||||
|
||||
|
||||
class TestAdminPolicySharedRouter(TestAdminPolicyBasicOps):
|
||||
@test.idempotent_id('78f45717-5f95-4ef5-b2a4-a1b4700ef688')
|
||||
def test_admin_policy_ops_with_shared_router(self):
|
||||
self.run_admin_policy_op_scenario('shared')
|
||||
|
||||
|
||||
class TestAdminPolicyExclusiveRouter(TestAdminPolicyBasicOps):
|
||||
@test.idempotent_id('68345852-da2e-4f46-816b-0afc59470a45')
|
||||
def test_admin_policy_ops_with_exclusive_router(self):
|
||||
self.run_admin_policy_op_scenario('exclusive')
|
||||
|
||||
|
||||
class TestAdminPolicyDistributedRouter(TestAdminPolicyBasicOps):
|
||||
@test.idempotent_id('76adbfbb-a2e5-40fa-8930-84e7ece87bd5')
|
||||
def test_admin_policy_ops_with_distributed_router(self):
|
||||
self.run_admin_policy_op_scenario('distributed')
|
Loading…
Reference in New Issue
Block a user