SEBA-457 Core xproto cleanup
Change-Id: Ib99680dd81016694094a5c230afdf9dcf2cb307e
diff --git a/lib/xos-genx/xosgenx/jinja2_extensions/gui.py b/lib/xos-genx/xosgenx/jinja2_extensions/gui.py
index 245bbda..4cb644a 100644
--- a/lib/xos-genx/xosgenx/jinja2_extensions/gui.py
+++ b/lib/xos-genx/xosgenx/jinja2_extensions/gui.py
@@ -96,17 +96,23 @@
def xproto_default_to_gui(default):
+ # TODO: Using `eval` here is potentially dangerous as it may allow code injection
val = "null"
- if is_number(default):
- val = str(default)
- elif eval(default) is True:
- val = "true"
- elif eval(default) is False:
- val = "false"
- elif eval(default) is None:
+ try:
+ if is_number(default):
+ val = str(default)
+ elif eval(default) is True:
+ val = "true"
+ elif eval(default) is False:
+ val = "false"
+ elif eval(default) is None:
+ val = "null"
+ else:
+ val = str(default)
+ except NameError:
+ # val was a function call, and we can't pass those to the GUI
val = "null"
- else:
- val = str(default)
+
return val
diff --git a/lib/xos-genx/xosgenx/targets/mock_classes.xtarget b/lib/xos-genx/xosgenx/targets/mock_classes.xtarget
index 61c2f1f..bc56747 100644
--- a/lib/xos-genx/xosgenx/targets/mock_classes.xtarget
+++ b/lib/xos-genx/xosgenx/targets/mock_classes.xtarget
@@ -225,6 +225,9 @@
model_accessor = ModelAccessor()
+def get_first_site():
+ return model_accessor.Site.objects.first().id
+
class ObjectSet(object):
def __init__(self, objects):
self.objects = objects
diff --git a/lib/xos-genx/xosgenx/targets/service.xtarget b/lib/xos-genx/xosgenx/targets/service.xtarget
index 1027680..4c47fab 100644
--- a/lib/xos-genx/xosgenx/targets/service.xtarget
+++ b/lib/xos-genx/xosgenx/targets/service.xtarget
@@ -2,14 +2,14 @@
{% set legacy_tag = '_decl' %}
{% set legacy = True %}
from core.models.xosbase import *
-from core.models import ServiceInstance, TenantWithContainer
+from core.models import ServiceInstance
{% else %}
{% set legacy = False %}
{% set legacy_tag = '' %}
{% if file_exists('../header.py') or file_exists('header.py')-%}from header import *
{% else %}
from core.models.xosbase import *
-from core.models import ServiceInstance, TenantWithContainer
+from core.models import ServiceInstance
{% endif %}
{% endif %}
diff --git a/lib/xos-synchronizer/xos-synchronizer-tests/model-deps b/lib/xos-synchronizer/xos-synchronizer-tests/model-deps
index 247a190..559fa4c 100644
--- a/lib/xos-synchronizer/xos-synchronizer-tests/model-deps
+++ b/lib/xos-synchronizer/xos-synchronizer-tests/model-deps
@@ -7,19 +7,7 @@
-
-
-
-
-
-
-
-
- ["ControllerUser", "controllerusers", "user"],
-
-
- ["Site", "site", "users"],
- ["DashboardView", "dashboards", "user"]
+ ["Site", "site", "users"]
],
@@ -29,17 +17,6 @@
-
-
-
-
-
-
-
-
- ["ControllerPrivilege", "controllerprivileges", "privilege"]
-
-
],
@@ -52,165 +29,17 @@
["Service", "service", "addresspools"]
],
-
- "ControllerDashboardView": [
+ "ComputeServiceInstance": [
- ["Controller", "controller", "controllerdashboardviews"],
- ["DashboardView", "dashboardView", "controllerdashboardviews"]
-
- ],
-
- "ControllerImages": [
-
-
-
-
-
- ["Image", "image", "controllerimages"],
- ["Controller", "controller", "controllerimages"]
-
- ],
-
- "ControllerNetwork": [
-
-
-
-
-
- ["Network", "network", "controllernetworks"],
- ["Controller", "controller", "controllernetworks"]
-
- ],
-
- "ControllerRole": [
-
-
-
-
-
-
- ],
-
- "ControllerSite": [
-
-
-
-
-
- ["Site", "site", "controllersite"],
- ["Controller", "controller", "controllersite"]
-
- ],
-
- "ControllerPrivilege": [
-
-
-
-
-
- ["Controller", "controller", "controllerprivileges"],
- ["Privilege", "privilege", "controllerprivileges"]
-
- ],
-
- "ControllerSitePrivilege": [
-
-
-
-
-
- ["Controller", "controller", "controllersiteprivileges"],
- ["SitePrivilege", "site_privilege", "controllersiteprivileges"]
-
- ],
-
- "ControllerSlice": [
-
-
-
-
-
- ["Controller", "controller", "controllerslices"],
- ["Slice", "slice", "controllerslices"]
-
- ],
-
- "ControllerSlicePrivilege": [
-
-
-
-
-
- ["Controller", "controller", "controllersliceprivileges"],
- ["SlicePrivilege", "slice_privilege", "controllersliceprivileges"]
-
- ],
-
- "ControllerUser": [
-
-
-
-
-
- ["User", "user", "controllerusers"],
- ["Controller", "controller", "controllersusers"]
-
- ],
-
- "DashboardView": [
-
-
-
-
-
-
-
-
-
-
-
-
-
- ["ControllerDashboardView", "controllerdashboardviews", "dashboardView"],
-
-
- ["Controller", "controllers", "dashboardviews"],
- ["Deployment", "deployments", "dashboardviews"]
-
- ],
-
- "Deployment": [
-
-
-
-
-
-
- ],
-
- "DeploymentPrivilege": [
-
-
-
-
-
- ["User", "user", "deploymentprivileges"],
- ["Deployment", "deployment", "deploymentprivileges"],
- ["DeploymentRole", "role", "deploymentprivileges"]
-
- ],
-
- "DeploymentRole": [
-
-
-
-
-
+ ["Service", "owner", "service_instances"],
+ ["ServiceInstance", "master_serviceinstance", "child_serviceinstances"],
+ ["Slice", "slice", "computeserviceinstances"],
+ ["Image", "image", "computeserviceinstances"]
],
@@ -229,44 +58,6 @@
-
-
-
-
-
-
-
-
- ["ControllerImages", "controllerimages", "image"]
-
-
-
- ],
-
- "ImageDeployments": [
-
-
-
-
-
- ["Image", "image", "imagedeployments"],
- ["Deployment", "deployment", "imagedeployments"]
-
- ],
-
- "Instance": [
-
-
-
-
-
- ["Image", "image", "instances"],
- ["User", "creator", "instances"],
- ["Slice", "slice", "instances"],
- ["Deployment", "deployment", "instance_deployment"],
- ["Node", "node", "instances"],
- ["Flavor", "flavor", "instance"],
- ["Instance", "parent", "instance"]
],
@@ -276,20 +67,10 @@
-
-
-
-
-
-
-
-
- ["ControllerNetwork", "controllernetworks", "network"],
-
-
["NetworkTemplate", "template", "network"],
["Slice", "owner", "ownedNetworks"],
["Slice", "permitted_slices", "availableNetworks"]
+
],
"NetworkParameter": [
@@ -337,7 +118,7 @@
- ["SiteDeployment", "site_deployment", "nodes"]
+ ["Site", "site", "nodes"]
],
@@ -358,7 +139,17 @@
["Network", "network", "links"],
- ["Instance", "instance", "ports"]
+ ["ServiceInstance", "service_instance", "ports"]
+
+ ],
+
+ "Principal": [
+
+
+
+
+
+ ["TrustDomain", "trust_domain", "principals"]
],
@@ -368,11 +159,6 @@
-
-
-
-
-
],
@@ -385,6 +171,16 @@
],
+ "ServicePort": [
+
+
+
+
+
+ ["Service", "service", "serviceports"]
+
+ ],
+
"ServiceAttribute": [
@@ -406,67 +202,12 @@
],
- "ServiceMonitoringAgentInfo": [
-
-
-
-
-
- ["Service", "service", "servicemonitoringagents"]
-
- ],
-
- "ServicePrivilege": [
-
-
-
-
-
- ["User", "user", "serviceprivileges"],
- ["Service", "service", "serviceprivileges"],
- ["ServiceRole", "role", "serviceprivileges"]
-
- ],
-
- "ServiceRole": [
-
-
-
-
-
-
- ],
-
"Site": [
-
-
-
-
-
-
-
-
- ["ControllerSite", "controllersite", "site"],
-
-
- ["Deployment", "deployments", "sites"]
-
- ],
-
- "SiteDeployment": [
-
-
-
-
-
- ["Site", "site", "sitedeployments"],
- ["Deployment", "deployment", "sitedeployments"],
- ["Controller", "controller", "sitedeployments"]
],
@@ -476,17 +217,6 @@
-
-
-
-
-
-
-
-
- ["ControllerSitePrivilege", "controllersiteprivileges", "site_privilege"],
-
-
["User", "user", "siteprivileges"],
["Site", "site", "siteprivileges"],
["SiteRole", "role", "siteprivileges"]
@@ -508,23 +238,14 @@
-
-
-
-
-
-
-
-
- ["ControllerSlice", "controllerslices", "slice"],
-
-
["Site", "site", "slices"],
["Service", "service", "slices"],
["User", "creator", "slices"],
["Flavor", "default_flavor", "slices"],
["Image", "default_image", "slices"],
- ["Node", "default_node", "slices"]
+ ["Node", "default_node", "slices"],
+ ["TrustDomain", "trust_domain", "slices"],
+ ["Principal", "principal", "slices"]
],
@@ -534,17 +255,6 @@
-
-
-
-
-
-
-
-
- ["ControllerSlicePrivilege", "controllersliceprivileges", "slice_privilege"],
-
-
["User", "user", "sliceprivileges"],
["Slice", "slice", "sliceprivileges"],
["SliceRole", "role", "sliceprivileges"]
@@ -596,7 +306,8 @@
- ["Service", "owner", "service_instances"]
+ ["Service", "owner", "service_instances"],
+ ["ServiceInstance", "master_serviceinstance", "child_serviceinstances"]
],
@@ -624,19 +335,17 @@
],
- "TenantWithContainer": [
+ "TrustDomain": [
- ["Service", "owner", "service_instances"],
- ["Instance", "instance", "+"],
- ["User", "creator", "+"]
+ ["Service", "owner", "owned_trust_domains"]
],
- "XOS": [
+ "XOSCore": [
@@ -652,5 +361,14 @@
+ ],
+
+ "ServiceGraphConstraint": [
+
+
+
+
+
+
]
-}
+}
\ No newline at end of file
diff --git a/lib/xos-synchronizer/xos-synchronizer-tests/test_controller_dependencies.py b/lib/xos-synchronizer/xos-synchronizer-tests/test_controller_dependencies.py
deleted file mode 100644
index 47d55f0..0000000
--- a/lib/xos-synchronizer/xos-synchronizer-tests/test_controller_dependencies.py
+++ /dev/null
@@ -1,244 +0,0 @@
-# Copyright 2017-present Open Networking Foundation
-#
-# 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 unittest
-from mock import patch
-import mock
-import pdb
-import networkx as nx
-
-import os
-import sys
-
-test_path = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
-sync_lib_dir = os.path.join(test_path, "..", "xossynchronizer")
-xos_dir = os.path.join(test_path, "..", "..", "..", "xos")
-
-
-class TestControllerDependencies(unittest.TestCase):
-
- def setUp(self):
- global mock_enumerator, event_loop
-
- self.sys_path_save = sys.path
- self.cwd_save = os.getcwd()
-
- config = os.path.join(test_path, "test_config.yaml")
- from xosconfig import Config
-
- Config.clear()
- Config.init(config, "synchronizer-config-schema.yaml")
-
- from xossynchronizer.mock_modelaccessor_build import (
- build_mock_modelaccessor,
- )
-
- build_mock_modelaccessor(sync_lib_dir, xos_dir, services_dir=None, service_xprotos=[])
-
- os.chdir(os.path.join(test_path, "..")) # config references xos-synchronizer-tests/model-deps
-
- import xossynchronizer.event_loop
- reload(xossynchronizer.event_loop)
- event_loop = xossynchronizer.event_loop
-
- import xossynchronizer.backend
- reload(xossynchronizer.backend)
-
- from xossynchronizer.modelaccessor import model_accessor
-
- from mock_modelaccessor import mock_enumerator
-
- # import all class names to globals
- for (k, v) in model_accessor.all_model_classes.items():
- globals()[k] = v
-
- b = xossynchronizer.backend.Backend(model_accessor=model_accessor)
- steps_dir = Config.get("steps_dir")
- self.steps = b.load_sync_step_modules(steps_dir)
- self.synchronizer = xossynchronizer.event_loop.XOSObserver(self.steps, model_accessor)
-
- def tearDown(self):
- sys.path = self.sys_path_save
- os.chdir(self.cwd_save)
-
- def test_multi_controller_path(self):
- csl = ControllerSlice()
- csi = ControllerSite()
- site = Site()
- slice = Slice()
- slice.site = site
- csl.slice = slice
- csi.site = site
- slice.controllerslices = mock_enumerator([csl])
- site.controllersite = mock_enumerator([csi])
-
- verdict, edge_type = self.synchronizer.concrete_path_exists(csl, csi)
- self.assertTrue(verdict)
-
- # TODO(smbaker): event_loop.PROXY_EDGE is set to the wrong thing
- # self.assertEqual(edge_type, event_loop.PROXY_EDGE)
-
- def test_controller_path_simple(self):
- p = Instance()
- s = Slice()
- t = Site()
- ct = ControllerSite()
- p.slice = s
- s.site = t
- ct.site = t
- t.controllersite = mock_enumerator([ct])
- cohorts = self.synchronizer.compute_dependent_cohorts([p, ct], False)
- self.assertEqual([ct, p], cohorts[0])
- cohorts = self.synchronizer.compute_dependent_cohorts([ct, p], False)
- self.assertEqual([ct, p], cohorts[0])
-
- def test_controller_deletion_path(self):
- p = Instance()
- s = Slice()
- t = Site()
- ct = ControllerSite()
- ct.site = t
- p.slice = s
- s.site = t
-
- t.controllersite = mock_enumerator([ct])
-
- cohorts = self.synchronizer.compute_dependent_cohorts([p, s, t, ct], False)
- self.assertIn(t, cohorts[0])
- self.assertIn(ct, cohorts[0])
- self.assertIn(s, cohorts[0])
- self.assertIn(p, cohorts[0])
- # TODO(smbaker): This assert was found to be failing. Understand whether the library or the test is at fault.
- #self.assertEqual([t, ct, s, p], cohorts[0])
-
- cohorts = self.synchronizer.compute_dependent_cohorts([p, s, t, ct], True)
- self.assertIn(t, cohorts[0])
- self.assertIn(ct, cohorts[0])
- self.assertIn(s, cohorts[0])
- self.assertIn(p, cohorts[0])
- # TODO(smbaker): This assert was found to be failing. Understand whether the library or the test is at fault.
- #self.assertEqual([p, s, ct, t], cohorts[0])
-
- def test_multi_controller_schedule(self):
- csl = ControllerSlice()
- csi = ControllerSite()
- site = Site()
- slice = Slice()
- slice.site = site
- csl.slice = slice
- csi.site = site
- slice.controllerslices = mock_enumerator([csl])
- site.controllersite = mock_enumerator([csi])
- i = Instance()
- i.slice = slice
-
- cohorts = self.synchronizer.compute_dependent_cohorts(
- [i, slice, site, csl, csi], False
- )
- self.assertIn(site, cohorts[0])
- self.assertIn(csi, cohorts[0])
- self.assertIn(slice, cohorts[0])
- self.assertIn(csl, cohorts[0])
- self.assertIn(i, cohorts[0])
-
- # TODO(smbaker): This assert was found to be failing. Understand whether the library or the test is at fault.
- #self.assertEqual([site, csi, slice, csl, i], cohorts[0])
-
- def test_multi_controller_path_negative(self):
- csl = ControllerSlice()
- csi = ControllerSite()
- site = Site()
- slice = Slice()
- slice.site = site
- csl.slice = slice
- csi.site = site
- slice.controllerslices = mock_enumerator([])
- site.controllersite = mock_enumerator([])
-
- verdict, edge_type = self.synchronizer.concrete_path_exists(csl, csi)
- self.assertFalse(verdict)
- self.assertEqual(edge_type, None)
-
- def test_controller_path_simple_negative(self):
- p = Instance()
- s = Slice()
- t = Site()
- ct = ControllerSite()
- p.slice = s
- s.site = t
- ct.site = t
- t.controllersite = mock_enumerator([])
- cohorts = self.synchronizer.compute_dependent_cohorts([p, ct], False)
- self.assertIn([ct], cohorts)
- self.assertIn([p], cohorts)
-
- def test_controller_deletion_path_negative(self):
- p = Instance()
- s = Slice()
- t = Site()
- ct = ControllerSite()
- s.site = t
-
- t.controllersite = mock_enumerator([])
-
- cohorts = self.synchronizer.compute_dependent_cohorts([p, s, t, ct], False)
- self.assertIn([t, s], cohorts)
- self.assertIn([p], cohorts)
- self.assertIn([ct], cohorts)
- cohorts = self.synchronizer.compute_dependent_cohorts([p, s, t, ct], True)
- self.assertIn([s, t], cohorts)
- self.assertIn([p], cohorts)
- self.assertIn([ct], cohorts)
-
- def DISABLED_test_multi_controller_deletion_schedule(self):
- # TODO(smbaker): `csi` is undefined, test is broken as written.
-
- csl = ControllerSlice()
- cn = ControllerNetwork()
- site = Site()
- slice = Slice()
- slice.site = site
- slice.controllerslices = mock_enumerator([])
- site.controllersite = mock_enumerator([])
- i = Instance()
- i.slice = slice
-
- cohorts = self.synchronizer.compute_dependent_cohorts(
- [i, slice, site, csl, csi], False
- )
- self.assertIn([site, slice, i], cohorts)
- self.assertIn([csl], cohorts)
- self.assertIn([csi], cohorts)
-
- def test_multi_controller_schedule_negative(self):
- csl = ControllerSlice()
- csi = ControllerSite()
- site = Site()
- slice = Slice()
- slice.site = site
- slice.controllerslices = mock_enumerator([])
- site.controllersite = mock_enumerator([])
- i = Instance()
- i.slice = slice
-
- cohorts = self.synchronizer.compute_dependent_cohorts(
- [i, slice, site, csl, csi], False
- )
- self.assertIn([site, slice, i], cohorts)
- self.assertIn([csl], cohorts)
- self.assertIn([csi], cohorts)
-
-
-if __name__ == "__main__":
- unittest.main()
diff --git a/lib/xos-synchronizer/xos-synchronizer-tests/test_load.py b/lib/xos-synchronizer/xos-synchronizer-tests/test_load.py
index e2bbbb0..774bc97 100644
--- a/lib/xos-synchronizer/xos-synchronizer-tests/test_load.py
+++ b/lib/xos-synchronizer/xos-synchronizer-tests/test_load.py
@@ -65,39 +65,22 @@
def test_load_steps(self):
step_names = [s.__name__ for s in self.steps]
- self.assertIn("SyncControllerSlices", step_names)
+ self.assertIn("SyncPort", step_names)
def test_load_deps(self):
self.synchronizer.load_dependency_graph()
graph = self.synchronizer.model_dependency_graph
- self.assertTrue(graph[False].has_edge("Instance", "Slice"))
- self.assertTrue(graph[True].has_edge("Slice", "Instance"))
- self.assertTrue(graph[False].has_edge("Slice", "ControllerSlice"))
- self.assertTrue(graph[True].has_edge("ControllerSlice", "Slice"))
-
- def test_load_dep_accessors(self):
- self.synchronizer.load_dependency_graph()
- graph = self.synchronizer.model_dependency_graph
- self.assertDictContainsSubset(
- {"src_accessor": "controllerslices"},
- graph[False]["Slice"]["ControllerSlice"],
- )
- self.assertDictContainsSubset(
- {"src_accessor": "slice", "dst_accessor": "controllerslices"},
- graph[True]["Slice"]["ControllerSlice"],
- )
+ self.assertTrue(graph[False].has_edge("Slice", "Site"))
+ self.assertTrue(graph[True].has_edge("Site", "Slice"))
def test_load_sync_steps(self):
self.synchronizer.load_sync_steps()
model_to_step = self.synchronizer.model_to_step
step_lookup = self.synchronizer.step_lookup
self.assertIn(
- ("ControllerSlice", ["SyncControllerSlices"]), model_to_step.items()
- )
- self.assertIn(
("Port", ["SyncPort"]), model_to_step.items()
)
- self.assertIn(("SiteRole", ["SyncRoles"]), model_to_step.items())
+ self.assertIn(("Image", ["SyncImages"]), model_to_step.items())
for k, v in model_to_step.items():
val = v[0]
diff --git a/lib/xos-synchronizer/xos-synchronizer-tests/test_model_policy_tenantwithcontainer.py b/lib/xos-synchronizer/xos-synchronizer-tests/test_model_policy_tenantwithcontainer.py
deleted file mode 100644
index e2659c3..0000000
--- a/lib/xos-synchronizer/xos-synchronizer-tests/test_model_policy_tenantwithcontainer.py
+++ /dev/null
@@ -1,286 +0,0 @@
-# Copyright 2017-present Open Networking Foundation
-#
-# 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 unittest
-from mock import patch
-import mock
-import pdb
-
-import os
-import sys
-from xosconfig import Config
-
-test_path = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
-sync_lib_dir = os.path.join(test_path, "..", "xossynchronizer")
-xos_dir = os.path.join(test_path, "..", "..", "..", "xos")
-
-class TestModelPolicyTenantWithContainer(unittest.TestCase):
- def setUp(self):
- global TenantWithContainerPolicy, LeastLoadedNodeScheduler, MockObjectList
-
- self.sys_path_save = sys.path
- self.cwd_save = os.getcwd()
-
- config = basic_conf = os.path.abspath(
- os.path.dirname(os.path.realpath(__file__)) + "/test_config.yaml"
- )
- Config.clear() # in case left unclean by a previous test case
- Config.init(config, "synchronizer-config-schema.yaml")
-
- from xossynchronizer.mock_modelaccessor_build import (
- build_mock_modelaccessor,
- )
-
- build_mock_modelaccessor(sync_lib_dir, xos_dir, services_dir=None, service_xprotos=[])
-
- import xossynchronizer.model_policies.model_policy_tenantwithcontainer
- from xossynchronizer.model_policies.model_policy_tenantwithcontainer import (
- TenantWithContainerPolicy,
- LeastLoadedNodeScheduler,
- )
-
- from mock_modelaccessor import MockObjectList
-
- # import all class names to globals
- for (
- k,
- v,
- ) in xossynchronizer.model_policies.model_policy_tenantwithcontainer.model_accessor.all_model_classes.items():
- globals()[k] = v
-
- from xossynchronizer.modelaccessor import model_accessor
-
- self.policy = TenantWithContainerPolicy(model_accessor=model_accessor)
- self.user = User(email="testadmin@test.org")
- self.tenant = TenantWithContainer(creator=self.user)
- self.flavor = Flavor(name="m1.small")
-
- def tearDown(self):
- Config.clear()
- sys.path = self.sys_path_save
- os.chdir(self.cwd_save)
-
- def test_manage_container_no_slices(self):
- with patch.object(TenantWithContainer, "owner") as owner:
- owner.slices.count.return_value = 0
- with self.assertRaises(Exception) as e:
- self.policy.manage_container(self.tenant)
- self.assertEqual(e.exception.message, "The service has no slices")
-
- def test_manage_container(self):
- with patch.object(TenantWithContainer, "owner") as owner, patch.object(
- TenantWithContainer, "save"
- ) as tenant_save, patch.object(
- Node, "site_deployment"
- ) as site_deployment, patch.object(
- Instance, "save"
- ) as instance_save, patch.object(
- Instance, "delete"
- ) as instance_delete, patch.object(
- TenantWithContainerPolicy, "get_image"
- ) as get_image, patch.object(
- LeastLoadedNodeScheduler, "pick"
- ) as pick:
- # setup mocks
- node = Node(hostname="my.node.com")
- slice = Slice(
- name="mysite_test1", default_flavor=self.flavor, default_isolation="vm"
- )
- image = Image(name="trusty-server-multi-nic")
- deployment = Deployment(name="testdeployment")
- owner.slices.count.return_value = 1
- owner.slices.all.return_value = [slice]
- owner.slices.first.return_value = slice
- get_image.return_value = image
- pick.return_value = (node, None)
- site_deployment.deployment = deployment
- # done setup mocks
-
- # call manage_container
- self.policy.manage_container(self.tenant)
-
- # make sure manage_container did what it is supposed to do
- self.assertNotEqual(self.tenant.instance, None)
- self.assertEqual(self.tenant.instance.creator.email, "testadmin@test.org")
- self.assertEqual(self.tenant.instance.image.name, "trusty-server-multi-nic")
- self.assertEqual(self.tenant.instance.flavor.name, "m1.small")
- self.assertEqual(self.tenant.instance.isolation, "vm")
- self.assertEqual(self.tenant.instance.node.hostname, "my.node.com")
- self.assertEqual(self.tenant.instance.slice.name, "mysite_test1")
- self.assertEqual(self.tenant.instance.parent, None)
- instance_save.assert_called()
- instance_delete.assert_not_called()
- tenant_save.assert_called()
-
- def test_manage_container_delete(self):
- self.tenant.deleted = True
-
- # call manage_container
- self.policy.manage_container(self.tenant)
-
- # make sure manage_container did what it is supposed to do
- self.assertEqual(self.tenant.instance, None)
-
- def test_manage_container_no_m1_small(self):
- with patch.object(TenantWithContainer, "owner") as owner, patch.object(
- Node, "site_deployment"
- ) as site_deployment, patch.object(
- Flavor, "objects"
- ) as flavor_objects, patch.object(
- TenantWithContainerPolicy, "get_image"
- ) as get_image, patch.object(
- LeastLoadedNodeScheduler, "pick"
- ) as pick:
- # setup mocks
- node = Node(hostname="my.node.com")
- slice = Slice(
- name="mysite_test1", default_flavor=None, default_isolation="vm"
- )
- image = Image(name="trusty-server-multi-nic")
- deployment = Deployment(name="testdeployment")
- owner.slices.count.return_value = 1
- owner.slices.all.return_value = [slice]
- owner.slices.first.return_value = slice
- get_image.return_value = image
- pick.return_value = (node, None)
- site_deployment.deployment = deployment
- flavor_objects.filter.return_value = []
- # done setup mocks
-
- with self.assertRaises(Exception) as e:
- self.policy.manage_container(self.tenant)
- self.assertEqual(e.exception.message, "No m1.small flavor")
-
- def test_least_loaded_node_scheduler(self):
- with patch.object(Node.objects, "get_items") as node_objects:
- slice = Slice(
- name="mysite_test1", default_flavor=None, default_isolation="vm"
- )
- node = Node(hostname="my.node.com", id=4567)
- node.instances = MockObjectList(initial=[])
- node_objects.return_value = [node]
-
- sched = LeastLoadedNodeScheduler(slice)
- (picked_node, parent) = sched.pick()
-
- self.assertNotEqual(picked_node, None)
- self.assertEqual(picked_node.id, node.id)
-
- def test_least_loaded_node_scheduler_two_nodes(self):
- with patch.object(Node.objects, "get_items") as node_objects:
- slice = Slice(
- name="mysite_test1", default_flavor=None, default_isolation="vm"
- )
- instance1 = Instance(id=1)
- node1 = Node(hostname="my.node.com", id=4567)
- node1.instances = MockObjectList(initial=[])
- node2 = Node(hostname="my.node.com", id=8910)
- node2.instances = MockObjectList(initial=[instance1])
- node_objects.return_value = [node1, node2]
-
- # should pick the node with the fewest instance (node1)
-
- sched = LeastLoadedNodeScheduler(slice)
- (picked_node, parent) = sched.pick()
-
- self.assertNotEqual(picked_node, None)
- self.assertEqual(picked_node.id, node1.id)
-
- def test_least_loaded_node_scheduler_two_nodes_multi(self):
- with patch.object(Node.objects, "get_items") as node_objects:
- slice = Slice(
- name="mysite_test1", default_flavor=None, default_isolation="vm"
- )
- instance1 = Instance(id=1)
- instance2 = Instance(id=2)
- instance3 = Instance(id=3)
- node1 = Node(hostname="my.node.com", id=4567)
- node1.instances = MockObjectList(initial=[instance2, instance3])
- node2 = Node(hostname="my.node.com", id=8910)
- node2.instances = MockObjectList(initial=[instance1])
- node_objects.return_value = [node1, node2]
-
- # should pick the node with the fewest instance (node2)
-
- sched = LeastLoadedNodeScheduler(slice)
- (picked_node, parent) = sched.pick()
-
- self.assertNotEqual(picked_node, None)
- self.assertEqual(picked_node.id, node2.id)
-
- def test_least_loaded_node_scheduler_with_label(self):
- with patch.object(Node.objects, "get_items") as node_objects:
- slice = Slice(
- name="mysite_test1", default_flavor=None, default_isolation="vm"
- )
- instance1 = Instance(id=1)
- node1 = Node(hostname="my.node.com", id=4567)
- node1.instances = MockObjectList(initial=[])
- node2 = Node(hostname="my.node.com", id=8910)
- node2.instances = MockObjectList(initial=[instance1])
- # Fake out the existence of a NodeLabel object. TODO: Extend the mock framework to support the model__field
- # syntax.
- node1.nodelabels__name = None
- node2.nodelabels__name = "foo"
- node_objects.return_value = [node1, node2]
-
- # should pick the node with the label, even if it has a greater number of instances
-
- sched = LeastLoadedNodeScheduler(slice, label="foo")
- (picked_node, parent) = sched.pick()
-
- self.assertNotEqual(picked_node, None)
- self.assertEqual(picked_node.id, node2.id)
-
- def test_least_loaded_node_scheduler_create_label(self):
- with patch.object(Node.objects, "get_items") as node_objects, patch.object(
- NodeLabel, "save", autospec=True
- ) as nodelabel_save, patch.object(NodeLabel, "node") as nodelabel_node_add:
- slice = Slice(
- name="mysite_test1", default_flavor=None, default_isolation="vm"
- )
- instance1 = Instance(id=1)
- node1 = Node(hostname="my.node.com", id=4567)
- node1.instances = MockObjectList(initial=[])
- node2 = Node(hostname="my.node.com", id=8910)
- node2.instances = MockObjectList(initial=[instance1])
- # Fake out the existence of a NodeLabel object. TODO: Extend the mock framework to support the model__field
- # syntax.
- node1.nodelabels__name = None
- node2.nodelabels__name = None
- node_objects.return_value = [node1, node2]
-
- # should pick the node with the least number of instances
-
- sched = LeastLoadedNodeScheduler(
- slice, label="foo", constrain_by_service_instance=True
- )
- (picked_node, parent) = sched.pick()
-
- self.assertNotEqual(picked_node, None)
- self.assertEqual(picked_node.id, node1.id)
-
- # NodeLabel should have been created and saved
-
- self.assertEqual(nodelabel_save.call_count, 1)
- self.assertEqual(nodelabel_save.call_args[0][0].name, "foo")
-
- # The NodeLabel's node field should have been added to
-
- NodeLabel.node.add.assert_called_with(node1)
-
-
-if __name__ == "__main__":
- unittest.main()
diff --git a/lib/xos-synchronizer/xos-synchronizer-tests/test_payload.py b/lib/xos-synchronizer/xos-synchronizer-tests/test_payload.py
deleted file mode 100644
index ab861c8..0000000
--- a/lib/xos-synchronizer/xos-synchronizer-tests/test_payload.py
+++ /dev/null
@@ -1,342 +0,0 @@
-# Copyright 2017-present Open Networking Foundation
-#
-# 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 json
-import unittest
-from mock import patch
-import mock
-import pdb
-import networkx as nx
-
-import os
-import sys
-
-test_path = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
-sync_lib_dir = os.path.join(test_path, "..", "xossynchronizer")
-xos_dir = os.path.join(test_path, "..", "..", "..", "xos")
-
-ANSIBLE_FILE = "/tmp/payload_test"
-
-log = None
-
-
-def run_fake_ansible_template(*args, **kwargs):
- opts = args[1]
- open(ANSIBLE_FILE, "w").write(json.dumps(opts))
- return [{"rc": 0}]
-
-
-def run_fake_ansible_template_fail(*args, **kwargs):
- opts = args[1]
- open(ANSIBLE_FILE, "w").write(json.dumps(opts))
- return [{"rc": 1}]
-
-
-def get_ansible_output():
- ansible_str = open(ANSIBLE_FILE).read()
- return json.loads(ansible_str)
-
-
-class TestPayload(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
-
- global log
-
- config = os.path.join(test_path, "test_config.yaml")
- from xosconfig import Config
-
- Config.clear()
- Config.init(config, "synchronizer-config-schema.yaml")
-
- if not log:
- from multistructlog import create_logger
-
- log = create_logger(Config().get("logging"))
-
- def setUp(self):
-
- global log, test_steps, event_loop
-
- self.sys_path_save = sys.path
- self.cwd_save = os.getcwd()
-
- config = os.path.join(test_path, "test_config.yaml")
- from xosconfig import Config
-
- Config.clear()
- Config.init(config, "synchronizer-config-schema.yaml")
-
- from xossynchronizer.mock_modelaccessor_build import (
- build_mock_modelaccessor,
- )
-
- build_mock_modelaccessor(sync_lib_dir, xos_dir, services_dir=None, service_xprotos=[])
-
- os.chdir(os.path.join(test_path, "..")) # config references xos-synchronizer-tests/model-deps
-
- import xossynchronizer.event_loop
-
- reload(xossynchronizer.event_loop)
- import xossynchronizer.backend
-
- reload(xossynchronizer.backend)
- import test_steps.sync_instances
- import test_steps.sync_controller_slices
- from xossynchronizer.modelaccessor import model_accessor
-
- # import all class names to globals
- for (k, v) in model_accessor.all_model_classes.items():
- globals()[k] = v
- b = xossynchronizer.backend.Backend(model_accessor = model_accessor)
- steps_dir = Config.get("steps_dir")
- self.steps = b.load_sync_step_modules(steps_dir)
- self.synchronizer = xossynchronizer.event_loop.XOSObserver(self.steps, model_accessor)
-
- def tearDown(self):
- sys.path = self.sys_path_save
- os.chdir(self.cwd_save)
-
- @mock.patch(
- "test_steps.sync_instances.ansiblesyncstep.run_template",
- side_effect=run_fake_ansible_template,
- )
- def test_delete_record(self, mock_run_template):
- with mock.patch.object(Instance, "save") as instance_save:
- o = Instance()
- o.name = "Sisi Pascal"
-
- o.synchronizer_step = test_steps.sync_instances.SyncInstances(model_accessor = self.synchronizer.model_accessor)
- self.synchronizer.delete_record(o, log)
-
- a = get_ansible_output()
- self.assertDictContainsSubset({"delete": True, "name": o.name}, a)
- o.save.assert_called_with(update_fields=["backend_need_reap"])
-
- @mock.patch(
- "test_steps.sync_instances.ansiblesyncstep.run_template",
- side_effect=run_fake_ansible_template_fail,
- )
- def test_delete_record_fail(self, mock_run_template):
- with mock.patch.object(Instance, "save") as instance_save:
- o = Instance()
- o.name = "Sisi Pascal"
-
- o.synchronizer_step = test_steps.sync_instances.SyncInstances(model_accessor = self.synchronizer.model_accessor)
-
- with self.assertRaises(Exception) as e:
- self.synchronizer.delete_record(o, log)
-
- self.assertEqual(
- e.exception.message, "Nonzero rc from Ansible during delete_record"
- )
-
- @mock.patch(
- "test_steps.sync_instances.ansiblesyncstep.run_template",
- side_effect=run_fake_ansible_template,
- )
- def test_sync_record(self, mock_run_template):
- with mock.patch.object(Instance, "save") as instance_save:
- o = Instance()
- o.name = "Sisi Pascal"
-
- o.synchronizer_step = test_steps.sync_instances.SyncInstances(model_accessor = self.synchronizer.model_accessor)
- self.synchronizer.sync_record(o, log)
-
- a = get_ansible_output()
- self.assertDictContainsSubset({"delete": False, "name": o.name}, a)
- o.save.assert_called_with(
- update_fields=[
- "enacted",
- "backend_status",
- "backend_register",
- "backend_code",
- ]
- )
-
- @mock.patch(
- "test_steps.sync_instances.ansiblesyncstep.run_template",
- side_effect=run_fake_ansible_template,
- )
- def test_sync_cohort(self, mock_run_template):
- with mock.patch.object(Instance, "save") as instance_save, mock.patch.object(
- ControllerSlice, "save"
- ) as controllerslice_save:
- cs = ControllerSlice()
- s = Slice(name="SP SP")
- cs.slice = s
-
- o = Instance()
- o.name = "Sisi Pascal"
- o.slice = s
-
- cohort = [cs, o]
- o.synchronizer_step = test_steps.sync_instances.SyncInstances(model_accessor = self.synchronizer.model_accessor)
- cs.synchronizer_step = test_steps.sync_controller_slices.SyncControllerSlices(
- model_accessor = self.synchronizer.model_accessor
- )
-
- self.synchronizer.sync_cohort(cohort, False)
-
- a = get_ansible_output()
- self.assertDictContainsSubset({"delete": False, "name": o.name}, a)
- o.save.assert_called_with(
- update_fields=[
- "enacted",
- "backend_status",
- "backend_register",
- "backend_code",
- ]
- )
- cs.save.assert_called_with(
- update_fields=[
- "enacted",
- "backend_status",
- "backend_register",
- "backend_code",
- ]
- )
-
- @mock.patch(
- "test_steps.sync_instances.ansiblesyncstep.run_template",
- side_effect=run_fake_ansible_template,
- )
- def test_deferred_exception(self, mock_run_template):
- with mock.patch.object(Instance, "save") as instance_save:
- cs = ControllerSlice()
- s = Slice(name="SP SP")
- cs.slice = s
- cs.force_defer = True
-
- o = Instance()
- o.name = "Sisi Pascal"
- o.slice = s
-
- cohort = [cs, o]
- o.synchronizer_step = test_steps.sync_instances.SyncInstances(model_accessor=self.synchronizer.model_accessor)
- cs.synchronizer_step = test_steps.sync_controller_slices.SyncControllerSlices(
- model_accessor=self.synchronizer.model_accessor
- )
-
- self.synchronizer.sync_cohort(cohort, False)
- o.save.assert_called_with(
- always_update_timestamp=True,
- update_fields=["backend_status", "backend_register"],
- )
- self.assertEqual(cs.backend_code, 0)
-
- self.assertIn("Force", cs.backend_status)
- self.assertIn("Failed due to", o.backend_status)
-
- @mock.patch(
- "test_steps.sync_instances.ansiblesyncstep.run_template",
- side_effect=run_fake_ansible_template,
- )
- def test_backend_status(self, mock_run_template):
- with mock.patch.object(Instance, "save") as instance_save:
- cs = ControllerSlice()
- s = Slice(name="SP SP")
- cs.slice = s
- cs.force_fail = True
-
- o = Instance()
- o.name = "Sisi Pascal"
- o.slice = s
-
- cohort = [cs, o]
- o.synchronizer_step = test_steps.sync_instances.SyncInstances(model_accessor=self.synchronizer.model_accessor)
- cs.synchronizer_step = test_steps.sync_controller_slices.SyncControllerSlices(
- model_accessor=self.synchronizer.model_accessor)
-
- self.synchronizer.sync_cohort(cohort, False)
- o.save.assert_called_with(
- always_update_timestamp=True,
- update_fields=["backend_status", "backend_register"],
- )
- self.assertIn("Force", cs.backend_status)
- self.assertIn("Failed due to", o.backend_status)
-
- @mock.patch(
- "test_steps.sync_instances.ansiblesyncstep.run_template",
- side_effect=run_fake_ansible_template,
- )
- def test_fetch_pending(self, mock_run_template):
- pending_objects, pending_steps = self.synchronizer.fetch_pending()
- pending_objects2 = list(pending_objects)
-
- any_cs = next(
- obj for obj in pending_objects if obj.leaf_model_name == "ControllerSlice"
- )
- any_instance = next(
- obj for obj in pending_objects2 if obj.leaf_model_name == "Instance"
- )
-
- slice = Slice()
- any_instance.slice = slice
- any_cs.slice = slice
-
- self.synchronizer.external_dependencies = []
- cohorts = self.synchronizer.compute_dependent_cohorts(pending_objects, False)
- flat_objects = [item for cohort in cohorts for item in cohort]
-
- self.assertEqual(set(flat_objects), set(pending_objects))
-
- @mock.patch(
- "test_steps.sync_instances.ansiblesyncstep.run_template",
- side_effect=run_fake_ansible_template,
- )
- def test_fetch_pending_with_external_dependencies(
- self, mock_run_template,
- ):
- pending_objects, pending_steps = self.synchronizer.fetch_pending()
- pending_objects2 = list(pending_objects)
-
- any_cn = next(
- obj for obj in pending_objects if obj.leaf_model_name == "ControllerNetwork"
- )
- any_user = next(
- obj for obj in pending_objects2 if obj.leaf_model_name == "User"
- )
-
- cohorts = self.synchronizer.compute_dependent_cohorts(pending_objects, False)
-
- flat_objects = [item for cohort in cohorts for item in cohort]
- self.assertEqual(set(flat_objects), set(pending_objects))
-
- # These cannot be None, but for documentation purposes
- self.assertIsNotNone(any_cn)
- self.assertIsNotNone(any_user)
-
- @mock.patch(
- "test_steps.sync_instances.ansiblesyncstep.run_template",
- side_effect=run_fake_ansible_template,
- )
- def test_external_dependency_exception(self, mock_run_template):
- cs = ControllerSlice()
- s = Slice(name="SP SP")
- cs.slice = s
-
- o = Instance()
- o.name = "Sisi Pascal"
- o.slice = s
-
- cohort = [cs, o]
- o.synchronizer_step = None
- o.synchronizer_step = test_steps.sync_instances.SyncInstances(model_accessor=self.synchronizer.model_accessor)
-
- self.synchronizer.sync_cohort(cohort, False)
-
-
-if __name__ == "__main__":
- unittest.main()
diff --git a/lib/xos-synchronizer/xos-synchronizer-tests/test_run.py b/lib/xos-synchronizer/xos-synchronizer-tests/test_run.py
index fdbff3c..a9c6c19 100644
--- a/lib/xos-synchronizer/xos-synchronizer-tests/test_run.py
+++ b/lib/xos-synchronizer/xos-synchronizer-tests/test_run.py
@@ -86,24 +86,11 @@
sys.path = self.sys_path_save
os.chdir(self.cwd_save)
- @mock.patch(
- "test_steps.sync_instances.ansiblesyncstep.run_template",
- side_effect=run_fake_ansible_template,
- )
- def test_run_once(self, mock_run_template):
+ def test_run_once(self):
pending_objects, pending_steps = self.synchronizer.fetch_pending()
pending_objects2 = list(pending_objects)
- any_cs = next(
- obj for obj in pending_objects if obj.leaf_model_name == "ControllerSlice"
- )
- any_instance = next(
- obj for obj in pending_objects2 if obj.leaf_model_name == "Instance"
- )
-
slice = Slice()
- any_instance.slice = slice
- any_cs.slice = slice
self.synchronizer.run_once()
diff --git a/lib/xos-synchronizer/xos-synchronizer-tests/test_scheduler.py b/lib/xos-synchronizer/xos-synchronizer-tests/test_scheduler.py
index 0164c5a..0aa5334 100644
--- a/lib/xos-synchronizer/xos-synchronizer-tests/test_scheduler.py
+++ b/lib/xos-synchronizer/xos-synchronizer-tests/test_scheduler.py
@@ -83,36 +83,6 @@
same, t = self.synchronizer.same_object(s, t)
self.assertFalse(same)
- def test_same_object_lst(self):
- s = Slice(pk=5)
- t = ControllerSlice(slice=s)
- u = ControllerSlice(slice=s)
-
- s.controllerslices = mock_enumerator([t, u])
-
- same, et = self.synchronizer.same_object(s.controllerslices, u)
- self.assertTrue(same)
- self.assertEqual(et, event_loop.PROXY_EDGE)
-
- same, et = self.synchronizer.same_object(s.controllerslices, t)
-
- self.assertTrue(same)
- self.assertEqual(et, event_loop.PROXY_EDGE)
-
- def test_same_object_lst_dc(self):
- r = Slice(pk=4)
- s = Slice(pk=5)
- t = ControllerSlice(slice=r)
- u = ControllerSlice(slice=s)
-
- s.controllerslices = mock_enumerator([u])
-
- same, et = self.synchronizer.same_object(s.controllerslices, t)
- self.assertFalse(same)
-
- same, et = self.synchronizer.same_object(s.controllerslices, u)
- self.assertTrue(same)
-
def test_concrete_path_no_model_path(self):
p = Port()
n = NetworkParameter()
@@ -120,60 +90,24 @@
self.assertFalse(verdict)
def test_concrete_no_object_path_adjacent(self):
- p = Instance()
- s1 = Slice()
- s2 = Slice()
- p.slice = s2
- verdict, _ = self.synchronizer.concrete_path_exists(p, s1)
-
+ slice = Slice()
+ site1 = Site()
+ site2 = Site()
+ slice.site = site2
+ verdict, _ = self.synchronizer.concrete_path_exists(slice, site1)
self.assertFalse(verdict)
def test_concrete_object_path_adjacent(self):
- p = Instance()
- s = Slice()
- p.slice = s
- verdict, edge_type = self.synchronizer.concrete_path_exists(p, s)
+ slice = Slice()
+ site = Site()
+ slice.site = site
+ verdict, edge_type = self.synchronizer.concrete_path_exists(slice, site)
self.assertTrue(verdict)
self.assertEqual(edge_type, event_loop.DIRECT_EDGE)
- def test_concrete_object_controller_path_adjacent(self):
- p = Instance()
- q = Instance()
- cs = ControllerSlice()
- cs2 = ControllerSlice()
- s1 = Slice()
- s2 = Slice()
- p.slice = s1
- q.slice = s2
- cs.slice = s1
- s1.controllerslices = mock_enumerator([cs])
- s2.controllerslices = mock_enumerator([])
-
- verdict1, edge_type1 = self.synchronizer.concrete_path_exists(p, cs)
- verdict2, _ = self.synchronizer.concrete_path_exists(q, cs)
- verdict3, _ = self.synchronizer.concrete_path_exists(p, cs2)
-
- self.assertTrue(verdict1)
- self.assertFalse(verdict2)
- self.assertFalse(verdict3)
-
- # TODO(smbaker): This assert was found to be failing. Understand whether the library or the test is at fault.
- #self.assertEqual(edge_type1, event_loop.PROXY_EDGE)
-
- def test_concrete_object_controller_path_distant(self):
- p = Instance()
- s = Slice()
- t = Site()
- ct = ControllerSite()
- ct.site = t
- p.slice = s
- s.site = t
- verdict = self.synchronizer.concrete_path_exists(p, ct)
- self.assertTrue(verdict)
-
def test_concrete_object_path_distant(self):
- p = Instance()
+ p = ComputeServiceInstance()
s = Slice()
t = Site()
p.slice = s
@@ -181,93 +115,14 @@
verdict = self.synchronizer.concrete_path_exists(p, t)
self.assertTrue(verdict)
- def test_concrete_no_object_path_distant(self):
- p = Instance()
- s = Slice()
- s.controllerslice = mock_enumerator([])
-
- t = Site()
- t.controllersite = mock_enumerator([])
-
- ct = ControllerSite()
- ct.site = Site()
- p.slice = s
- s.site = t
-
- verdict, _ = self.synchronizer.concrete_path_exists(p, ct)
- self.assertFalse(verdict)
-
def test_cohorting_independent(self):
i = Image()
p = Slice()
- c = Instance()
- c.slice = None
- c.image = None
+ c = Site()
cohorts = self.synchronizer.compute_dependent_cohorts([i, p, c], False)
self.assertEqual(len(cohorts), 3)
- def test_cohorting_related(self):
- i = Image()
- p = Port()
- c = Instance()
- c.image = i
- s = ControllerSlice()
-
- cohorts = self.synchronizer.compute_dependent_cohorts([i, p, c, s], False)
- self.assertIn([i, c], cohorts)
- self.assertIn([p], cohorts)
- self.assertIn([s], cohorts)
-
- def test_cohorting_related_multi(self):
- i = Image()
- p = Port()
- c = Instance()
- c.image = i
- cs = ControllerSlice()
- s = Slice()
- cs.slice = s
- s.controllerslices = mock_enumerator([cs])
- c.slice = s
-
- cohorts = self.synchronizer.compute_dependent_cohorts([i, p, c, s, cs], False)
-
- big_cohort = max(cohorts, key=len)
- self.assertGreater(big_cohort.index(c), big_cohort.index(i))
- # TODO(smbaker): This assert was found to be failing. Understand whether the library or the test is at fault.
- #self.assertGreater(big_cohort.index(cs), big_cohort.index(s))
- self.assertIn([p], cohorts)
-
- def test_cohorting_related_multi_delete(self):
- i = Image()
- p = Port()
- c = Instance()
- c.image = i
- cs = ControllerSlice()
- s = Slice()
- cs.slice = s
- c.slice = s
-
- cohorts = self.synchronizer.compute_dependent_cohorts([i, p, c, s, cs], True)
-
- big_cohort = max(cohorts, key=len)
- self.assertGreater(big_cohort.index(i), big_cohort.index(c))
- self.assertGreater(big_cohort.index(s), big_cohort.index(cs))
- self.assertIn([p], cohorts)
-
- def test_cohorting_related_delete(self):
- i = Image()
- p = Port()
- c = Instance()
- c.image = i
- s = ControllerSlice()
-
- cohorts = self.synchronizer.compute_dependent_cohorts([i, p, c, s], True)
- self.assertIn([c, i], cohorts)
- self.assertIn([p], cohorts)
- self.assertIn([s], cohorts)
-
-
if __name__ == "__main__":
unittest.main()
diff --git a/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_container.py b/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_container.py
deleted file mode 100644
index 8cbabcb..0000000
--- a/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_container.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2017-present Open Networking Foundation
-#
-# 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 hashlib
-import os
-import socket
-import sys
-import base64
-import time
-from xossynchronizer.steps.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
-from xossynchronizer.steps.syncstep import DeferredException
-
-# hpclibrary will be in steps/..
-parentdir = os.path.join(os.path.dirname(__file__), "..")
-sys.path.insert(0, parentdir)
-
-
-class SyncContainer(SyncInstanceUsingAnsible):
- observes = "Instance"
- template_name = "sync_container.yaml"
-
- def __init__(self, *args, **kwargs):
- super(SyncContainer, self).__init__(*args, **kwargs)
-
- def fetch_pending(self, deletion=False):
- i = self.model_accessor.Instance()
- i.name = "Spectacular Sponge"
- j = self.model_accessor.Instance()
- j.name = "Spontaneous Tent"
- k = self.model_accessor.Instance()
- k.name = "Embarrassed Cat"
-
- objs = [i, j, k]
- return objs
-
- def sync_record(self, o):
- pass
-
- def delete_record(self, o):
- pass
diff --git a/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_images.py b/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_images.py
deleted file mode 100644
index ef85983..0000000
--- a/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_images.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2017-present Open Networking Foundation
-#
-# 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 os
-import base64
-from xossynchronizer.steps.syncstep import SyncStep
-
-class SyncControllerImages(SyncStep):
- observes = "ControllerImages"
- requested_interval = 0
- playbook = "sync_controller_images.yaml"
-
- def fetch_pending(self, deleted):
- ci = self.model_accessor.ControllerImages()
- i = self.model_accessor.Image()
- i.name = "Lush Loss"
- ci.i = i
- return [ci]
-
- def map_sync_inputs(self, controller_image):
- image_fields = {
- "endpoint": controller_image.controller.auth_url,
- "endpoint_v3": controller_image.controller.auth_url_v3,
- "admin_user": controller_image.controller.admin_user,
- "admin_password": controller_image.controller.admin_password,
- "domain": controller_image.controller.domain,
- "name": controller_image.image.name,
- "filepath": controller_image.image.path,
- # name of ansible playbook
- "ansible_tag": "%s@%s"
- % (controller_image.image.name, controller_image.controller.name),
- }
-
- return image_fields
-
- def map_sync_outputs(self, controller_image, res):
- image_id = res[0]["id"]
- controller_image.glance_image_id = image_id
- controller_image.backend_status = "1 - OK"
- controller_image.save()
diff --git a/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_networks.py b/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_networks.py
deleted file mode 100644
index 55dfe4e..0000000
--- a/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_networks.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright 2017-present Open Networking Foundation
-#
-# 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 os
-import base64
-import struct
-import socket
-from netaddr import IPAddress, IPNetwork
-from xossynchronizer.steps.syncstep import SyncStep
-
-class SyncControllerNetworks(SyncStep):
- requested_interval = 0
- observes = "ControllerNetwork"
- external_dependencies = ["User"]
- playbook = "sync_controller_networks.yaml"
-
- def fetch_pending(self, deleted):
- ci = self.model_accessor.ControllerNetwork()
- i = self.model_accessor.Network()
- i.name = "Lush Loss"
- s = self.model_accessor.Slice()
- s.name = "Ghastly Notebook"
- i.owner = s
- ci.i = i
- return [ci]
-
- def map_sync_outputs(self, controller_network, res):
- network_id = res[0]["network"]["id"]
- subnet_id = res[1]["subnet"]["id"]
- controller_network.net_id = network_id
- controller_network.subnet = self.cidr
- controller_network.subnet_id = subnet_id
- controller_network.backend_status = "1 - OK"
- if not controller_network.segmentation_id:
- controller_network.segmentation_id = str(
- self.get_segmentation_id(controller_network)
- )
- controller_network.save()
-
- def map_sync_inputs(self, controller_network):
- pass
-
- def map_delete_inputs(self, controller_network):
- network_fields = {"endpoint": None, "delete": True}
-
- return network_fields
diff --git a/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_site_privileges.py b/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_site_privileges.py
deleted file mode 100644
index e286ef8..0000000
--- a/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_site_privileges.py
+++ /dev/null
@@ -1,105 +0,0 @@
-# Copyright 2017-present Open Networking Foundation
-#
-# 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 os
-import base64
-import json
-from xossynchronizer.steps.syncstep import SyncStep
-
-class SyncControllerSitePrivileges(SyncStep):
- requested_interval = 0
- observes = "ControllerSitePrivilege"
- playbook = "sync_controller_users.yaml"
-
- def map_sync_inputs(self, controller_site_privilege):
- controller_register = json.loads(
- controller_site_privilege.controller.backend_register
- )
- if not controller_site_privilege.controller.admin_user:
- return
-
- roles = [controller_site_privilege.site_privilege.role.role]
- # setup user home site roles at controller
- if not controller_site_privilege.site_privilege.user.site:
- raise Exception(
- "Siteless user %s" % controller_site_privilege.site_privilege.user.email
- )
- else:
- # look up tenant id for the user's site at the controller
- # ctrl_site_deployments = SiteDeployment.objects.filter(
- # site_deployment__site=controller_site_privilege.user.site,
- # controller=controller_site_privilege.controller)
-
- # if ctrl_site_deployments:
- # # need the correct tenant id for site at the controller
- # tenant_id = ctrl_site_deployments[0].tenant_id
- # tenant_name = ctrl_site_deployments[0].site_deployment.site.login_base
- user_fields = {
- "endpoint": controller_site_privilege.controller.auth_url,
- "endpoint_v3": controller_site_privilege.controller.auth_url_v3,
- "domain": controller_site_privilege.controller.domain,
- "name": controller_site_privilege.site_privilege.user.email,
- "email": controller_site_privilege.site_privilege.user.email,
- "password": controller_site_privilege.site_privilege.user.remote_password,
- "admin_user": controller_site_privilege.controller.admin_user,
- "admin_password": controller_site_privilege.controller.admin_password,
- "ansible_tag": "%s@%s"
- % (
- controller_site_privilege.site_privilege.user.email.replace(
- "@", "-at-"
- ),
- controller_site_privilege.controller.name,
- ),
- "admin_tenant": controller_site_privilege.controller.admin_tenant,
- "roles": roles,
- "tenant": controller_site_privilege.site_privilege.site.login_base,
- }
-
- return user_fields
-
- def map_sync_outputs(self, controller_site_privilege, res):
- # results is an array in which each element corresponds to an
- # "ok" string received per operation. If we get as many oks as
- # the number of operations we issued, that means a grand success.
- # Otherwise, the number of oks tell us which operation failed.
- controller_site_privilege.role_id = res[0]["id"]
- controller_site_privilege.save()
-
- def delete_record(self, controller_site_privilege):
- controller_register = json.loads(
- controller_site_privilege.controller.backend_register
- )
- if controller_register.get("disabled", False):
- raise InnocuousException(
- "Controller %s is disabled" % controller_site_privilege.controller.name
- )
-
- if controller_site_privilege.role_id:
- driver = self.driver.admin_driver(
- controller=controller_site_privilege.controller
- )
- user = ControllerUser.objects.get(
- controller=controller_site_privilege.controller,
- user=controller_site_privilege.site_privilege.user,
- )
- site = ControllerSite.objects.get(
- controller=controller_site_privilege.controller,
- user=controller_site_privilege.site_privilege.user,
- )
- driver.delete_user_role(
- user.kuser_id,
- site.tenant_id,
- controller_site_privilege.site_prvilege.role.role,
- )
diff --git a/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_sites.py b/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_sites.py
deleted file mode 100644
index 24aa76f..0000000
--- a/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_sites.py
+++ /dev/null
@@ -1,86 +0,0 @@
-# Copyright 2017-present Open Networking Foundation
-#
-# 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 os
-import base64
-import json
-from xossynchronizer.steps.syncstep import SyncStep
-
-class SyncControllerSites(SyncStep):
- requested_interval = 0
- observes = "ControllerSite"
- playbook = "sync_controller_sites.yaml"
-
- def fetch_pending(self, deleted=False):
- lobjs = super(SyncControllerSites, self).fetch_pending(deleted)
-
- if not deleted:
- # filter out objects with null controllers
- lobjs = [x for x in lobjs if x.controller]
-
- return lobjs
-
- def map_sync_inputs(self, controller_site):
- tenant_fields = {
- "endpoint": controller_site.controller.auth_url,
- "endpoint_v3": controller_site.controller.auth_url_v3,
- "domain": controller_site.controller.domain,
- "admin_user": controller_site.controller.admin_user,
- "admin_password": controller_site.controller.admin_password,
- "admin_tenant": controller_site.controller.admin_tenant,
- # name of ansible playbook
- "ansible_tag": "%s@%s"
- % (controller_site.site.login_base, controller_site.controller.name),
- "tenant": controller_site.site.login_base,
- "tenant_description": controller_site.site.name,
- }
- return tenant_fields
-
- def map_sync_outputs(self, controller_site, res):
- controller_site.tenant_id = res[0]["id"]
- controller_site.backend_status = "1 - OK"
- controller_site.save()
-
- def delete_record(self, controller_site):
- controller_register = json.loads(controller_site.controller.backend_register)
- if controller_register.get("disabled", False):
- raise InnocuousException(
- "Controller %s is disabled" % controller_site.controller.name
- )
-
- if controller_site.tenant_id:
- driver = self.driver.admin_driver(controller=controller_site.controller)
- driver.delete_tenant(controller_site.tenant_id)
-
- """
- Ansible does not support tenant deletion yet
-
- import pdb
- pdb.set_trace()
- template = os_template_env.get_template('delete_controller_sites.yaml')
- tenant_fields = {'endpoint':controller_site.controller.auth_url,
- 'admin_user': controller_site.controller.admin_user,
- 'admin_password': controller_site.controller.admin_password,
- 'admin_tenant': 'admin',
- 'ansible_tag': 'controller_sites/%s@%s'%(controller_site.controller_site.site.login_base,controller_site.controller_site.deployment.name), # name of ansible playbook
- 'tenant': controller_site.controller_site.site.login_base,
- 'delete': True}
-
- rendered = template.render(tenant_fields)
- res = run_template('sync_controller_sites.yaml', tenant_fields)
-
- if (len(res)!=1):
- raise Exception('Could not assign roles for user %s'%tenant_fields['tenant'])
- """
diff --git a/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_slice_privileges.py b/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_slice_privileges.py
deleted file mode 100644
index 09b63e6..0000000
--- a/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_slice_privileges.py
+++ /dev/null
@@ -1,93 +0,0 @@
-# Copyright 2017-present Open Networking Foundation
-#
-# 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 os
-import base64
-import json
-from xossynchronizer.steps.syncstep import SyncStep
-
-class SyncControllerSlicePrivileges(SyncStep):
- requested_interval = 0
- observes = "ControllerSlicePrivilege"
- playbook = "sync_controller_users.yaml"
-
- def map_sync_inputs(self, controller_slice_privilege):
- if not controller_slice_privilege.controller.admin_user:
- return
-
- template = os_template_env.get_template("sync_controller_users.yaml")
- roles = [controller_slice_privilege.slice_privilege.role.role]
- # setup user home slice roles at controller
- if not controller_slice_privilege.slice_privilege.user.site:
- raise Exception(
- "Sliceless user %s"
- % controller_slice_privilege.slice_privilege.user.email
- )
- else:
- user_fields = {
- "endpoint": controller_slice_privilege.controller.auth_url,
- "endpoint_v3": controller_slice_privilege.controller.auth_url_v3,
- "domain": controller_slice_privilege.controller.domain,
- "name": controller_slice_privilege.slice_privilege.user.email,
- "email": controller_slice_privilege.slice_privilege.user.email,
- "password": controller_slice_privilege.slice_privilege.user.remote_password,
- "admin_user": controller_slice_privilege.controller.admin_user,
- "admin_password": controller_slice_privilege.controller.admin_password,
- "ansible_tag": "%s@%s@%s"
- % (
- controller_slice_privilege.slice_privilege.user.email.replace(
- "@", "-at-"
- ),
- controller_slice_privilege.slice_privilege.slice.name,
- controller_slice_privilege.controller.name,
- ),
- "admin_tenant": controller_slice_privilege.controller.admin_tenant,
- "roles": roles,
- "tenant": controller_slice_privilege.slice_privilege.slice.name,
- }
- return user_fields
-
- def map_sync_outputs(self, controller_slice_privilege, res):
- controller_slice_privilege.role_id = res[0]["id"]
- controller_slice_privilege.save()
-
- def delete_record(self, controller_slice_privilege):
- controller_register = json.loads(
- controller_slice_privilege.controller.backend_register
- )
- if controller_register.get("disabled", False):
- raise InnocuousException(
- "Controller %s is disabled" % controller_slice_privilege.controller.name
- )
-
- if controller_slice_privilege.role_id:
- driver = self.driver.admin_driver(
- controller=controller_slice_privilege.controller
- )
- user = ControllerUser.objects.filter(
- controller_id=controller_slice_privilege.controller.id,
- user_id=controller_slice_privilege.slice_privilege.user.id,
- )
- user = user[0]
- slice = ControllerSlice.objects.filter(
- controller_id=controller_slice_privilege.controller.id,
- user_id=controller_slice_privilege.slice_privilege.user.id,
- )
- slice = slice[0]
- driver.delete_user_role(
- user.kuser_id,
- slice.tenant_id,
- controller_slice_privilege.slice_prvilege.role.role,
- )
diff --git a/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_slices.py b/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_slices.py
deleted file mode 100644
index 31c62f1..0000000
--- a/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_slices.py
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2017-present Open Networking Foundation
-#
-# 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 os
-import base64
-from xossynchronizer.steps.syncstep import DeferredException
-from xossynchronizer.steps.ansiblesyncstep import AnsibleSyncStep
-
-class SyncControllerSlices(AnsibleSyncStep):
- requested_interval = 0
- observes = "ControllerSlice"
- playbook = "sync_controller_slices.yaml"
-
- def map_sync_inputs(self, controller_slice):
- if getattr(controller_slice, "force_fail", None):
- raise Exception("Forced failure")
- elif getattr(controller_slice, "force_defer", None):
- raise DeferredException("Forced defer")
-
- tenant_fields = {"endpoint": "endpoint", "name": "Flagrant Haircut"}
-
- return tenant_fields
-
- def map_sync_outputs(self, controller_slice, res):
- controller_slice.save()
-
- def map_delete_inputs(self, controller_slice):
- tenant_fields = {
- "endpoint": "endpoint",
- "name": "Conscientious Plastic",
- "delete": True,
- }
- return tenant_fields
diff --git a/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_users.py b/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_users.py
deleted file mode 100644
index a039257..0000000
--- a/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_controller_users.py
+++ /dev/null
@@ -1,70 +0,0 @@
-# Copyright 2017-present Open Networking Foundation
-#
-# 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 os
-import base64
-from xossynchronizer.steps.syncstep import SyncStep
-
-
-class SyncControllerUsers(SyncStep):
- requested_interval = 0
- observes = "ControllerUser"
- playbook = "sync_controller_users.yaml"
-
- def map_sync_inputs(self, controller_user):
- if not controller_user.controller.admin_user:
- return
-
- # All users will have at least the 'user' role at their home site/tenant.
- # We must also check if the user should have the admin role
-
- roles = ["user"]
- if controller_user.user.is_admin:
- driver = self.driver.admin_driver(controller=controller_user.controller)
- roles.append(driver.get_admin_role().name)
-
- # setup user home site roles at controller
- if not controller_user.user.site:
- raise Exception("Siteless user %s" % controller_user.user.email)
- else:
- user_fields = {
- "endpoint": controller_user.controller.auth_url,
- "endpoint_v3": controller_user.controller.auth_url_v3,
- "domain": controller_user.controller.domain,
- "name": controller_user.user.email,
- "email": controller_user.user.email,
- "password": controller_user.user.remote_password,
- "admin_user": controller_user.controller.admin_user,
- "admin_password": controller_user.controller.admin_password,
- "ansible_tag": "%s@%s"
- % (
- controller_user.user.email.replace("@", "-at-"),
- controller_user.controller.name,
- ),
- "admin_project": controller_user.controller.admin_tenant,
- "roles": roles,
- "project": controller_user.user.site.login_base,
- }
- return user_fields
-
- def map_sync_outputs(self, controller_user, res):
- controller_user.kuser_id = res[0]["user"]["id"]
- controller_user.backend_status = "1 - OK"
- controller_user.save()
-
- def delete_record(self, controller_user):
- if controller_user.kuser_id:
- driver = self.driver.admin_driver(controller=controller_user.controller)
- driver.delete_user(controller_user.kuser_id)
diff --git a/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_instances.py b/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_instances.py
deleted file mode 100644
index 1a70884..0000000
--- a/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_instances.py
+++ /dev/null
@@ -1,59 +0,0 @@
-# Copyright 2017-present Open Networking Foundation
-#
-# 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 os
-from xossynchronizer.steps import ansiblesyncstep
-
-
-def escape(s):
- s = s.replace("\n", r"\n").replace('"', r"\"")
- return s
-
-
-class SyncInstances(ansiblesyncstep.AnsibleSyncStep):
- requested_interval = 0
- # This observes is intentionally a list of one string, to test steps where observes is a list of strings.
- observes = ["Instance"]
- playbook = "sync_instances.yaml"
-
- def fetch_pending(self, deletion=False):
- objs = super(SyncInstances, self).fetch_pending(deletion)
- objs = [x for x in objs if x.isolation == "vm"]
- return objs
-
- def map_sync_inputs(self, instance):
- inputs = {}
- metadata_update = {}
-
- fields = {"name": instance.name, "delete": False}
- return fields
-
- def map_sync_outputs(self, instance, res):
- instance.save()
-
- def map_delete_inputs(self, instance):
- input = {
- "endpoint": "endpoint",
- "admin_user": "admin_user",
- "admin_password": "admin_password",
- "project_name": "project_name",
- "tenant": "tenant",
- "tenant_description": "tenant_description",
- "name": instance.name,
- "ansible_tag": "ansible_tag",
- "delete": True,
- }
-
- return input
diff --git a/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_roles.py b/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_roles.py
deleted file mode 100644
index 1bd2d0f..0000000
--- a/lib/xos-synchronizer/xos-synchronizer-tests/test_steps/sync_roles.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright 2017-present Open Networking Foundation
-#
-# 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 os
-import base64
-from xossynchronizer.steps.syncstep import SyncStep
-from mock_modelaccessor import *
-
-
-class SyncRoles(SyncStep):
- requested_interval = 0
-
- # This observes is intentionally a list of three classes, to test steps where observes is a list of classes.
- observes = [SiteRole, SliceRole, ControllerRole]
-
- def sync_record(self, role):
- if not role.enacted:
- controllers = Controller.objects.all()
- for controller in controllers:
- driver = self.driver.admin_driver(controller=controller)
- driver.create_role(role.role)
- role.save()
diff --git a/lib/xos-synchronizer/xossynchronizer/model_policies/model_policy_tenantwithcontainer.py b/lib/xos-synchronizer/xossynchronizer/model_policies/model_policy_tenantwithcontainer.py
index 66ac348..3db1395 100644
--- a/lib/xos-synchronizer/xossynchronizer/model_policies/model_policy_tenantwithcontainer.py
+++ b/lib/xos-synchronizer/xossynchronizer/model_policies/model_policy_tenantwithcontainer.py
@@ -292,7 +292,6 @@
assert node is not None
assert desired_image is not None
assert tenant.creator is not None
- assert node.site_deployment.deployment is not None
assert flavor is not None
try:
@@ -301,7 +300,6 @@
node=node,
image=desired_image,
creator=tenant.creator,
- deployment=node.site_deployment.deployment,
flavor=flavor,
isolation=slice.default_isolation,
parent=parent,
diff --git a/lib/xos-synchronizer/xossynchronizer/synchronizer.py b/lib/xos-synchronizer/xossynchronizer/synchronizer.py
index 30d3ca0..f204785 100644
--- a/lib/xos-synchronizer/xossynchronizer/synchronizer.py
+++ b/lib/xos-synchronizer/xossynchronizer/synchronizer.py
@@ -33,8 +33,7 @@
wait = False
while not models_active:
try:
- _i = self.model_accessor.Instance.objects.first()
- _n = self.model_accessor.NetworkTemplate.objects.first()
+ _i = self.model_accessor.Site.objects.first()
models_active = True
except Exception as e:
self.log.info("Exception", e=e)