Merge pull request #755 from dod-ccpo/application-role-seeds

ApplicationRoles seed and domain
This commit is contained in:
George Drummond 2019-04-11 15:51:27 -04:00 committed by GitHub
commit 25c1490afb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 194 additions and 37 deletions

View File

@ -0,0 +1,22 @@
from atst.database import db
from atst.models.application_role import ApplicationRole
from atst.domain.permission_sets import PermissionSets
class ApplicationRoles(object):
@classmethod
def _permission_sets_for_names(cls, set_names):
return PermissionSets.get_many(set_names)
@classmethod
def create(cls, user, application, permission_set_names):
application_role = ApplicationRole(user=user, application_id=application.id)
application_role.permission_sets = ApplicationRoles._permission_sets_for_names(
permission_set_names
)
db.session.add(application_role)
db.session.commit()
return application_role

View File

@ -7,7 +7,10 @@ from atst.models import Base, types, mixins
class CSPRole(Enum):
NONSENSE_ROLE = "nonsense_role"
BASIC_ACCESS = "Basic Access"
NETWORK_ADMIN = "Network Admin"
BUSINESS_READ = "Business Read-only"
TECHNICAL_READ = "Technical Read-only"
class EnvironmentRole(Base, mixins.TimestampsMixin, mixins.AuditableMixin):

View File

