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,
'role': ('id', 'role_field'),
'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,
'source_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.'),
read_only=True
)
is_containerized = serializers.BooleanField(
is_container_group = serializers.BooleanField(
help_text=_('Indicates whether instances in this group are containerized.'
'Containerized groups have a designated Openshift or Kubernetes cluster.'),
read_only=True
@ -4798,7 +4798,7 @@ class InstanceGroupSerializer(BaseSerializer):
fields = ("id", "type", "url", "related", "name", "created", "modified",
"capacity", "committed_capacity", "consumed_capacity",
"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",
"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.'))
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.'))
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'))
return 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'))
return 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'))
return value

View File

@ -397,7 +397,7 @@ class InstanceGroupDetail(RelatedJobsPreventDeleteMixin, RetrieveUpdateDestroyAP
permission_classes = (InstanceGroupTowerPermission,)
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_minimum', None)
data.pop('policy_instance_list', None)

View File

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

View File

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

View File

@ -768,11 +768,11 @@ class Job(UnifiedJob, JobOptions, SurveyJobMixin, JobNotificationMixin, TaskMana
@property
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
def is_containerized(self):
return bool(self.instance_group and self.instance_group.is_containerized)
def is_container_group_task(self):
return bool(self.instance_group and self.instance_group.is_container_group)
@property
def preferred_instance_groups(self):

View File

@ -283,12 +283,12 @@ class TaskManager():
task.controller_node = controller_node
logger.debug('Submitting isolated {} to queue {} controlled by {}.'.format(
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
# act as the controller for k8s API interaction
match = None
for group in InstanceGroup.objects.all():
if group.is_containerized or group.controller_id:
if group.is_container_group or group.controller_id:
continue
match = group.fit_task_to_most_remaining_capacity_instance(task, group.instances.all())
if match:
@ -521,14 +521,14 @@ class TaskManager():
self.start_task(task, None, task.get_jobs_fail_chain(), None)
continue
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.start_task(task, rampart_group, task.get_jobs_fail_chain(), None)
found_acceptable_queue = True
break
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(
rampart_group.name, remaining_capacity))
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 \
InstanceGroup.find_largest_idle_instance(self.graph[rampart_group.name]['instances'])
if execution_instance or rampart_group.is_containerized:
if not rampart_group.is_containerized:
if execution_instance or rampart_group.is_container_group:
if not rampart_group.is_container_group:
execution_instance.remaining_capacity = max(0, execution_instance.remaining_capacity - task.task_impact)
execution_instance.jobs_running += 1
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
with transaction.atomic():
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))
continue
instances_to_add = set(g.instances) - set(g.prior_instances)
@ -507,7 +507,7 @@ def cluster_node_heartbeat():
def awx_k8s_reaper():
from awx.main.scheduler.kubernetes import PodManager # prevent circular import
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))
for job in UnifiedJob.objects.filter(
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
# instance group (not containerized)
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
resp = patch(ig_url, {'policy_instance_percentage':15}, admin, expect=200)
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
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
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']
@ -291,4 +291,3 @@ def test_containerized_group_default_fields(instance_group, kube_credential):
assert ig.policy_instance_list == []
assert ig.policy_instance_minimum == 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
def test_containerized_job(containerized_job):
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

View File

@ -86,7 +86,7 @@ Instances of orgs list include:
**Instance Groups list**
- 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
Instance of instance groups list include:
@ -136,7 +136,7 @@ Instance of team lists include:
**Credentials list**
- Name
- ? Type (dropdown on right with different types)
- ? Type (dropdown on right with different types)
- ? Created 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** 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.:
@ -361,7 +361,7 @@ Smart search will be able to craft the tag through various states. Note that th
"instance_groups__search"
],
```
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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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