mirror of
https://github.com/ansible/awx.git
synced 2026-01-11 10:00:01 -03:30
InstanceGroup#is_containerized -> InstanceGroup#is_container_group
This commit is contained in:
parent
7b7465f168
commit
286b1d4e25
@ -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
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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()
|
||||
|
||||
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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`)
|
||||
}
|
||||
|
||||
@ -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',
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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`;
|
||||
};
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user