@ -1,32 +1,36 @@
# Add root application dir to the python path
import os
import sys
from datetime import datetime, timedelta, date
from datetime import timedelta, date
import random
from faker import Faker
parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
sys.path.append(parent_dir)
from atst.database import db
from atst.app import make_config, make_app
from atst.domain.users import Users
from atst.domain.portfolios import Portfolios
from atst.database import db
from atst.domain.application_roles import ApplicationRoles
from atst.domain.applications import Applications
from atst.domain.csp.reports import MockReportingProvider
from atst.domain.environments import Environments
from atst.domain.exceptions import AlreadyExistsError, NotFoundError
from atst.domain.permission_sets import PermissionSets, APPLICATION_PERMISSION_SETS
from atst.domain.portfolio_roles import PortfolioRoles
from atst.models.invitation import Status as InvitationStatus
from atst.domain.exceptions import AlreadyExistsError
from atst.domain.environment_roles import EnvironmentRoles
from atst.domain.portfolios import Portfolios
from atst.domain.users import Users
from atst.models.application import Application
from atst.models.environment_role import CSPRole
from atst.routes.dev import _DEV_USERS as DEV_USERS
from tests.factories import (
InvitationFactory,
TaskOrderFactory,
random_future_date,
random_past_date,
random_task_order_number,
random_service_branch,
)
from atst.routes.dev import _DEV_USERS as DEV_USERS
from atst.domain.csp.reports import MockReportingProvider
from atst.models.application import Application
from atst.domain.environments import Environments
fake = Faker()
PORTFOLIO_USERS = [
@ -34,7 +38,6 @@ PORTFOLIO_USERS = [
"first_name": "Danny",
"last_name": "Knight",
"email": "knight@mil.gov",
"portfolio_role": "developer",
"dod_id": "0000000001",
"permission_sets": PortfolioRoles.DEFAULT_PORTFOLIO_PERMISSION_SETS,
},
@ -42,7 +45,6 @@ PORTFOLIO_USERS = [
"first_name": "Mario",
"last_name": "Hudson",
"email": "hudson@mil.gov",
"portfolio_role": "billing_auditor",
"dod_id": "0000000002",
"permission_sets": PortfolioRoles.DEFAULT_PORTFOLIO_PERMISSION_SETS,
},
@ -50,13 +52,89 @@ PORTFOLIO_USERS = [
"first_name": "Louise",
"last_name": "Greer",
"email": "greer@mil.gov",
"portfolio_role": "admin",
"dod_id": "0000000003",
"permission_sets": PortfolioRoles.DEFAULT_PORTFOLIO_PERMISSION_SETS,
},
]
APPLICATION_USERS = [
{
"first_name": "Jean Luc",
"last_name": "Picard",
"email": "picard@mil.gov",
"dod_id": "0000000004",
"permission_sets": random.sample(
APPLICATION_PERMISSION_SETS, k=random.randint(1, 4)
),
},
{
"first_name": "()",
"last_name": "Spock",
"email": "spock@mil.gov",
"dod_id": "0000000005",
"permission_sets": random.sample(
APPLICATION_PERMISSION_SETS, k=random.randint(1, 4)
),
},
{
"first_name": "William",
"last_name": "Shatner",
"email": "shatner@mil.gov",
"dod_id": "0000000006",
"permission_sets": random.sample(
APPLICATION_PERMISSION_SETS, k=random.randint(1, 4)
),
},
{
"first_name": "Nyota",
"last_name": "Uhura",
"email": "uhura@mil.gov",
"dod_id": "0000000007",
"permission_sets": random.sample(
APPLICATION_PERMISSION_SETS, k=random.randint(1, 4)
),
},
{
"first_name": "Kathryn",
"last_name": "Janeway",
"email": "janeway@mil.gov",
"dod_id": "0000000008",
"permission_sets": random.sample(
APPLICATION_PERMISSION_SETS, k=random.randint(1, 4)
),
},
]
SHIP_NAMES = [
"Millenium Falcon",
"Star Destroyer",
"Attack Cruiser",
"Sith Infiltrator",
"Death Star",
"Lambda Shuttle",
"Corellian Corvette",
]
SOFTWARE_WORDS = [
"Enterprise",
"Scalable",
"Solution",
"Blockchain",
"Cloud",
"Micro",
"Macro",
"Software",
"Global",
"Team",
]
ENVIRONMENT_NAMES = ["production", "staging", "test", "uat", "dev", "qa"]
def get_users():
users = []
for dev_user in DEV_USERS.values():
@ -70,8 +148,8 @@ def get_users():
def add_members_to_portfolio(portfolio):
for portfolio_role in PORTFOLIO_USERS:
ws_role = Portfolios.create_member(portfolio, portfolio_role)
for user_data in PORTFOLIO_USERS:
ws_role = Portfolios.create_member(portfolio, user_data)
db.session.refresh(ws_role)
PortfolioRoles.enable(ws_role)
@ -114,15 +192,53 @@ def create_task_order(portfolio, start, end, clin_01=None, clin_03=None):
db.session.commit()
def add_applications_to_portfolio(portfolio, applications):
for application in applications:
Applications.create(
def random_applications():
return [
{
"name": fake.sentence(nb_words=3, ext_word_list=SOFTWARE_WORDS)[0:-1],
"description": fake.bs(),
"environments": random.sample(ENVIRONMENT_NAMES, k=random.randint(1, 4)),
}
for n in range(random.randint(1, 4))
]
def add_applications_to_portfolio(portfolio):
applications = random_applications()
for application_data in applications:
application = Applications.create(
portfolio=portfolio,
name=application["name"],
description=application["description"],
environment_names=application["environments"],
name=application_data["name"],
description=application_data["description"],
environment_names=application_data["environments"],
)
users = random.sample(APPLICATION_USERS, k=random.randint(1, 5))
for user_data in users:
try:
user = Users.get_by_dod_id(user_data["dod_id"])
except NotFoundError:
user = Users.create(
user_data["dod_id"],
None,
first_name=user_data["first_name"],
last_name=user_data["last_name"],
)
ApplicationRoles.create(
user=user,
application=application,
permission_set_names=[PermissionSets.EDIT_APPLICATION_TEAM],
)
user_environments = random.sample(
application.environments,
k=random.randint(1, len(application.environments)),
)
for env in user_environments:
role = random.choice([e.value for e in CSPRole])
EnvironmentRoles.create(user=user, environment=env, role=role)
def create_demo_portfolio(name, data):
try:
@ -156,13 +272,6 @@ def create_demo_portfolio(name, data):
def seed_db():
get_users()
amanda = Users.get_by_dod_id("2345678901")
application_info = [
{
"name": "First Application",
"description": "This is our first application",
"environments": ["dev", "staging", "prod"],
}
]
# Create Portfolios for Amanda with mocked reporting data
create_demo_portfolio("A-Wing", MockReportingProvider.REPORT_FIXTURE_MAP["A-Wing"])
@ -173,23 +282,26 @@ def seed_db():
)
add_task_orders_to_portfolio(tie_interceptor)
add_members_to_portfolio(tie_interceptor)
add_applications_to_portfolio(tie_interceptor, application_info)
add_applications_to_portfolio(tie_interceptor)
tie_fighter = Portfolios.create(
amanda, name="TIE Fighter", defense_component=random_service_branch()
)
add_task_orders_to_portfolio(tie_fighter)
add_members_to_portfolio(tie_fighter)
add_applications_to_portfolio(tie_fighter, application_info)
add_applications_to_portfolio(tie_fighter)
# create a portfolio 'Y-Wing' for each user
# create a portfolio for each user
ships = SHIP_NAMES.copy()
for user in get_users():
ship = random.choice(ships)
ships.remove(ship)
portfolio = Portfolios.create(
user, name="Y-Wing", defense_component=random_service_branch()
user, name=ship, defense_component=random_service_branch()
)
add_task_orders_to_portfolio(portfolio)
add_members_to_portfolio(portfolio)
add_applications_to_portfolio(portfolio, application_info)
add_applications_to_portfolio(portfolio)
if __name__ == "__main__":

View File

@ -0,0 +1,20 @@
from atst.domain.application_roles import ApplicationRoles
from atst.domain.permission_sets import PermissionSets
from tests.factories import UserFactory, ApplicationFactory
def test_create_application_role():
application = ApplicationFactory.create()
user = UserFactory.create()
application_role = ApplicationRoles.create(
application=application,
user=user,
permission_set_names=[PermissionSets.EDIT_APPLICATION_TEAM],
)
assert application_role.permission_sets == PermissionSets.get_many(
[PermissionSets.EDIT_APPLICATION_TEAM]
)
assert application_role.application == application
assert application_role.user == user