Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SDK Quota Support #3102

Merged
merged 52 commits into from
Sep 7, 2019
Merged
Show file tree
Hide file tree
Changes from 44 commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
0a2efd4
Add initial scaffolding to support configurable roles.
kaiwalyajoshi Jun 12, 2019
a7a2673
Add fix missing header for conditional mustache entry.
kaiwalyajoshi Jun 12, 2019
b1aa781
Add support for configureable roles. (#3103)
kaiwalyajoshi Jun 13, 2019
0e5827e
[WIP] Add support for scheduler upgrades with new role. (#3112)
kaiwalyajoshi Jul 8, 2019
958d600
[WIP] SDK - Change Roles via Pod-Replace (#3124)
kaiwalyajoshi Jul 9, 2019
cce2393
Fix previous merge issue, remove fixRoleChange.
kaiwalyajoshi Jul 9, 2019
473643c
[WIP] SI Tests for Quota migration (#3126)
kaiwalyajoshi Jul 9, 2019
495fb2d
Merge branch 'master' into sdk-quota
kaiwalyajoshi Jul 11, 2019
4ec2788
Fix issues reported from pre-commit-hook black.
kaiwalyajoshi Jul 11, 2019
49877fc
SDK-Quota: Configure roles via Mesos and Marathon env-vars. (#3127)
kaiwalyajoshi Jul 15, 2019
a07ce40
Bump libmesos bundle to libmesos-bundle-1.14-alpha.tar.gz
kaiwalyajoshi Jul 19, 2019
19daf25
Update how service groups are detected, use sanitized name.
kaiwalyajoshi Jul 23, 2019
5b1ca5f
Fix formatting errors from Black pre-commit hook
kaiwalyajoshi Jul 23, 2019
41c5f75
Update env-var from MARATHON_ENFORCE_GROUP_ROLE to MARATHON_APP_ENFOR…
kaiwalyajoshi Jul 23, 2019
89acbc7
Merge branch 'master' into sdk-quota to resolve conflicts found by to…
kaiwalyajoshi Jul 23, 2019
88d7497
Fix bug in use of service roles.
kaiwalyajoshi Jul 24, 2019
50af795
Remove toggle for MARATHON_APP_ENFORCE_GROUP_ROLE from service config…
kaiwalyajoshi Jul 24, 2019
167e251
Update sdk/scheduler/src/main/java/com/mesosphere/sdk/specification/D…
kaiwalyajoshi Jul 25, 2019
a966f8c
Update sdk/scheduler/src/main/java/com/mesosphere/sdk/specification/D…
kaiwalyajoshi Jul 25, 2019
cc90154
Update sdk/scheduler/src/main/java/com/mesosphere/sdk/config/validate…
kaiwalyajoshi Jul 25, 2019
a20e93b
Update sdk/scheduler/src/main/java/com/mesosphere/sdk/scheduler/Sched…
kaiwalyajoshi Jul 25, 2019
0607ff9
Update sdk/scheduler/src/main/java/com/mesosphere/sdk/framework/Frame…
kaiwalyajoshi Jul 25, 2019
38575bb
Apply suggestions from code review
kaiwalyajoshi Jul 25, 2019
01e4537
Fix JavaDoc comment issue.
kaiwalyajoshi Jul 27, 2019
e2ec3e7
Add support for user specified roles.
kaiwalyajoshi Jul 27, 2019
bf5cf7a
Update javadoc on role filtering.
kaiwalyajoshi Jul 31, 2019
c0a3a1b
Cleanup from PR review.
kaiwalyajoshi Jul 31, 2019
e1a984e
Remove unused and obsolete config settings for quota from Cassandra.
kaiwalyajoshi Jul 31, 2019
3b5900e
Use Tarun's excellent refacotring suggestions.
kaiwalyajoshi Aug 1, 2019
0365f0f
Fix unused imports and indentation issues.
kaiwalyajoshi Aug 1, 2019
8309518
SDK-Quota: Quota Migration Mode and more downgrade tests. (#3166)
kaiwalyajoshi Aug 26, 2019
951dc0c
Fix pre-commit formatting issues.
kaiwalyajoshi Aug 26, 2019
3d36428
Keep recovery timeout consistent with other tests.
kaiwalyajoshi Aug 26, 2019
561b5dd
Add fixes for strict-mode clusters. (#3169)
kaiwalyajoshi Aug 27, 2019
7936632
Fix black pre-commit failures.
kaiwalyajoshi Aug 27, 2019
c360dd2
Tooling bugfix, only uninstall current service-name.
kaiwalyajoshi Aug 27, 2019
6bf2e88
Temporarily disable deployment tests. (These are covered by integrati…
kaiwalyajoshi Aug 27, 2019
f05c548
Remove intermediate folder when setting enforceRole settings.
kaiwalyajoshi Aug 28, 2019
6570d0d
Seperate quota related tests to use seperate marathon group.
kaiwalyajoshi Aug 28, 2019
69c0ed8
Rename to
kaiwalyajoshi Aug 30, 2019
d5f1da4
Rename quota_migration_mode to enable_role_migration
kaiwalyajoshi Aug 31, 2019
162558a
Add missing legacy role permissions.
kaiwalyajoshi Aug 31, 2019
70e0407
Fix black formatting issues.
kaiwalyajoshi Aug 31, 2019
ae576f1
SDK Quota: Isolate and fix SI failures (#3174)
kaiwalyajoshi Sep 4, 2019
8f64279
Apply suggestions from Tarun's code-review.
kaiwalyajoshi Sep 6, 2019
a3b8b4e
Merge branch 'master' into sdk-quota
kaiwalyajoshi Sep 6, 2019
5023c8a
Fix compile error from merge-conflict.
kaiwalyajoshi Sep 6, 2019
ae4f848
Address code-review suggestions for the scheduler.
kaiwalyajoshi Sep 6, 2019
9654d29
Address code-review suggestions for tooling and testing.
kaiwalyajoshi Sep 6, 2019
8d42213
Fix black formatting issues.
kaiwalyajoshi Sep 6, 2019
d45b44d
Update Mesos to 1.9.0 and libmesos-bundle to 1.14-beta.
kaiwalyajoshi Sep 6, 2019
d74153a
Merge branch 'master' into sdk-quota
kaiwalyajoshi Sep 7, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -99,11 +99,12 @@ private static void runSingleYamlService(
throws Exception
{
RawServiceSpec rawServiceSpec = RawServiceSpec.newBuilder(yamlFile).build();
Optional<String> serviceNamespace = schedulerConfig.getServiceNamespace();
ServiceSpec serviceSpec = DefaultServiceSpec
.newGenerator(rawServiceSpec, schedulerConfig, yamlFile.getParentFile())
.build();
Persister persister =
getPersister(schedulerConfig, FrameworkConfig.fromServiceSpec(serviceSpec));
getPersister(schedulerConfig, FrameworkConfig.fromServiceSpec(serviceSpec, serviceNamespace));
SchedulerBuilder builder = DefaultScheduler
.newBuilder(serviceSpec, schedulerConfig, persister)
.setPlansFrom(rawServiceSpec);
Expand Down
340 changes: 340 additions & 0 deletions frameworks/helloworld/tests/test_quota_deployment.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,340 @@
import logging

import pytest
import sdk_install
import sdk_plan
import sdk_marathon
import sdk_utils
from tests import config

log = logging.getLogger(__name__)

ENFORCED_ROLE = "quota"
SERVICE_NAME = "/{}/hello-world".format(ENFORCED_ROLE)
LEGACY_ROLE = "{}-role".format(SERVICE_NAME.strip("/").replace("/", "__"))

RECOVERY_TIMEOUT_SECONDS = 20 * 60

# This test does a fresh install of a new service and verifies that role
# creation was correctly done.
kaiwalyajoshi marked this conversation as resolved.
Show resolved Hide resolved
@pytest.fixture(autouse=True)
def configure_package(configure_security):
try:
sdk_install.uninstall(config.PACKAGE_NAME, SERVICE_NAME)
yield # let the test session execute
finally:
sdk_install.uninstall(config.PACKAGE_NAME, SERVICE_NAME)
sdk_marathon.delete_group(group_id=ENFORCED_ROLE)


@pytest.mark.quota
@pytest.mark.dcos_min_version("1.14")
@pytest.mark.sanity
def test_nonenforced_group_role_defaults():

# Create group without enforced roles.
sdk_marathon.create_group(group_id=ENFORCED_ROLE, options={"enforceRole": False})
options = {"service": {"name": SERVICE_NAME}}

# this config produces 1 hello's + 2 world's:
sdk_install.install(config.PACKAGE_NAME, SERVICE_NAME, 3, additional_options=options)

# Ensure that our default service installs to a complete deployment.
sdk_plan.wait_for_completed_deployment(SERVICE_NAME)

# Assert the deployment plans are complete.
deployment_plan = sdk_plan.get_deployment_plan(SERVICE_NAME)
assert deployment_plan["status"] == "COMPLETE"

# Get the current service state to verify roles have applied.
service_roles = sdk_utils.get_service_roles(SERVICE_NAME)
current_task_roles = service_roles["task-roles"]

# We must have some role!
assert len(current_task_roles) > 0

assert LEGACY_ROLE in current_task_roles.values()
assert ENFORCED_ROLE not in current_task_roles.values()

assert service_roles["framework-roles"] is None
assert service_roles["framework-role"] == LEGACY_ROLE


@pytest.mark.quota
@pytest.mark.dcos_min_version("1.14")
@pytest.mark.sanity
def test_nonenforced_group_role_service_role_set():

# Create group without enforced roles.
sdk_marathon.create_group(group_id=ENFORCED_ROLE, options={"enforceRole": False})
options = {"service": {"name": SERVICE_NAME, "role": ENFORCED_ROLE}}

# this config produces 1 hello's + 2 world's:
sdk_install.install(config.PACKAGE_NAME, SERVICE_NAME, 3, additional_options=options)

# Ensure that our default service installs to a complete deployment.
sdk_plan.wait_for_completed_deployment(SERVICE_NAME)

# Assert the deployment plans are complete.
deployment_plan = sdk_plan.get_deployment_plan(SERVICE_NAME)
assert deployment_plan["status"] == "COMPLETE"

# Get the current service state to verify roles have applied.
service_roles = sdk_utils.get_service_roles(SERVICE_NAME)
current_task_roles = service_roles["task-roles"]

# We must have some role!
assert len(current_task_roles) > 0

assert LEGACY_ROLE not in current_task_roles.values()
assert ENFORCED_ROLE in current_task_roles.values()

assert service_roles["framework-roles"] is None
assert service_roles["framework-role"] == ENFORCED_ROLE


@pytest.mark.quota
@pytest.mark.dcos_min_version("1.14")
@pytest.mark.sanity
def test_nonenforced_group_legacy_service_role():

# Create group without enforced roles.
sdk_marathon.create_group(group_id=ENFORCED_ROLE, options={"enforceRole": False})
options = {"service": {"name": SERVICE_NAME, "role": "slave_public"}}

# this config produces 1 hello's + 2 world's:
sdk_install.install(config.PACKAGE_NAME, SERVICE_NAME, 3, additional_options=options)

# Ensure that our default service installs to a complete deployment.
sdk_plan.wait_for_completed_deployment(SERVICE_NAME)

# Assert the deployment plans are complete.
deployment_plan = sdk_plan.get_deployment_plan(SERVICE_NAME)
assert deployment_plan["status"] == "COMPLETE"

# Get the current service state to verify roles have applied.
service_roles = sdk_utils.get_service_roles(SERVICE_NAME)
current_task_roles = service_roles["task-roles"]

# We must have some role!
assert len(current_task_roles) > 0

assert LEGACY_ROLE in current_task_roles.values()
assert ENFORCED_ROLE not in current_task_roles.values()

assert service_roles["framework-roles"] is None
assert service_roles["framework-role"] == LEGACY_ROLE


@pytest.mark.quota
@pytest.mark.dcos_min_version("1.14")
@pytest.mark.sanity
def test_nonenforced_group_role_service_role_legacy_role_set():

# Create group without enforced roles.
sdk_marathon.create_group(group_id=ENFORCED_ROLE, options={"enforceRole": False})
options = {
"service": {"name": SERVICE_NAME, "role": ENFORCED_ROLE, "enable_role_migration": True}
}

# this config produces 1 hello's + 2 world's:
sdk_install.install(config.PACKAGE_NAME, SERVICE_NAME, 3, additional_options=options)

# Ensure that our default service installs to a complete deployment.
sdk_plan.wait_for_completed_deployment(SERVICE_NAME)

# Assert the deployment plans are complete.
deployment_plan = sdk_plan.get_deployment_plan(SERVICE_NAME)
assert deployment_plan["status"] == "COMPLETE"

# Get the current service state to verify roles have applied.
service_roles = sdk_utils.get_service_roles(SERVICE_NAME)
current_task_roles = service_roles["task-roles"]

# We must have some role!
assert len(current_task_roles) > 0

assert LEGACY_ROLE not in current_task_roles.values()
assert ENFORCED_ROLE in current_task_roles.values()

assert service_roles["framework-roles"] is not None
assert service_roles["framework-role"] is None

assert len(service_roles["framework-roles"]) == 2
assert LEGACY_ROLE in service_roles["framework-roles"]
assert ENFORCED_ROLE in service_roles["framework-roles"]


@pytest.mark.quota
@pytest.mark.dcos_min_version("1.14")
@pytest.mark.sanity
def test_enforced_group_role_defaults():

# Create group without enforced roles.
sdk_marathon.create_group(group_id=ENFORCED_ROLE, options={"enforceRole": True})
options = {"service": {"name": SERVICE_NAME}}

# this config produces 1 hello's + 2 world's:
sdk_install.install(config.PACKAGE_NAME, SERVICE_NAME, 3, additional_options=options)

# Ensure that our default service installs to a complete deployment.
sdk_plan.wait_for_completed_deployment(SERVICE_NAME)

# Assert the deployment plans are complete.
deployment_plan = sdk_plan.get_deployment_plan(SERVICE_NAME)
assert deployment_plan["status"] == "COMPLETE"

# Get the current service state to verify roles have applied.
service_roles = sdk_utils.get_service_roles(SERVICE_NAME)
current_task_roles = service_roles["task-roles"]

# We must have some role!
assert len(current_task_roles) > 0

assert LEGACY_ROLE not in current_task_roles.values()
assert ENFORCED_ROLE in current_task_roles.values()

assert service_roles["framework-roles"] is None
assert service_roles["framework-role"] == ENFORCED_ROLE


@pytest.mark.quota
@pytest.mark.dcos_min_version("1.14")
@pytest.mark.sanity
def test_enforced_group_role_legacy_role_set():

# Create group without enforced roles.
sdk_marathon.create_group(group_id=ENFORCED_ROLE, options={"enforceRole": True})
options = {"service": {"name": SERVICE_NAME, "enable_role_migration": True}}

# this config produces 1 hello's + 2 world's:
sdk_install.install(config.PACKAGE_NAME, SERVICE_NAME, 3, additional_options=options)

# Ensure that our default service installs to a complete deployment.
sdk_plan.wait_for_completed_deployment(SERVICE_NAME)

# Assert the deployment plans are complete.
deployment_plan = sdk_plan.get_deployment_plan(SERVICE_NAME)
assert deployment_plan["status"] == "COMPLETE"

# Get the current service state to verify roles have applied.
service_roles = sdk_utils.get_service_roles(SERVICE_NAME)
current_task_roles = service_roles["task-roles"]

# We must have some role!
assert len(current_task_roles) > 0

assert LEGACY_ROLE not in current_task_roles.values()
assert ENFORCED_ROLE in current_task_roles.values()

assert service_roles["framework-roles"] is not None
assert service_roles["framework-role"] is None

assert len(service_roles["framework-roles"]) == 2
assert LEGACY_ROLE in service_roles["framework-roles"]
assert ENFORCED_ROLE in service_roles["framework-roles"]


@pytest.mark.quota
@pytest.mark.dcos_min_version("1.14")
@pytest.mark.sanity
def test_nonenforced_group_legacy_service_role_non_migration():

# Create group without enforced roles.
sdk_marathon.create_group(group_id=ENFORCED_ROLE, options={"enforceRole": False})
options = {
"service": {"name": SERVICE_NAME, "role": "slave_public", "enable_role_migration": False}
}

# this config produces 1 hello's + 2 world's:
sdk_install.install(config.PACKAGE_NAME, SERVICE_NAME, 3, additional_options=options)

# Ensure that our default service installs to a complete deployment.
sdk_plan.wait_for_completed_deployment(SERVICE_NAME)

# Assert the deployment plans are complete.
deployment_plan = sdk_plan.get_deployment_plan(SERVICE_NAME)
assert deployment_plan["status"] == "COMPLETE"

# Get the current service state to verify roles have applied.
service_roles = sdk_utils.get_service_roles(SERVICE_NAME)
current_task_roles = service_roles["task-roles"]

# We must have some role!
assert len(current_task_roles) > 0

assert LEGACY_ROLE in current_task_roles.values()
assert ENFORCED_ROLE not in current_task_roles.values()

assert service_roles["framework-roles"] is None
assert service_roles["framework-role"] == LEGACY_ROLE


@pytest.mark.quota
@pytest.mark.dcos_min_version("1.14")
@pytest.mark.sanity
def test_enforced_role_non_migration():

# Create group without enforced roles.
sdk_marathon.create_group(group_id=ENFORCED_ROLE, options={"enforceRole": False})
options = {
"service": {"name": SERVICE_NAME, "role": ENFORCED_ROLE, "enable_role_migration": False}
}

# this config produces 1 hello's + 2 world's:
sdk_install.install(config.PACKAGE_NAME, SERVICE_NAME, 3, additional_options=options)

# Ensure that our default service installs to a complete deployment.
sdk_plan.wait_for_completed_deployment(SERVICE_NAME)

# Assert the deployment plans are complete.
deployment_plan = sdk_plan.get_deployment_plan(SERVICE_NAME)
assert deployment_plan["status"] == "COMPLETE"

# Get the current service state to verify roles have applied.
service_roles = sdk_utils.get_service_roles(SERVICE_NAME)
current_task_roles = service_roles["task-roles"]

# We must have some role!
assert len(current_task_roles) > 0

assert LEGACY_ROLE not in current_task_roles.values()
assert ENFORCED_ROLE in current_task_roles.values()

assert service_roles["framework-roles"] is None
assert service_roles["framework-role"] == ENFORCED_ROLE


@pytest.mark.quota
@pytest.mark.dcos_min_version("1.14")
@pytest.mark.sanity
def test_group_enforced_role_non_migration():

# Create group without enforced roles.
sdk_marathon.create_group(group_id=ENFORCED_ROLE, options={"enforceRole": True})
options = {
"service": {"name": SERVICE_NAME, "role": ENFORCED_ROLE, "enable_role_migration": False}
}

# this config produces 1 hello's + 2 world's:
sdk_install.install(config.PACKAGE_NAME, SERVICE_NAME, 3, additional_options=options)

# Ensure that our default service installs to a complete deployment.
sdk_plan.wait_for_completed_deployment(SERVICE_NAME)

# Assert the deployment plans are complete.
deployment_plan = sdk_plan.get_deployment_plan(SERVICE_NAME)
assert deployment_plan["status"] == "COMPLETE"

# Get the current service state to verify roles have applied.
service_roles = sdk_utils.get_service_roles(SERVICE_NAME)
current_task_roles = service_roles["task-roles"]

# We must have some role!
assert len(current_task_roles) > 0

assert LEGACY_ROLE not in current_task_roles.values()
assert ENFORCED_ROLE in current_task_roles.values()

assert service_roles["framework-roles"] is None
assert service_roles["framework-role"] == ENFORCED_ROLE
Loading