provision portfolio state machine
This commit is contained in:
38
tests/domain/test_portfolio_state_machine.py
Normal file
38
tests/domain/test_portfolio_state_machine.py
Normal file
@@ -0,0 +1,38 @@
|
||||
import pytest
|
||||
|
||||
from tests.factories import (
|
||||
PortfolioFactory,
|
||||
PortfolioStateMachineFactory,
|
||||
)
|
||||
|
||||
from atst.models import FSMStates
|
||||
|
||||
|
||||
@pytest.fixture(scope="function")
|
||||
def portfolio():
|
||||
portfolio = PortfolioFactory.create()
|
||||
return portfolio
|
||||
|
||||
def test_fsm_creation(portfolio):
|
||||
sm = PortfolioStateMachineFactory.create(portfolio=portfolio)
|
||||
assert sm.portfolio
|
||||
|
||||
def test_fsm_transition_start(portfolio):
|
||||
sm = PortfolioStateMachineFactory.create(portfolio=portfolio)
|
||||
assert sm.portfolio
|
||||
assert sm.state == FSMStates.UNSTARTED
|
||||
|
||||
# next_state does not create the trigger callbacks !!!
|
||||
#sm.next_state()
|
||||
|
||||
sm.init()
|
||||
assert sm.state == FSMStates.STARTING
|
||||
|
||||
sm.start()
|
||||
assert sm.state == FSMStates.STARTED
|
||||
#import ipdb;ipdb.set_trace()
|
||||
sm.create_tenant(a=1, b=2)
|
||||
assert sm.state == FSMStates.TENANT_CREATED
|
||||
|
||||
|
||||
|
@@ -1,5 +1,4 @@
|
||||
import pytest
|
||||
import random
|
||||
from uuid import uuid4
|
||||
|
||||
from atst.domain.exceptions import NotFoundError, UnauthorizedError
|
||||
@@ -15,6 +14,7 @@ from atst.domain.environments import Environments
|
||||
from atst.domain.permission_sets import PermissionSets, PORTFOLIO_PERMISSION_SETS
|
||||
from atst.models.application_role import Status as ApplicationRoleStatus
|
||||
from atst.models.portfolio_role import Status as PortfolioRoleStatus
|
||||
from atst.models import FSMStates
|
||||
|
||||
from tests.factories import (
|
||||
ApplicationFactory,
|
||||
@@ -22,6 +22,7 @@ from tests.factories import (
|
||||
UserFactory,
|
||||
PortfolioRoleFactory,
|
||||
PortfolioFactory,
|
||||
PortfolioStateMachineFactory,
|
||||
get_all_portfolio_permission_sets,
|
||||
)
|
||||
|
||||
@@ -98,7 +99,7 @@ def test_scoped_portfolio_returns_all_applications_for_portfolio_admin(
|
||||
Applications.create(
|
||||
portfolio.owner,
|
||||
portfolio,
|
||||
"My Application %s" % (random.randrange(1, 1000)),
|
||||
"My Application",
|
||||
"My application",
|
||||
["dev", "staging", "prod"],
|
||||
)
|
||||
@@ -121,7 +122,7 @@ def test_scoped_portfolio_returns_all_applications_for_portfolio_owner(
|
||||
Applications.create(
|
||||
portfolio.owner,
|
||||
portfolio,
|
||||
"My Application %s" % (random.randrange(1, 1000)),
|
||||
"My Application",
|
||||
"My application",
|
||||
["dev", "staging", "prod"],
|
||||
)
|
||||
@@ -254,3 +255,17 @@ def test_for_user_does_not_include_deleted_application_roles():
|
||||
status=ApplicationRoleStatus.ACTIVE, user=user2, application=app, deleted=True
|
||||
)
|
||||
assert len(Portfolios.for_user(user2)) == 0
|
||||
|
||||
def test_create_state_machine(portfolio):
|
||||
fsm = Portfolios.create_state_machine(portfolio)
|
||||
assert fsm
|
||||
|
||||
def test_get_portfolios_pending_provisioning(session):
|
||||
for x in range(5):
|
||||
portfolio = PortfolioFactory.create()
|
||||
sm = PortfolioStateMachineFactory.create(portfolio=portfolio)
|
||||
if x == 2: sm.state = FSMStates.COMPLETED
|
||||
assert len(Portfolios.get_portfolios_pending_provisioning()) == 4
|
||||
|
||||
|
||||
|
||||
|
@@ -342,3 +342,16 @@ class NotificationRecipientFactory(Base):
|
||||
model = NotificationRecipient
|
||||
|
||||
email = factory.Faker("email")
|
||||
|
||||
class PortfolioStateMachineFactory(Base):
|
||||
class Meta:
|
||||
model = PortfolioStateMachine
|
||||
|
||||
portfolio = factory.SubFactory(PortfolioFactory)
|
||||
|
||||
@classmethod
|
||||
def _create(cls, model_class, *args, **kwargs):
|
||||
portfolio = kwargs.pop("portfolio", PortfolioFactory.create())
|
||||
kwargs.update({'portfolio': portfolio})
|
||||
fsm = super()._create(model_class, *args, **kwargs)
|
||||
return fsm
|
||||
|
@@ -5,16 +5,18 @@ from unittest.mock import Mock
|
||||
from threading import Thread
|
||||
|
||||
from atst.domain.csp.cloud import MockCloudProvider
|
||||
from atst.domain.portfolios import Portfolios
|
||||
|
||||
from atst.jobs import (
|
||||
RecordEnvironmentFailure,
|
||||
RecordEnvironmentRoleFailure,
|
||||
do_create_environment,
|
||||
do_create_atat_admin_user,
|
||||
dispatch_create_environment,
|
||||
dispatch_create_atat_admin_user,
|
||||
create_environment,
|
||||
dispatch_provision_portfolio,
|
||||
dispatch_provision_user,
|
||||
create_environment,
|
||||
do_provision_user,
|
||||
do_provision_portfolio,
|
||||
)
|
||||
from atst.models.utils import claim_for_update
|
||||
from atst.domain.exceptions import ClaimFailedException
|
||||
@@ -22,6 +24,7 @@ from tests.factories import (
|
||||
EnvironmentFactory,
|
||||
EnvironmentRoleFactory,
|
||||
PortfolioFactory,
|
||||
PortfolioStateMachineFactory,
|
||||
ApplicationRoleFactory,
|
||||
)
|
||||
from atst.models import CSPRole, EnvironmentRole, ApplicationRoleStatus
|
||||
@@ -31,6 +34,11 @@ from atst.models import CSPRole, EnvironmentRole, ApplicationRoleStatus
|
||||
def csp():
|
||||
return Mock(wraps=MockCloudProvider({}, with_delay=False, with_failure=False))
|
||||
|
||||
@pytest.fixture(scope="function")
|
||||
def portfolio():
|
||||
portfolio = PortfolioFactory.create()
|
||||
return portfolio
|
||||
|
||||
|
||||
def test_environment_job_failure(celery_app, celery_worker):
|
||||
@celery_app.task(bind=True, base=RecordEnvironmentFailure)
|
||||
@@ -248,6 +256,7 @@ def test_claim_for_update(session):
|
||||
|
||||
|
||||
def test_dispatch_provision_user(csp, session, celery_app, celery_worker, monkeypatch):
|
||||
|
||||
# Given that I have four environment roles:
|
||||
# (A) one of which has a completed status
|
||||
# (B) one of which has an environment that has not been provisioned
|
||||
@@ -306,3 +315,22 @@ def test_do_provision_user(csp, session):
|
||||
)
|
||||
# I expect that the EnvironmentRole now has a csp_user_id
|
||||
assert environment_role.csp_user_id
|
||||
|
||||
def test_dispatch_provision_portfolio(csp, session, portfolio, celery_app, celery_worker, monkeypatch):
|
||||
sm = PortfolioStateMachineFactory.create(portfolio=portfolio)
|
||||
mock = Mock()
|
||||
monkeypatch.setattr("atst.jobs.provision_portfolio", mock)
|
||||
dispatch_provision_portfolio.run()
|
||||
mock.delay.assert_called_once_with(portfolio_id=portfolio.id)
|
||||
|
||||
def test_do_provision_portfolio(csp, session, portfolio):
|
||||
do_provision_portfolio(csp=csp, portfolio_id=portfolio.id)
|
||||
session.refresh(portfolio)
|
||||
assert portfolio.state_machine
|
||||
|
||||
def test_provision_portfolio_create_tenant(csp, session, portfolio, celery_app, celery_worker, monkeypatch):
|
||||
sm = PortfolioStateMachineFactory.create(portfolio=portfolio)
|
||||
#mock = Mock()
|
||||
#monkeypatch.setattr("atst.jobs.provision_portfolio", mock)
|
||||
#dispatch_provision_portfolio.run()
|
||||
#mock.delay.assert_called_once_with(portfolio_id=portfolio.id)
|
||||
|
Reference in New Issue
Block a user