mirror of
https://github.com/ansible/awx.git
synced 2026-02-20 12:40:06 -03:30
Merge pull request #6895 from wenottingham/de-tower-ify
Remove assorted references to Tower.
This commit is contained in:
@@ -1653,7 +1653,7 @@ class InventorySourceSerializer(UnifiedJobTemplateSerializer, InventorySourceOpt
|
|||||||
raise serializers.ValidationError({"detail": _("Inventory controlled by project-following SCM.")})
|
raise serializers.ValidationError({"detail": _("Inventory controlled by project-following SCM.")})
|
||||||
elif source=='scm' and not overwrite_vars:
|
elif source=='scm' and not overwrite_vars:
|
||||||
raise serializers.ValidationError({"detail": _(
|
raise serializers.ValidationError({"detail": _(
|
||||||
"SCM type sources must set `overwrite_vars` to `true` until a future Tower release.")})
|
"SCM type sources must set `overwrite_vars` to `true`.")})
|
||||||
|
|
||||||
return super(InventorySourceSerializer, self).validate(attrs)
|
return super(InventorySourceSerializer, self).validate(attrs)
|
||||||
|
|
||||||
@@ -1895,7 +1895,7 @@ class CredentialTypeSerializer(BaseSerializer):
|
|||||||
def validate(self, attrs):
|
def validate(self, attrs):
|
||||||
if self.instance and self.instance.managed_by_tower:
|
if self.instance and self.instance.managed_by_tower:
|
||||||
raise PermissionDenied(
|
raise PermissionDenied(
|
||||||
detail=_("Modifications not allowed for credential types managed by Tower")
|
detail=_("Modifications not allowed for managed credential types")
|
||||||
)
|
)
|
||||||
if self.instance and self.instance.credentials.exists():
|
if self.instance and self.instance.credentials.exists():
|
||||||
if 'inputs' in attrs and attrs['inputs'] != self.instance.inputs:
|
if 'inputs' in attrs and attrs['inputs'] != self.instance.inputs:
|
||||||
|
|||||||
@@ -213,7 +213,7 @@ class ApiV2RootView(ApiVersionRootView):
|
|||||||
|
|
||||||
|
|
||||||
class ApiV1PingView(APIView):
|
class ApiV1PingView(APIView):
|
||||||
"""A simple view that reports very basic information about this Tower
|
"""A simple view that reports very basic information about this
|
||||||
instance, which is acceptable to be public information.
|
instance, which is acceptable to be public information.
|
||||||
"""
|
"""
|
||||||
permission_classes = (AllowAny,)
|
permission_classes = (AllowAny,)
|
||||||
@@ -222,7 +222,7 @@ class ApiV1PingView(APIView):
|
|||||||
new_in_210 = True
|
new_in_210 = True
|
||||||
|
|
||||||
def get(self, request, format=None):
|
def get(self, request, format=None):
|
||||||
"""Return some basic information about this Tower instance.
|
"""Return some basic information about this instance.
|
||||||
|
|
||||||
Everything returned here should be considered public / insecure, as
|
Everything returned here should be considered public / insecure, as
|
||||||
this requires no auth and is intended for use by the installer process.
|
this requires no auth and is intended for use by the installer process.
|
||||||
@@ -320,7 +320,7 @@ class ApiV1ConfigView(APIView):
|
|||||||
try:
|
try:
|
||||||
data_actual = json.dumps(request.data)
|
data_actual = json.dumps(request.data)
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.info(smart_text(u"Invalid JSON submitted for Tower license."),
|
logger.info(smart_text(u"Invalid JSON submitted for license."),
|
||||||
extra=dict(actor=request.user.username))
|
extra=dict(actor=request.user.username))
|
||||||
return Response({"error": _("Invalid JSON")}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": _("Invalid JSON")}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
try:
|
try:
|
||||||
@@ -328,7 +328,7 @@ class ApiV1ConfigView(APIView):
|
|||||||
license_data = json.loads(data_actual)
|
license_data = json.loads(data_actual)
|
||||||
license_data_validated = TaskEnhancer(**license_data).validate_enhancements()
|
license_data_validated = TaskEnhancer(**license_data).validate_enhancements()
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.warning(smart_text(u"Invalid Tower license submitted."),
|
logger.warning(smart_text(u"Invalid license submitted."),
|
||||||
extra=dict(actor=request.user.username))
|
extra=dict(actor=request.user.username))
|
||||||
return Response({"error": _("Invalid License")}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": _("Invalid License")}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
@@ -338,7 +338,7 @@ class ApiV1ConfigView(APIView):
|
|||||||
settings.TOWER_URL_BASE = "{}://{}".format(request.scheme, request.get_host())
|
settings.TOWER_URL_BASE = "{}://{}".format(request.scheme, request.get_host())
|
||||||
return Response(license_data_validated)
|
return Response(license_data_validated)
|
||||||
|
|
||||||
logger.warning(smart_text(u"Invalid Tower license submitted."),
|
logger.warning(smart_text(u"Invalid license submitted."),
|
||||||
extra=dict(actor=request.user.username))
|
extra=dict(actor=request.user.username))
|
||||||
return Response({"error": _("Invalid license")}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": _("Invalid license")}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
@@ -813,7 +813,7 @@ class OrganizationList(OrganizationCountsMixin, ListCreateAPIView):
|
|||||||
def create(self, request, *args, **kwargs):
|
def create(self, request, *args, **kwargs):
|
||||||
"""Create a new organzation.
|
"""Create a new organzation.
|
||||||
|
|
||||||
If there is already an organization and the license of the Tower
|
If there is already an organization and the license of this
|
||||||
instance does not permit multiple organizations, then raise
|
instance does not permit multiple organizations, then raise
|
||||||
LicenseForbids.
|
LicenseForbids.
|
||||||
"""
|
"""
|
||||||
@@ -822,7 +822,7 @@ class OrganizationList(OrganizationCountsMixin, ListCreateAPIView):
|
|||||||
# if no organizations exist in the system.
|
# if no organizations exist in the system.
|
||||||
if (not feature_enabled('multiple_organizations') and
|
if (not feature_enabled('multiple_organizations') and
|
||||||
self.model.objects.exists()):
|
self.model.objects.exists()):
|
||||||
raise LicenseForbids(_('Your Tower license only permits a single '
|
raise LicenseForbids(_('Your license only permits a single '
|
||||||
'organization to exist.'))
|
'organization to exist.'))
|
||||||
|
|
||||||
# Okay, create the organization as usual.
|
# Okay, create the organization as usual.
|
||||||
@@ -1589,7 +1589,7 @@ class CredentialTypeDetail(RetrieveUpdateDestroyAPIView):
|
|||||||
def destroy(self, request, *args, **kwargs):
|
def destroy(self, request, *args, **kwargs):
|
||||||
instance = self.get_object()
|
instance = self.get_object()
|
||||||
if instance.managed_by_tower:
|
if instance.managed_by_tower:
|
||||||
raise PermissionDenied(detail=_("Deletion not allowed for credential types managed by Tower"))
|
raise PermissionDenied(detail=_("Deletion not allowed for managed credential types"))
|
||||||
if instance.credentials.exists():
|
if instance.credentials.exists():
|
||||||
raise PermissionDenied(detail=_("Credential types that are in use cannot be deleted"))
|
raise PermissionDenied(detail=_("Credential types that are in use cannot be deleted"))
|
||||||
return super(CredentialTypeDetail, self).destroy(request, *args, **kwargs)
|
return super(CredentialTypeDetail, self).destroy(request, *args, **kwargs)
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ register(
|
|||||||
'ACTIVITY_STREAM_ENABLED',
|
'ACTIVITY_STREAM_ENABLED',
|
||||||
field_class=fields.BooleanField,
|
field_class=fields.BooleanField,
|
||||||
label=_('Enable Activity Stream'),
|
label=_('Enable Activity Stream'),
|
||||||
help_text=_('Enable capturing activity for the Tower activity stream.'),
|
help_text=_('Enable capturing activity for the activity stream.'),
|
||||||
category=_('System'),
|
category=_('System'),
|
||||||
category_slug='system',
|
category_slug='system',
|
||||||
feature_required='activity_streams',
|
feature_required='activity_streams',
|
||||||
@@ -28,7 +28,7 @@ register(
|
|||||||
'ACTIVITY_STREAM_ENABLED_FOR_INVENTORY_SYNC',
|
'ACTIVITY_STREAM_ENABLED_FOR_INVENTORY_SYNC',
|
||||||
field_class=fields.BooleanField,
|
field_class=fields.BooleanField,
|
||||||
label=_('Enable Activity Stream for Inventory Sync'),
|
label=_('Enable Activity Stream for Inventory Sync'),
|
||||||
help_text=_('Enable capturing activity for the Tower activity stream when running inventory sync.'),
|
help_text=_('Enable capturing activity for the activity stream when running inventory sync.'),
|
||||||
category=_('System'),
|
category=_('System'),
|
||||||
category_slug='system',
|
category_slug='system',
|
||||||
feature_required='activity_streams',
|
feature_required='activity_streams',
|
||||||
@@ -46,8 +46,8 @@ register(
|
|||||||
register(
|
register(
|
||||||
'TOWER_ADMIN_ALERTS',
|
'TOWER_ADMIN_ALERTS',
|
||||||
field_class=fields.BooleanField,
|
field_class=fields.BooleanField,
|
||||||
label=_('Enable Tower Administrator Alerts'),
|
label=_('Enable Administrator Alerts'),
|
||||||
help_text=_('Allow Tower to email Admin users for system events that may require attention.'),
|
help_text=_('Email Admin users for system events that may require attention.'),
|
||||||
category=_('System'),
|
category=_('System'),
|
||||||
category_slug='system',
|
category_slug='system',
|
||||||
)
|
)
|
||||||
@@ -99,9 +99,9 @@ register(
|
|||||||
'LICENSE',
|
'LICENSE',
|
||||||
field_class=fields.DictField,
|
field_class=fields.DictField,
|
||||||
default=_load_default_license_from_file,
|
default=_load_default_license_from_file,
|
||||||
label=_('Tower License'),
|
label=_('License'),
|
||||||
help_text=_('The license controls which features and functionality are '
|
help_text=_('The license controls which features and functionality are '
|
||||||
'enabled in Tower. Use /api/v1/config/ to update or change '
|
'enabled. Use /api/v1/config/ to update or change '
|
||||||
'the license.'),
|
'the license.'),
|
||||||
category=_('System'),
|
category=_('System'),
|
||||||
category_slug='system',
|
category_slug='system',
|
||||||
@@ -121,7 +121,7 @@ register(
|
|||||||
'AWX_PROOT_ENABLED',
|
'AWX_PROOT_ENABLED',
|
||||||
field_class=fields.BooleanField,
|
field_class=fields.BooleanField,
|
||||||
label=_('Enable job isolation'),
|
label=_('Enable job isolation'),
|
||||||
help_text=_('Isolates an Ansible job from protected parts of the Tower system to prevent exposing sensitive information.'),
|
help_text=_('Isolates an Ansible job from protected parts of the system to prevent exposing sensitive information.'),
|
||||||
category=_('Jobs'),
|
category=_('Jobs'),
|
||||||
category_slug='jobs',
|
category_slug='jobs',
|
||||||
)
|
)
|
||||||
@@ -292,7 +292,7 @@ register(
|
|||||||
min_value=0,
|
min_value=0,
|
||||||
default=0,
|
default=0,
|
||||||
label=_('Per-Host Ansible Fact Cache Timeout'),
|
label=_('Per-Host Ansible Fact Cache Timeout'),
|
||||||
help_text=_('Maximum time, in seconds, that Tower stored Ansible facts are considered valid since '
|
help_text=_('Maximum time, in seconds, that stored Ansible facts are considered valid since '
|
||||||
'the last time they were modified. Only valid, non-stale, facts will be accessible by '
|
'the last time they were modified. Only valid, non-stale, facts will be accessible by '
|
||||||
'a playbook. Note, this does not influence the deletion of ansible_facts from the database.'),
|
'a playbook. Note, this does not influence the deletion of ansible_facts from the database.'),
|
||||||
category=_('Jobs'),
|
category=_('Jobs'),
|
||||||
@@ -359,7 +359,7 @@ register(
|
|||||||
label=_('Loggers to send data to the log aggregator from'),
|
label=_('Loggers to send data to the log aggregator from'),
|
||||||
help_text=_('List of loggers that will send HTTP logs to the collector, these can '
|
help_text=_('List of loggers that will send HTTP logs to the collector, these can '
|
||||||
'include any or all of: \n'
|
'include any or all of: \n'
|
||||||
'awx - Tower service logs\n'
|
'awx - service logs\n'
|
||||||
'activity_stream - activity stream records\n'
|
'activity_stream - activity stream records\n'
|
||||||
'job_events - callback data from Ansible job events\n'
|
'job_events - callback data from Ansible job events\n'
|
||||||
'system_tracking - facts gathered from scan jobs.'),
|
'system_tracking - facts gathered from scan jobs.'),
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ class Command(BaseCommand):
|
|||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
if not feature_enabled('system_tracking'):
|
if not feature_enabled('system_tracking'):
|
||||||
raise CommandError("The System Tracking feature is not enabled for your Tower instance")
|
raise CommandError("The System Tracking feature is not enabled for your instance")
|
||||||
cleanup_facts = CleanupFacts()
|
cleanup_facts = CleanupFacts()
|
||||||
if not all([options[GRANULARITY], options[OLDER_THAN]]):
|
if not all([options[GRANULARITY], options[OLDER_THAN]]):
|
||||||
raise CommandError('Both --granularity and --older_than are required.')
|
raise CommandError('Both --granularity and --older_than are required.')
|
||||||
|
|||||||
@@ -848,7 +848,7 @@ class Command(NoArgsCommand):
|
|||||||
license_info = TaskEnhancer().validate_enhancements()
|
license_info = TaskEnhancer().validate_enhancements()
|
||||||
if license_info.get('license_key', 'UNLICENSED') == 'UNLICENSED':
|
if license_info.get('license_key', 'UNLICENSED') == 'UNLICENSED':
|
||||||
logger.error(LICENSE_NON_EXISTANT_MESSAGE)
|
logger.error(LICENSE_NON_EXISTANT_MESSAGE)
|
||||||
raise CommandError('No Tower license found!')
|
raise CommandError('No license found!')
|
||||||
available_instances = license_info.get('available_instances', 0)
|
available_instances = license_info.get('available_instances', 0)
|
||||||
free_instances = license_info.get('free_instances', 0)
|
free_instances = license_info.get('free_instances', 0)
|
||||||
time_remaining = license_info.get('time_remaining', 0)
|
time_remaining = license_info.get('time_remaining', 0)
|
||||||
|
|||||||
@@ -829,7 +829,7 @@ class InventorySourceOptions(BaseModel):
|
|||||||
SOURCE_CHOICES = [
|
SOURCE_CHOICES = [
|
||||||
('', _('Manual')),
|
('', _('Manual')),
|
||||||
('file', _('File, Directory or Script')),
|
('file', _('File, Directory or Script')),
|
||||||
('scm', _('Sourced from a project in Tower')),
|
('scm', _('Sourced from a Project')),
|
||||||
('ec2', _('Amazon EC2')),
|
('ec2', _('Amazon EC2')),
|
||||||
('gce', _('Google Compute Engine')),
|
('gce', _('Google Compute Engine')),
|
||||||
('azure', _('Microsoft Azure Classic (deprecated)')),
|
('azure', _('Microsoft Azure Classic (deprecated)')),
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ class Schedule(CommonModel):
|
|||||||
)
|
)
|
||||||
enabled = models.BooleanField(
|
enabled = models.BooleanField(
|
||||||
default=True,
|
default=True,
|
||||||
help_text=_("Enables processing of this schedule by Tower.")
|
help_text=_("Enables processing of this schedule.")
|
||||||
)
|
)
|
||||||
dtstart = models.DateTimeField(
|
dtstart = models.DateTimeField(
|
||||||
null=True,
|
null=True,
|
||||||
|
|||||||
@@ -474,7 +474,7 @@ class UnifiedJob(PolymorphicModel, PasswordFieldsModel, CommonModelNameNotUnique
|
|||||||
blank=True,
|
blank=True,
|
||||||
default='',
|
default='',
|
||||||
editable=False,
|
editable=False,
|
||||||
help_text=_("The Tower node the job executed on."),
|
help_text=_("The node the job executed on."),
|
||||||
)
|
)
|
||||||
notifications = models.ManyToManyField(
|
notifications = models.ManyToManyField(
|
||||||
'Notification',
|
'Notification',
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ HIDDEN_PASSWORD = '**********'
|
|||||||
|
|
||||||
OPENSSH_KEY_ERROR = u'''\
|
OPENSSH_KEY_ERROR = u'''\
|
||||||
It looks like you're trying to use a private key in OpenSSH format, which \
|
It looks like you're trying to use a private key in OpenSSH format, which \
|
||||||
isn't supported by the installed version of OpenSSH on this Tower instance. \
|
isn't supported by the installed version of OpenSSH on this instance. \
|
||||||
Try upgrading OpenSSH or providing your private key in an different format. \
|
Try upgrading OpenSSH or providing your private key in an different format. \
|
||||||
'''
|
'''
|
||||||
|
|
||||||
@@ -79,7 +79,7 @@ def celery_startup(conf=None, **kwargs):
|
|||||||
# Re-init all schedules
|
# Re-init all schedules
|
||||||
# NOTE: Rework this during the Rampart work
|
# NOTE: Rework this during the Rampart work
|
||||||
startup_logger = logging.getLogger('awx.main.tasks')
|
startup_logger = logging.getLogger('awx.main.tasks')
|
||||||
startup_logger.info("Syncing Tower Schedules")
|
startup_logger.info("Syncing Schedules")
|
||||||
for sch in Schedule.objects.all():
|
for sch in Schedule.objects.all():
|
||||||
try:
|
try:
|
||||||
sch.update_computed_fields()
|
sch.update_computed_fields()
|
||||||
@@ -190,7 +190,7 @@ def cluster_node_heartbeat(self):
|
|||||||
if other_inst.version == "":
|
if other_inst.version == "":
|
||||||
continue
|
continue
|
||||||
if Version(other_inst.version.split('-', 1)[0]) > Version(tower_application_version) and not settings.DEBUG:
|
if Version(other_inst.version.split('-', 1)[0]) > Version(tower_application_version) and not settings.DEBUG:
|
||||||
logger.error("Host {} reports Tower version {}, but this node {} is at {}, shutting down".format(other_inst.hostname,
|
logger.error("Host {} reports version {}, but this node {} is at {}, shutting down".format(other_inst.hostname,
|
||||||
other_inst.version,
|
other_inst.version,
|
||||||
inst.hostname,
|
inst.hostname,
|
||||||
inst.version))
|
inst.version))
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ register(
|
|||||||
field_class=fields.LDAPSearchField,
|
field_class=fields.LDAPSearchField,
|
||||||
default=[],
|
default=[],
|
||||||
label=_('LDAP Group Search'),
|
label=_('LDAP Group Search'),
|
||||||
help_text=_('Users in Tower are mapped to organizations based on their '
|
help_text=_('Users are mapped to organizations based on their '
|
||||||
'membership in LDAP groups. This setting defines the LDAP search '
|
'membership in LDAP groups. This setting defines the LDAP search '
|
||||||
'query to find groups. Note that this, unlike the user search '
|
'query to find groups. Note that this, unlike the user search '
|
||||||
'above, does not support LDAPSearchUnion.'),
|
'above, does not support LDAPSearchUnion.'),
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ return {
|
|||||||
dataTitle: 'Source Regions',
|
dataTitle: 'Source Regions',
|
||||||
dataPlacement: 'right',
|
dataPlacement: 'right',
|
||||||
awPopOver: "<p>Click on the regions field to see a list of regions for your cloud provider. You can select multiple regions, " +
|
awPopOver: "<p>Click on the regions field to see a list of regions for your cloud provider. You can select multiple regions, " +
|
||||||
"or choose <em>All</em> to include all regions. Tower will only be updated with Hosts associated with the selected regions." +
|
"or choose <em>All</em> to include all regions. Only Hosts associated with the selected regions will be updated." +
|
||||||
"</p>",
|
"</p>",
|
||||||
dataContainer: 'body',
|
dataContainer: 'body',
|
||||||
ngDisabled: '!(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd)'
|
ngDisabled: '!(inventory_source_obj.summary_fields.user_capabilities.edit || canAdd)'
|
||||||
@@ -138,7 +138,7 @@ return {
|
|||||||
dataTitle: 'Instance Filters',
|
dataTitle: 'Instance Filters',
|
||||||
dataPlacement: 'right',
|
dataPlacement: 'right',
|
||||||
awPopOver: "<p>Provide a comma-separated list of filter expressions. " +
|
awPopOver: "<p>Provide a comma-separated list of filter expressions. " +
|
||||||
"Hosts are imported to Tower when <em>ANY</em> of the filters match.</p>" +
|
"Hosts are imported when <em>ANY</em> of the filters match.</p>" +
|
||||||
"Limit to hosts having a tag:<br />\n" +
|
"Limit to hosts having a tag:<br />\n" +
|
||||||
"<blockquote>tag-key=TowerManaged</blockquote>\n" +
|
"<blockquote>tag-key=TowerManaged</blockquote>\n" +
|
||||||
"Limit to hosts using either key pair:<br />\n" +
|
"Limit to hosts using either key pair:<br />\n" +
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<a ui-sref="credentials" class="SetupItem">
|
<a ui-sref="credentials" class="SetupItem">
|
||||||
<h4 class="SetupItem-title" translate>Credentials</h4>
|
<h4 class="SetupItem-title" translate>Credentials</h4>
|
||||||
<p class="SetupItem-description" translate>
|
<p class="SetupItem-description" translate>
|
||||||
Add passwords, SSH keys, etc. for Tower to use when launching jobs against machines, or when syncing inventories or projects.
|
Add passwords, SSH keys, and other credentials to use when launching jobs against machines, or when syncing inventories or projects.
|
||||||
</p>
|
</p>
|
||||||
</a>
|
</a>
|
||||||
<a ui-sref="managementJobsList" class="SetupItem" ng-if="user_is_superuser || user_is_system_auditor">
|
<a ui-sref="managementJobsList" class="SetupItem" ng-if="user_is_superuser || user_is_system_auditor">
|
||||||
|
|||||||
@@ -338,7 +338,7 @@ function(NotificationsList, CompletedJobsList, i18n) {
|
|||||||
multiSelect: true,
|
multiSelect: true,
|
||||||
dataTitle: i18n._('Labels'),
|
dataTitle: i18n._('Labels'),
|
||||||
dataPlacement: 'right',
|
dataPlacement: 'right',
|
||||||
awPopOver: "<p>" + i18n._("Optional labels that describe this job template, such as 'dev' or 'test'. Labels can be used to group and filter job templates and completed jobs in the Tower display.") + "</p>",
|
awPopOver: "<p>" + i18n._("Optional labels that describe this job template, such as 'dev' or 'test'. Labels can be used to group and filter job templates and completed jobs.") + "</p>",
|
||||||
dataContainer: 'body',
|
dataContainer: 'body',
|
||||||
ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)'
|
ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAddJobTemplate)'
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ export default ['NotificationsList', 'i18n', function(NotificationsList, i18n) {
|
|||||||
multiSelect: true,
|
multiSelect: true,
|
||||||
dataTitle: i18n._('Labels'),
|
dataTitle: i18n._('Labels'),
|
||||||
dataPlacement: 'right',
|
dataPlacement: 'right',
|
||||||
awPopOver: "<p>" + i18n._("Optional labels that describe this job template, such as 'dev' or 'test'. Labels can be used to group and filter job templates and completed jobs in the Tower display.") + "</p>",
|
awPopOver: "<p>" + i18n._("Optional labels that describe this job template, such as 'dev' or 'test'. Labels can be used to group and filter job templates and completed jobs.") + "</p>",
|
||||||
dataContainer: 'body',
|
dataContainer: 'body',
|
||||||
ngDisabled: '!(workflow_job_template_obj.summary_fields.user_capabilities.edit || canAddWorkflowJobTemplate)'
|
ngDisabled: '!(workflow_job_template_obj.summary_fields.user_capabilities.edit || canAddWorkflowJobTemplate)'
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user