2025-01-23 16:47:52 +13:00
< page-header ng-if = "ctrl.state.viewReady" title = "'Create from code'" breadcrumbs = "['Deploy Kubernetes resources']" reload = "true" > < / page-header >
2020-07-06 11:21:03 +12:00
< kubernetes-view-loading view-ready = "ctrl.state.viewReady" > < / kubernetes-view-loading >
< div ng-if = "ctrl.state.viewReady" >
< kubernetes-feedback-panel > < / kubernetes-feedback-panel >
2022-07-11 14:05:23 +12:00
< div class = "row kubernetes-deploy" >
2020-07-06 11:21:03 +12:00
< div class = "col-sm-12" >
< rd-widget >
< rd-widget-body >
< uib-tabset active = "ctrl.state.activeTab" justified = "true" type = "pills" >
< uib-tab index = "0" >
2022-11-28 15:00:28 +13:00
< uib-tab-heading > < pr-icon icon = "'code'" > < / pr-icon > Deploy < / uib-tab-heading >
2024-03-11 13:39:04 +13:00
< form class = "form-horizontal mt-6" name = "ctrl.deploymentForm" >
2023-11-13 09:37:52 +13:00
< div class = "col-sm-12 form-section-title" > Deploy from < / div >
< box-selector
slim="true"
radio-name="'method'"
value="ctrl.state.BuildMethod"
options="ctrl.methodOptions"
data-cy="k8sAppDeploy-buildSelector"
on-change="(ctrl.onChangeMethod)"
>< / box-selector >
<!-- namespace -->
2023-11-15 11:35:39 +13:00
< div class = "col-sm-12 form-section-title !mt-4" > Deploy to < / div >
2023-11-13 09:37:52 +13:00
< div class = "form-group" ng-if = "ctrl.formValues.Namespace && ctrl.state.BuildMethod !== ctrl.BuildMethods.HELM" >
2022-07-11 14:05:23 +12:00
< label for = "toggle_logo" class = "col-lg-2 col-sm-3 control-label text-left" >
Use namespace(s) specified from manifest
2022-07-04 02:21:25 +03:00
< portainer-tooltip message = "'If you have defined namespaces in your deployment file turning this on will enforce the use of those only in the deployment'" >
2022-03-24 21:28:53 +13:00
< / portainer-tooltip >
2022-07-11 14:05:23 +12:00
< / label >
2025-06-05 13:13:45 +12:00
< div class = "col-sm-9 col-lg-10 vertical-center pt-1" >
2022-07-11 14:05:23 +12:00
< label class = "switch" >
2024-04-11 12:11:38 +12:00
< input type = "checkbox" name = "toggle_logo" ng-model = "ctrl.formValues.namespace_toggle" data-cy = "use-namespce-from-menifest" / >
2022-08-01 16:44:56 +12:00
< span class = "slider round" > < / span >
2022-07-11 14:05:23 +12:00
< / label >
2020-07-06 11:21:03 +12:00
< / div >
< / div >
2023-11-13 09:37:52 +13:00
2023-03-07 21:09:41 +13:00
< div class = "form-group" ng-if = "ctrl.formValues.Namespace" >
< label for = "target_node" class = "col-lg-2 col-sm-3 control-label text-left" > Namespace< / label >
2025-06-05 13:13:45 +12:00
< div class = "col-sm-9 col-lg-10" >
2023-03-07 21:09:41 +13:00
< select
2023-11-13 09:37:52 +13:00
ng-if="!ctrl.formValues.namespace_toggle || ctrl.state.BuildMethod === ctrl.BuildMethods.HELM"
2024-04-11 12:11:38 +12:00
data-cy="namespace-select"
2023-11-13 09:37:52 +13:00
ng-disabled="ctrl.formValues.namespace_toggle & & ctrl.state.BuildMethod !== ctrl.BuildMethods.HELM"
2023-03-07 21:09:41 +13:00
class="form-control"
ng-model="ctrl.formValues.Namespace"
2024-02-12 10:54:29 +13:00
ng-change="ctrl.onChangeNamespace()"
2023-03-07 21:09:41 +13:00
ng-options="namespace.Name as namespace.Name for namespace in ctrl.namespaces"
>< / select >
2023-11-15 11:35:39 +13:00
< span ng-if = "ctrl.formValues.namespace_toggle && ctrl.state.BuildMethod !== ctrl.BuildMethods.HELM" class = "small text-muted pt-[7px]"
2023-11-13 09:37:52 +13:00
>Namespaces specified in the manifest will be used< /span
>
2023-03-07 21:09:41 +13:00
< / div >
< / div >
2021-09-22 16:01:28 +12:00
< div class = "form-group" ng-if = "!ctrl.formValues.Namespace" >
2022-09-15 11:09:19 +12:00
< div class = "col-sm-12 small text-warning" >
2022-11-28 15:00:28 +13:00
< pr-icon icon = "'alert-triangle'" mode = "'warning'" > < / pr-icon >
2021-09-22 16:01:28 +12:00
You do not have access to any namespace. Contact your administrator to get access to a namespace.
< / div >
< / div >
2021-08-18 14:56:13 +03:00
2021-09-30 12:58:10 +13:00
< div class = "form-group" >
2024-02-01 11:34:33 +13:00
< label for = "name" class = "col-lg-2 col-sm-3 control-label text-left" ng-class = "{ required: ctrl.state.BuildMethod === ctrl.BuildMethods.HELM }" > Name< / label >
2025-06-05 13:13:45 +12:00
< div class = "col-sm-9 col-lg-10 small text-muted pt-[7px]" ng-if = "ctrl.state.BuildMethod !== ctrl.BuildMethods.HELM" >
2023-10-25 08:59:10 +13:00
Resource names specified in the manifest will be used
< / div >
2025-06-05 13:13:45 +12:00
< div class = "col-sm-9 col-lg-10" ng-if = "ctrl.state.BuildMethod === ctrl.BuildMethods.HELM" >
2023-10-18 11:37:03 +13:00
< input
type="text"
2024-04-11 12:11:38 +12:00
data-cy="name-input"
2023-10-18 11:37:03 +13:00
class="form-control"
ng-model="ctrl.formValues.Name"
id="name"
name="name"
2023-10-25 08:59:10 +13:00
placeholder="e.g. my-app"
2023-10-18 11:37:03 +13:00
required="ctrl.state.BuildMethod === ctrl.BuildMethods.HELM"
/>
< div class = "small text-warning mt-2" >
< div ng-messages = "ctrl.deploymentForm.name.$error" >
< p ng-message = "required" > < pr-icon icon = "'alert-triangle'" mode = "'warning'" > < / pr-icon > This field is required.< / p >
< / div >
< / div >
< / div >
2021-09-30 12:58:10 +13:00
< / div >
2024-02-20 17:25:19 +13:00
< div ng-if = "!ctrl.deploymentOptions.hideStacksFunctionality && ctrl.state.BuildMethod !== ctrl.BuildMethods.HELM" >
2024-04-11 12:11:38 +12:00
< div class = "mb-4 w-fit" >
2024-02-20 17:25:19 +13:00
< stack-name-label-insight > < / stack-name-label-insight >
< / div >
2024-06-17 09:24:54 +12:00
< kube-stack-name
stack-name="ctrl.formValues.StackName"
set-stack-name="(ctrl.setStackName)"
stacks="ctrl.stacks"
error="ctrl.state.stackNameError"
>< / kube-stack-name >
2024-02-15 10:45:59 +13:00
< / div >
2023-11-13 09:37:52 +13:00
<!-- !namespace -->
2021-09-02 08:28:51 +03:00
2021-06-17 09:47:32 +12:00
<!-- repository -->
2021-09-30 12:58:10 +13:00
< git-form
ng-if="ctrl.state.BuildMethod === ctrl.BuildMethods.GIT"
2023-02-23 01:43:33 +05:30
value="ctrl.formValues"
2021-09-30 12:58:10 +13:00
on-change="(ctrl.onChangeFormValues)"
2023-05-05 09:20:20 +12:00
environment-type="KUBERNETES"
is-force-pull-visible="false"
2023-02-23 01:43:33 +05:30
is-additional-files-field-visible="true"
is-auth-explanation-visible="true"
deploy-method="{{ ctrl.state.DeployType === ctrl.ManifestDeployTypes.COMPOSE ? 'compose' : 'manifest' }}"
base-webhook-url="{{ ctrl.state.baseWebhookUrl }}"
2023-03-02 17:07:50 +02:00
webhook-id="{{ ctrl.state.webhookId }}"
2024-03-15 16:57:51 +13:00
webhooks-docs="/user/kubernetes/applications/webhooks"
2021-09-30 12:58:10 +13:00
>< / git-form >
2021-06-17 09:47:32 +12:00
<!-- !repository -->
2022-05-31 13:00:47 +03:00
< div ng-show = "ctrl.state.BuildMethod === ctrl.BuildMethods.CUSTOM_TEMPLATE" >
2023-11-13 09:37:52 +13:00
< div class = "col-sm-12 form-section-title !mt-4" > Custom template < / div >
2022-05-31 13:00:47 +03:00
< custom-template-selector
new-template-path="kubernetes.templates.custom.new"
stack-type="3"
on-change="(ctrl.onChangeTemplateId)"
value="ctrl.state.templateId"
2024-11-12 10:46:37 +13:00
is-load-failed="ctrl.state.BuildMethod === ctrl.BuildMethods.CUSTOM_TEMPLATE & & ctrl.state.templateId & & ctrl.state.templateLoadFailed"
2022-05-31 13:00:47 +03:00
>< / custom-template-selector >
< custom-templates-variables-field
2022-07-08 04:15:23 +02:00
ng-if="ctrl.isTemplateVariablesEnabled & & ctrl.state.template"
2022-05-31 13:00:47 +03:00
definitions="ctrl.state.template.Variables"
value="ctrl.formValues.Variables"
on-change="(ctrl.onChangeTemplateVariables)"
>< / custom-templates-variables-field >
< / div >
2021-09-02 08:28:51 +03:00
2021-06-17 09:47:32 +12:00
<!-- editor -->
2022-08-01 16:44:56 +12:00
< div class = "mt-4" >
< web-editor-form
ng-if="ctrl.state.BuildMethod === ctrl.BuildMethods.WEB_EDITOR || (ctrl.state.BuildMethod === ctrl.BuildMethods.CUSTOM_TEMPLATE & & ctrl.state.templateId)"
identifier="kubernetes-deploy-editor"
value="ctrl.formValues.EditorContent"
on-change="(ctrl.onChangeFileContent)"
ng-required="true"
yml="true"
2023-03-30 12:26:32 +03:00
placeholder="Define or paste the content of your manifest file here"
2023-04-04 12:44:42 +12:00
read-only="ctrl.state.isEditorReadOnly"
2022-08-01 16:44:56 +12:00
>
< editor-description >
2023-03-30 12:26:32 +03:00
< p class = "vertical-center" >
< pr-icon icon = "'info'" mode = "'primary'" > < / pr-icon >
This feature allows you to deploy any kind of Kubernetes resource in this environment (Deployment, Secret, ConfigMap...).
< / p >
< p >
You can get more information about Kubernetes file format in the
< a href = "https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/" target = "_blank" > official documentation< / a > .
< / p >
2022-08-01 16:44:56 +12:00
< / editor-description >
< / web-editor-form >
< / div >
2020-07-06 11:21:03 +12:00
<!-- !editor -->
2021-09-07 12:37:26 +12:00
2021-09-03 17:37:34 +12:00
<!-- url -->
< div ng-show = "ctrl.state.BuildMethod === ctrl.BuildMethods.URL" >
2022-01-17 07:53:32 +02:00
< div class = "col-sm-12 form-section-title" > URL < / div >
2021-09-03 17:37:34 +12:00
< div class = "form-group" >
2022-01-17 07:53:32 +02:00
< span class = "col-sm-12 text-muted small" > Indicate the URL to the manifest. < / span >
2021-09-03 17:37:34 +12:00
< / div >
< div class = "form-group" >
2022-08-13 00:22:45 +06:00
< label for = "manifest_url" class = "col-sm-3 col-lg-2 control-label required text-left" > URL< / label >
2025-06-05 13:13:45 +12:00
< div class = "col-sm-9 col-lg-10" >
2021-09-03 17:37:34 +12:00
< input
type="text"
2024-04-11 12:11:38 +12:00
data-cy="k8sAppDeploy-urlFileUrl"
2021-09-03 17:37:34 +12:00
class="form-control"
ng-model="ctrl.formValues.ManifestURL"
id="manifest_url"
placeholder="https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/controllers/nginx-deployment.yaml"
/>
< / div >
< / div >
2021-09-07 12:37:26 +12:00
< / div >
2021-09-03 17:37:34 +12:00
<!-- !url -->
2023-10-09 11:20:44 +13:00
<!-- Helm -->
< div ng-show = "ctrl.state.BuildMethod === ctrl.BuildMethods.HELM" >
2023-10-12 11:02:09 +13:00
< div class = "col-sm-12 form-section-title" ng-if = "ctrl.state.selectedHelmChart" > Selected Helm chart< / div >
2025-04-08 12:51:36 +12:00
< helm-templates-view on-select-helm-chart = "(ctrl.onSelectHelmChart)" namespace = "ctrl.formValues.Namespace" name = "ctrl.formValues.Name" / >
2023-10-09 11:20:44 +13:00
< / div >
<!-- !Helm -->
2020-07-06 11:21:03 +12:00
<!-- actions -->
2023-10-09 11:20:44 +13:00
< div class = "col-sm-12 form-section-title !mt-4" ng-if = "ctrl.state.BuildMethod !== ctrl.BuildMethods.HELM" > Actions < / div >
< div class = "form-group" ng-if = "ctrl.state.BuildMethod !== ctrl.BuildMethods.HELM" >
2020-07-06 11:21:03 +12:00
< div class = "col-sm-12" >
2021-08-26 12:05:28 +12:00
< button
type="button"
2022-08-13 00:22:45 +06:00
class="btn btn-primary btn-sm !ml-0"
2023-02-23 01:43:33 +05:30
ng-disabled="!ctrl.deploymentForm.$valid || ctrl.disableDeploy()"
2021-08-26 12:05:28 +12:00
ng-click="ctrl.deploy()"
button-spinner="ctrl.state.actionInProgress"
data-cy="k8sAppDeploy-deployButton"
2021-09-05 13:03:48 +03:00
analytics-on
analytics-category="kubernetes"
analytics-event="kubernetes-application-advanced-deployment"
analytics-properties="ctrl.buildAnalyticsProperties()"
2021-08-26 12:05:28 +12:00
>
2020-07-06 11:21:03 +12:00
< span ng-hide = "ctrl.state.actionInProgress" > Deploy< / span >
< span ng-show = "ctrl.state.actionInProgress" > Deployment in progress...< / span >
< / button >
< / div >
< / div >
<!-- !actions -->
< / form >
< / uib-tab >
< uib-tab index = "1" disable = "ctrl.state.tabLogsDisabled" >
2022-11-28 15:00:28 +13:00
< uib-tab-heading > < pr-icon icon = "'file-text'" > < / pr-icon > Logs < / uib-tab-heading >
2022-08-01 16:44:56 +12:00
< form class = "form-horizontal mt-3" >
2020-07-06 11:21:03 +12:00
< div class = "form-group" ng-if = "ctrl.state.activeTab === 1" >
< div class = "col-sm-12" >
2023-05-17 14:07:21 +12:00
< code-editor identifier = "kubernetes-deploy-logs" yml = "true" read-only = "true" value = "ctrl.errorLog" > < / code-editor >
2020-07-06 11:21:03 +12:00
< / div >
< / div >
< / form >
< / uib-tab >
< / uib-tabset >
< / rd-widget-body >
< / rd-widget >
< / div >
< / div >
< / div >