InstanceGroup#is_containerized -> InstanceGroup#is_container_group

This commit is contained in:
Shane McDonald
2021-01-13 19:38:03 -05:00
parent 7b7465f168
commit 286b1d4e25
21 changed files with 44 additions and 45 deletions

View File

@@ -131,7 +131,7 @@ SUMMARIZABLE_FK_FIELDS = {
'source_script': DEFAULT_SUMMARY_FIELDS, 'source_script': DEFAULT_SUMMARY_FIELDS,
'role': ('id', 'role_field'), 'role': ('id', 'role_field'),
'notification_template': DEFAULT_SUMMARY_FIELDS, 'notification_template': DEFAULT_SUMMARY_FIELDS,
'instance_group': ('id', 'name', 'controller_id', 'is_containerized'), 'instance_group': ('id', 'name', 'controller_id', 'is_container_group'),
'insights_credential': DEFAULT_SUMMARY_FIELDS, 'insights_credential': DEFAULT_SUMMARY_FIELDS,
'source_credential': DEFAULT_SUMMARY_FIELDS + ('kind', 'cloud', 'credential_type_id'), 'source_credential': DEFAULT_SUMMARY_FIELDS + ('kind', 'cloud', 'credential_type_id'),
'target_credential': DEFAULT_SUMMARY_FIELDS + ('kind', 'cloud', 'credential_type_id'), 'target_credential': DEFAULT_SUMMARY_FIELDS + ('kind', 'cloud', 'credential_type_id'),
@@ -4768,7 +4768,7 @@ class InstanceGroupSerializer(BaseSerializer):
'Isolated groups have a designated controller group.'), 'Isolated groups have a designated controller group.'),
read_only=True read_only=True
) )
is_containerized = serializers.BooleanField( is_container_group = serializers.BooleanField(
help_text=_('Indicates whether instances in this group are containerized.' help_text=_('Indicates whether instances in this group are containerized.'
'Containerized groups have a designated Openshift or Kubernetes cluster.'), 'Containerized groups have a designated Openshift or Kubernetes cluster.'),
read_only=True read_only=True
@@ -4798,7 +4798,7 @@ class InstanceGroupSerializer(BaseSerializer):
fields = ("id", "type", "url", "related", "name", "created", "modified", fields = ("id", "type", "url", "related", "name", "created", "modified",
"capacity", "committed_capacity", "consumed_capacity", "capacity", "committed_capacity", "consumed_capacity",
"percent_capacity_remaining", "jobs_running", "jobs_total", "percent_capacity_remaining", "jobs_running", "jobs_total",
"instances", "controller", "is_controller", "is_isolated", "is_containerized", "credential", "instances", "controller", "is_controller", "is_isolated", "is_container_group", "credential",
"policy_instance_percentage", "policy_instance_minimum", "policy_instance_list", "policy_instance_percentage", "policy_instance_minimum", "policy_instance_list",
"pod_spec_override", "summary_fields") "pod_spec_override", "summary_fields")
@@ -4823,17 +4823,17 @@ class InstanceGroupSerializer(BaseSerializer):
raise serializers.ValidationError(_('Isolated instances may not be added or removed from instances groups via the API.')) raise serializers.ValidationError(_('Isolated instances may not be added or removed from instances groups via the API.'))
if self.instance and self.instance.controller_id is not None: if self.instance and self.instance.controller_id is not None:
raise serializers.ValidationError(_('Isolated instance group membership may not be managed via the API.')) raise serializers.ValidationError(_('Isolated instance group membership may not be managed via the API.'))
if value and self.instance and self.instance.is_containerized: if value and self.instance and self.instance.is_container_group:
raise serializers.ValidationError(_('Containerized instances may not be managed via the API')) raise serializers.ValidationError(_('Containerized instances may not be managed via the API'))
return value return value
def validate_policy_instance_percentage(self, value): def validate_policy_instance_percentage(self, value):
if value and self.instance and self.instance.is_containerized: if value and self.instance and self.instance.is_container_group:
raise serializers.ValidationError(_('Containerized instances may not be managed via the API')) raise serializers.ValidationError(_('Containerized instances may not be managed via the API'))
return value return value
def validate_policy_instance_minimum(self, value): def validate_policy_instance_minimum(self, value):
if value and self.instance and self.instance.is_containerized: if value and self.instance and self.instance.is_container_group:
raise serializers.ValidationError(_('Containerized instances may not be managed via the API')) raise serializers.ValidationError(_('Containerized instances may not be managed via the API'))
return value return value

View File

@@ -397,7 +397,7 @@ class InstanceGroupDetail(RelatedJobsPreventDeleteMixin, RetrieveUpdateDestroyAP
permission_classes = (InstanceGroupTowerPermission,) permission_classes = (InstanceGroupTowerPermission,)
def update_raw_data(self, data): def update_raw_data(self, data):
if self.get_object().is_containerized: if self.get_object().is_container_group:
data.pop('policy_instance_percentage', None) data.pop('policy_instance_percentage', None)
data.pop('policy_instance_minimum', None) data.pop('policy_instance_minimum', None)
data.pop('policy_instance_list', None) data.pop('policy_instance_list', None)

View File

@@ -151,8 +151,8 @@ class AdHocCommand(UnifiedJob, JobNotificationMixin):
return True return True
@property @property
def is_containerized(self): def is_container_group_task(self):
return bool(self.instance_group and self.instance_group.is_containerized) return bool(self.instance_group and self.instance_group.is_container_group)
@property @property
def can_run_containerized(self): def can_run_containerized(self):

View File

@@ -247,7 +247,7 @@ class InstanceGroup(HasPolicyEditsMixin, BaseModel, RelatedJobsMixin):
return bool(self.controller) return bool(self.controller)
@property @property
def is_containerized(self): def is_container_group(self):
return bool(self.credential and self.credential.kubernetes) return bool(self.credential and self.credential.kubernetes)
''' '''
@@ -306,9 +306,9 @@ def schedule_policy_task():
@receiver(post_save, sender=InstanceGroup) @receiver(post_save, sender=InstanceGroup)
def on_instance_group_saved(sender, instance, created=False, raw=False, **kwargs): def on_instance_group_saved(sender, instance, created=False, raw=False, **kwargs):
if created or instance.has_policy_changes(): if created or instance.has_policy_changes():
if not instance.is_containerized: if not instance.is_container_group:
schedule_policy_task() schedule_policy_task()
elif created or instance.is_containerized: elif created or instance.is_container_group:
instance.set_default_policy_fields() instance.set_default_policy_fields()
@@ -320,7 +320,7 @@ def on_instance_saved(sender, instance, created=False, raw=False, **kwargs):
@receiver(post_delete, sender=InstanceGroup) @receiver(post_delete, sender=InstanceGroup)
def on_instance_group_deleted(sender, instance, using, **kwargs): def on_instance_group_deleted(sender, instance, using, **kwargs):
if not instance.is_containerized: if not instance.is_container_group:
schedule_policy_task() schedule_policy_task()

View File

@@ -768,11 +768,11 @@ class Job(UnifiedJob, JobOptions, SurveyJobMixin, JobNotificationMixin, TaskMana
@property @property
def can_run_containerized(self): def can_run_containerized(self):
return any([ig for ig in self.preferred_instance_groups if ig.is_containerized]) return any([ig for ig in self.preferred_instance_groups if ig.is_container_group])
@property @property
def is_containerized(self): def is_container_group_task(self):
return bool(self.instance_group and self.instance_group.is_containerized) return bool(self.instance_group and self.instance_group.is_container_group)
@property @property
def preferred_instance_groups(self): def preferred_instance_groups(self):

View File

@@ -283,12 +283,12 @@ class TaskManager():
task.controller_node = controller_node task.controller_node = controller_node
logger.debug('Submitting isolated {} to queue {} controlled by {}.'.format( logger.debug('Submitting isolated {} to queue {} controlled by {}.'.format(
task.log_format, task.execution_node, controller_node)) task.log_format, task.execution_node, controller_node))
elif rampart_group.is_containerized: elif rampart_group.is_container_group:
# find one real, non-containerized instance with capacity to # find one real, non-containerized instance with capacity to
# act as the controller for k8s API interaction # act as the controller for k8s API interaction
match = None match = None
for group in InstanceGroup.objects.all(): for group in InstanceGroup.objects.all():
if group.is_containerized or group.controller_id: if group.is_container_group or group.controller_id:
continue continue
match = group.fit_task_to_most_remaining_capacity_instance(task, group.instances.all()) match = group.fit_task_to_most_remaining_capacity_instance(task, group.instances.all())
if match: if match:
@@ -521,14 +521,14 @@ class TaskManager():
self.start_task(task, None, task.get_jobs_fail_chain(), None) self.start_task(task, None, task.get_jobs_fail_chain(), None)
continue continue
for rampart_group in preferred_instance_groups: for rampart_group in preferred_instance_groups:
if task.can_run_containerized and rampart_group.is_containerized: if task.can_run_containerized and rampart_group.is_container_group:
self.graph[rampart_group.name]['graph'].add_job(task) self.graph[rampart_group.name]['graph'].add_job(task)
self.start_task(task, rampart_group, task.get_jobs_fail_chain(), None) self.start_task(task, rampart_group, task.get_jobs_fail_chain(), None)
found_acceptable_queue = True found_acceptable_queue = True
break break
remaining_capacity = self.get_remaining_capacity(rampart_group.name) remaining_capacity = self.get_remaining_capacity(rampart_group.name)
if not rampart_group.is_containerized and self.get_remaining_capacity(rampart_group.name) <= 0: if not rampart_group.is_container_group and self.get_remaining_capacity(rampart_group.name) <= 0:
logger.debug("Skipping group {}, remaining_capacity {} <= 0".format( logger.debug("Skipping group {}, remaining_capacity {} <= 0".format(
rampart_group.name, remaining_capacity)) rampart_group.name, remaining_capacity))
continue continue
@@ -536,8 +536,8 @@ class TaskManager():
execution_instance = InstanceGroup.fit_task_to_most_remaining_capacity_instance(task, self.graph[rampart_group.name]['instances']) or \ execution_instance = InstanceGroup.fit_task_to_most_remaining_capacity_instance(task, self.graph[rampart_group.name]['instances']) or \
InstanceGroup.find_largest_idle_instance(self.graph[rampart_group.name]['instances']) InstanceGroup.find_largest_idle_instance(self.graph[rampart_group.name]['instances'])
if execution_instance or rampart_group.is_containerized: if execution_instance or rampart_group.is_container_group:
if not rampart_group.is_containerized: if not rampart_group.is_container_group:
execution_instance.remaining_capacity = max(0, execution_instance.remaining_capacity - task.task_impact) execution_instance.remaining_capacity = max(0, execution_instance.remaining_capacity - task.task_impact)
execution_instance.jobs_running += 1 execution_instance.jobs_running += 1
logger.debug("Starting {} in group {} instance {} (remaining_capacity={})".format( logger.debug("Starting {} in group {} instance {} (remaining_capacity={})".format(

View File

@@ -262,7 +262,7 @@ def apply_cluster_membership_policies():
# On a differential basis, apply instances to non-isolated groups # On a differential basis, apply instances to non-isolated groups
with transaction.atomic(): with transaction.atomic():
for g in actual_groups: for g in actual_groups:
if g.obj.is_containerized: if g.obj.is_container_group:
logger.debug('Skipping containerized group {} for policy calculation'.format(g.obj.name)) logger.debug('Skipping containerized group {} for policy calculation'.format(g.obj.name))
continue continue
instances_to_add = set(g.instances) - set(g.prior_instances) instances_to_add = set(g.instances) - set(g.prior_instances)
@@ -507,7 +507,7 @@ def cluster_node_heartbeat():
def awx_k8s_reaper(): def awx_k8s_reaper():
from awx.main.scheduler.kubernetes import PodManager # prevent circular import from awx.main.scheduler.kubernetes import PodManager # prevent circular import
for group in InstanceGroup.objects.filter(credential__isnull=False).iterator(): for group in InstanceGroup.objects.filter(credential__isnull=False).iterator():
if group.is_containerized: if group.is_container_group:
logger.debug("Checking for orphaned k8s pods for {}.".format(group)) logger.debug("Checking for orphaned k8s pods for {}.".format(group))
for job in UnifiedJob.objects.filter( for job in UnifiedJob.objects.filter(
pk__in=list(PodManager.list_active_jobs(group)) pk__in=list(PodManager.list_active_jobs(group))

View File

@@ -255,7 +255,7 @@ def test_instance_group_update_fields(patch, instance, instance_group, admin, co
# policy_instance_ variables can only be updated in instance groups that are NOT containerized # policy_instance_ variables can only be updated in instance groups that are NOT containerized
# instance group (not containerized) # instance group (not containerized)
ig_url = reverse("api:instance_group_detail", kwargs={'pk': instance_group.pk}) ig_url = reverse("api:instance_group_detail", kwargs={'pk': instance_group.pk})
assert not instance_group.is_containerized assert not instance_group.is_container_group
assert not containerized_instance_group.is_isolated assert not containerized_instance_group.is_isolated
resp = patch(ig_url, {'policy_instance_percentage':15}, admin, expect=200) resp = patch(ig_url, {'policy_instance_percentage':15}, admin, expect=200)
assert 15 == resp.data['policy_instance_percentage'] assert 15 == resp.data['policy_instance_percentage']
@@ -266,7 +266,7 @@ def test_instance_group_update_fields(patch, instance, instance_group, admin, co
# containerized instance group # containerized instance group
cg_url = reverse("api:instance_group_detail", kwargs={'pk': containerized_instance_group.pk}) cg_url = reverse("api:instance_group_detail", kwargs={'pk': containerized_instance_group.pk})
assert containerized_instance_group.is_containerized assert containerized_instance_group.is_container_group
assert not containerized_instance_group.is_isolated assert not containerized_instance_group.is_isolated
resp = patch(cg_url, {'policy_instance_percentage':15}, admin, expect=400) resp = patch(cg_url, {'policy_instance_percentage':15}, admin, expect=400)
assert ["Containerized instances may not be managed via the API"] == resp.data['policy_instance_percentage'] assert ["Containerized instances may not be managed via the API"] == resp.data['policy_instance_percentage']
@@ -291,4 +291,3 @@ def test_containerized_group_default_fields(instance_group, kube_credential):
assert ig.policy_instance_list == [] assert ig.policy_instance_list == []
assert ig.policy_instance_minimum == 0 assert ig.policy_instance_minimum == 0
assert ig.policy_instance_percentage == 0 assert ig.policy_instance_percentage == 0

View File

@@ -30,7 +30,7 @@ def containerized_job(default_instance_group, kube_credential, job_template_fact
@pytest.mark.django_db @pytest.mark.django_db
def test_containerized_job(containerized_job): def test_containerized_job(containerized_job):
assert containerized_job.is_containerized assert containerized_job.is_containerized
assert containerized_job.instance_group.is_containerized assert containerized_job.instance_group.is_container_group
assert containerized_job.instance_group.credential.kubernetes assert containerized_job.instance_group.credential.kubernetes

View File

@@ -86,7 +86,7 @@ Instances of orgs list include:
**Instance Groups list** **Instance Groups list**
- Name - search is ?name=ig - Name - search is ?name=ig
- ? is_containerized boolean choice (doesn't work right now in API but will soon) - search is ?is_containerized=true - ? is_container_group boolean choice (doesn't work right now in API but will soon) - search is ?is_container_group=true
- ? credential name - search is ?credentials__name=kubey - ? credential name - search is ?credentials__name=kubey
Instance of instance groups list include: Instance of instance groups list include:
@@ -136,7 +136,7 @@ Instance of team lists include:
**Credentials list** **Credentials list**
- Name - Name
- ? Type (dropdown on right with different types) - ? Type (dropdown on right with different types)
- ? Created by (username) - ? Created by (username)
- ? Modified by (username) - ? Modified by (username)
@@ -273,7 +273,7 @@ For the UI url params, we want to only encode those params that aren't defaults,
#### mergeParams vs. replaceParams #### mergeParams vs. replaceParams
**mergeParams** is used to suppport putting values with the same key **mergeParams** is used to suppport putting values with the same key
From a UX perspective, we wanted to be able to support searching on the same key multiple times (i.e. searching for things like `?foo=bar&foo=baz`). We do this by creating an array of all values. i.e.: From a UX perspective, we wanted to be able to support searching on the same key multiple times (i.e. searching for things like `?foo=bar&foo=baz`). We do this by creating an array of all values. i.e.:
@@ -361,7 +361,7 @@ Smart search will be able to craft the tag through various states. Note that th
"instance_groups__search" "instance_groups__search"
], ],
``` ```
PHASE 3: keys, give by object key names for data.actions.GET PHASE 3: keys, give by object key names for data.actions.GET
- type is given for each key which we could use to help craft the value - type is given for each key which we could use to help craft the value

View File

@@ -32,7 +32,7 @@ const instanceGroup = {
controller: null, controller: null,
is_controller: false, is_controller: false,
is_isolated: false, is_isolated: false,
is_containerized: true, is_container_group: true,
credential: 71, credential: 71,
policy_instance_percentage: 0, policy_instance_percentage: 0,
policy_instance_minimum: 0, policy_instance_minimum: 0,

View File

@@ -31,7 +31,7 @@ const instanceGroup = {
controller: null, controller: null,
is_controller: false, is_controller: false,
is_isolated: false, is_isolated: false,
is_containerized: true, is_container_group: true,
credential: 71, credential: 71,
policy_instance_percentage: 0, policy_instance_percentage: 0,
policy_instance_minimum: 0, policy_instance_minimum: 0,

View File

@@ -29,7 +29,7 @@ const instanceGroupData = {
controller: null, controller: null,
is_controller: false, is_controller: false,
is_isolated: false, is_isolated: false,
is_containerized: false, is_container_group: false,
credential: null, credential: null,
policy_instance_percentage: 46, policy_instance_percentage: 46,
policy_instance_minimum: 12, policy_instance_minimum: 12,

View File

@@ -78,7 +78,7 @@ function InstanceGroupDetails({ instanceGroup, i18n }) {
<Detail <Detail
label={i18n._(t`Type`)} label={i18n._(t`Type`)}
value={ value={
instanceGroup.is_containerized instanceGroup.is_container_group
? i18n._(t`Container group`) ? i18n._(t`Container group`)
: i18n._(t`Instance group`) : i18n._(t`Instance group`)
} }

View File

@@ -20,7 +20,7 @@ const instanceGroups = [
policy_instance_minimum: 10, policy_instance_minimum: 10,
policy_instance_percentage: 50, policy_instance_percentage: 50,
percent_capacity_remaining: 60, percent_capacity_remaining: 60,
is_containerized: false, is_container_group: false,
is_isolated: false, is_isolated: false,
created: '2020-07-21T18:41:02.818081Z', created: '2020-07-21T18:41:02.818081Z',
modified: '2020-07-24T20:32:03.121079Z', modified: '2020-07-24T20:32:03.121079Z',
@@ -40,7 +40,7 @@ const instanceGroups = [
policy_instance_minimum: 0, policy_instance_minimum: 0,
policy_instance_percentage: 0, policy_instance_percentage: 0,
percent_capacity_remaining: 0, percent_capacity_remaining: 0,
is_containerized: true, is_container_group: true,
is_isolated: false, is_isolated: false,
created: '2020-07-21T18:41:02.818081Z', created: '2020-07-21T18:41:02.818081Z',
modified: '2020-07-24T20:32:03.121079Z', modified: '2020-07-24T20:32:03.121079Z',

View File

@@ -30,7 +30,7 @@ const instanceGroupData = {
controller: null, controller: null,
is_controller: false, is_controller: false,
is_isolated: false, is_isolated: false,
is_containerized: false, is_container_group: false,
credential: null, credential: null,
policy_instance_percentage: 46, policy_instance_percentage: 46,
policy_instance_minimum: 12, policy_instance_minimum: 12,

View File

@@ -182,7 +182,7 @@ function InstanceGroupList({ i18n }) {
); );
const getDetailUrl = item => { const getDetailUrl = item => {
return item.is_containerized return item.is_container_group
? `${match.url}/container_group/${item.id}/details` ? `${match.url}/container_group/${item.id}/details`
: `${match.url}/${item.id}/details`; : `${match.url}/${item.id}/details`;
}; };

View File

@@ -32,7 +32,7 @@ function InstanceGroupListItem({
const labelId = `check-action-${instanceGroup.id}`; const labelId = `check-action-${instanceGroup.id}`;
const isContainerGroup = item => { const isContainerGroup = item => {
return item.is_containerized; return item.is_container_group;
}; };
function usedCapacity(item) { function usedCapacity(item) {

View File

@@ -17,7 +17,7 @@ describe('<InstanceGroupListItem/>', () => {
policy_instance_minimum: 10, policy_instance_minimum: 10,
policy_instance_percentage: 50, policy_instance_percentage: 50,
percent_capacity_remaining: 60, percent_capacity_remaining: 60,
is_containerized: false, is_container_group: false,
summary_fields: { summary_fields: {
user_capabilities: { user_capabilities: {
edit: true, edit: true,
@@ -34,7 +34,7 @@ describe('<InstanceGroupListItem/>', () => {
policy_instance_minimum: 0, policy_instance_minimum: 0,
policy_instance_percentage: 0, policy_instance_percentage: 0,
percent_capacity_remaining: 0, percent_capacity_remaining: 0,
is_containerized: true, is_container_group: true,
summary_fields: { summary_fields: {
user_capabilities: { user_capabilities: {
edit: false, edit: false,

View File

@@ -27,7 +27,7 @@ const instanceGroup = {
controller: null, controller: null,
is_controller: false, is_controller: false,
is_isolated: false, is_isolated: false,
is_containerized: false, is_container_group: false,
credential: 3, credential: 3,
policy_instance_percentage: 46, policy_instance_percentage: 46,
policy_instance_minimum: 12, policy_instance_minimum: 12,

View File

@@ -27,7 +27,7 @@ const instanceGroup = {
controller: null, controller: null,
is_controller: false, is_controller: false,
is_isolated: false, is_isolated: false,
is_containerized: false, is_container_group: false,
credential: null, credential: null,
policy_instance_percentage: 46, policy_instance_percentage: 46,
policy_instance_minimum: 12, policy_instance_minimum: 12,