This commit is contained in:
0
nhncloud/__init__.py
Normal file
0
nhncloud/__init__.py
Normal file
13
nhncloud/admin.py
Normal file
13
nhncloud/admin.py
Normal file
@ -0,0 +1,13 @@
|
||||
from django.contrib import admin
|
||||
from .models import Cluster
|
||||
|
||||
admin.site.register(Cluster)
|
||||
|
||||
# class CategoryAdmin(admin.ModelAdmin):
|
||||
# prepopulated_fields = {'slug': ('name',)}
|
||||
|
||||
# class TagAdmin(admin.ModelAdmin):
|
||||
# prepopulated_fields = {'slug': ('name',)}
|
||||
|
||||
# admin.site.register(Category, CategoryAdmin)
|
||||
# admin.site.register(Tag, TagAdmin)
|
6
nhncloud/apps.py
Normal file
6
nhncloud/apps.py
Normal file
@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class NhncloudConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'nhncloud'
|
661
nhncloud/manifests/lb_ingress.yaml
Normal file
661
nhncloud/manifests/lb_ingress.yaml
Normal file
@ -0,0 +1,661 @@
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
name: ingress-nginx
|
||||
---
|
||||
apiVersion: v1
|
||||
automountServiceAccountToken: true
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: controller
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
name: ingress-nginx
|
||||
namespace: ingress-nginx
|
||||
---
|
||||
apiVersion: v1
|
||||
automountServiceAccountToken: true
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: admission-webhook
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
name: ingress-nginx-admission
|
||||
namespace: ingress-nginx
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: Role
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: controller
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
name: ingress-nginx
|
||||
namespace: ingress-nginx
|
||||
rules:
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- namespaces
|
||||
verbs:
|
||||
- get
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- configmaps
|
||||
- pods
|
||||
- secrets
|
||||
- endpoints
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- watch
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- services
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- watch
|
||||
- apiGroups:
|
||||
- networking.k8s.io
|
||||
resources:
|
||||
- ingresses
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- watch
|
||||
- apiGroups:
|
||||
- networking.k8s.io
|
||||
resources:
|
||||
- ingresses/status
|
||||
verbs:
|
||||
- update
|
||||
- apiGroups:
|
||||
- networking.k8s.io
|
||||
resources:
|
||||
- ingressclasses
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- watch
|
||||
- apiGroups:
|
||||
- coordination.k8s.io
|
||||
resourceNames:
|
||||
- ingress-nginx-leader
|
||||
resources:
|
||||
- leases
|
||||
verbs:
|
||||
- get
|
||||
- update
|
||||
- apiGroups:
|
||||
- coordination.k8s.io
|
||||
resources:
|
||||
- leases
|
||||
verbs:
|
||||
- create
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- events
|
||||
verbs:
|
||||
- create
|
||||
- patch
|
||||
- apiGroups:
|
||||
- discovery.k8s.io
|
||||
resources:
|
||||
- endpointslices
|
||||
verbs:
|
||||
- list
|
||||
- watch
|
||||
- get
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: Role
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: admission-webhook
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
name: ingress-nginx-admission
|
||||
namespace: ingress-nginx
|
||||
rules:
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- secrets
|
||||
verbs:
|
||||
- get
|
||||
- create
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
name: ingress-nginx
|
||||
rules:
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- configmaps
|
||||
- endpoints
|
||||
- nodes
|
||||
- pods
|
||||
- secrets
|
||||
- namespaces
|
||||
verbs:
|
||||
- list
|
||||
- watch
|
||||
- apiGroups:
|
||||
- coordination.k8s.io
|
||||
resources:
|
||||
- leases
|
||||
verbs:
|
||||
- list
|
||||
- watch
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- nodes
|
||||
verbs:
|
||||
- get
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- services
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- watch
|
||||
- apiGroups:
|
||||
- networking.k8s.io
|
||||
resources:
|
||||
- ingresses
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- watch
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- events
|
||||
verbs:
|
||||
- create
|
||||
- patch
|
||||
- apiGroups:
|
||||
- networking.k8s.io
|
||||
resources:
|
||||
- ingresses/status
|
||||
verbs:
|
||||
- update
|
||||
- apiGroups:
|
||||
- networking.k8s.io
|
||||
resources:
|
||||
- ingressclasses
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- watch
|
||||
- apiGroups:
|
||||
- discovery.k8s.io
|
||||
resources:
|
||||
- endpointslices
|
||||
verbs:
|
||||
- list
|
||||
- watch
|
||||
- get
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: admission-webhook
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
name: ingress-nginx-admission
|
||||
rules:
|
||||
- apiGroups:
|
||||
- admissionregistration.k8s.io
|
||||
resources:
|
||||
- validatingwebhookconfigurations
|
||||
verbs:
|
||||
- get
|
||||
- update
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: RoleBinding
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: controller
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
name: ingress-nginx
|
||||
namespace: ingress-nginx
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: Role
|
||||
name: ingress-nginx
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: ingress-nginx
|
||||
namespace: ingress-nginx
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: RoleBinding
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: admission-webhook
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
name: ingress-nginx-admission
|
||||
namespace: ingress-nginx
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: Role
|
||||
name: ingress-nginx-admission
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: ingress-nginx-admission
|
||||
namespace: ingress-nginx
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
name: ingress-nginx
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: ingress-nginx
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: ingress-nginx
|
||||
namespace: ingress-nginx
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: admission-webhook
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
name: ingress-nginx-admission
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: ingress-nginx-admission
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: ingress-nginx-admission
|
||||
namespace: ingress-nginx
|
||||
---
|
||||
apiVersion: v1
|
||||
data:
|
||||
allow-snippet-annotations: "false"
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: controller
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
name: ingress-nginx-controller
|
||||
namespace: ingress-nginx
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: controller
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
name: ingress-nginx-controller
|
||||
namespace: ingress-nginx
|
||||
spec:
|
||||
ipFamilies:
|
||||
- IPv4
|
||||
ipFamilyPolicy: SingleStack
|
||||
ports:
|
||||
- appProtocol: http
|
||||
name: http
|
||||
port: 80
|
||||
protocol: TCP
|
||||
targetPort: http
|
||||
- appProtocol: https
|
||||
name: https
|
||||
port: 443
|
||||
protocol: TCP
|
||||
targetPort: https
|
||||
selector:
|
||||
app.kubernetes.io/component: controller
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
type: LoadBalancer
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: controller
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
name: ingress-nginx-controller-admission
|
||||
namespace: ingress-nginx
|
||||
spec:
|
||||
ports:
|
||||
- appProtocol: https
|
||||
name: https-webhook
|
||||
port: 443
|
||||
targetPort: webhook
|
||||
selector:
|
||||
app.kubernetes.io/component: controller
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
type: ClusterIP
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: controller
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
name: ingress-nginx-controller
|
||||
namespace: ingress-nginx
|
||||
spec:
|
||||
minReadySeconds: 0
|
||||
revisionHistoryLimit: 10
|
||||
selector:
|
||||
matchLabels:
|
||||
app.kubernetes.io/component: controller
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
strategy:
|
||||
rollingUpdate:
|
||||
maxUnavailable: 1
|
||||
type: RollingUpdate
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: controller
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
spec:
|
||||
containers:
|
||||
- args:
|
||||
- /nginx-ingress-controller
|
||||
- --election-id=ingress-nginx-leader
|
||||
- --controller-class=k8s.io/ingress-nginx
|
||||
- --ingress-class=nginx
|
||||
- --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
|
||||
- --validating-webhook=:8443
|
||||
- --validating-webhook-certificate=/usr/local/certificates/cert
|
||||
- --validating-webhook-key=/usr/local/certificates/key
|
||||
- --enable-metrics=false
|
||||
env:
|
||||
- name: POD_NAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: POD_NAMESPACE
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.namespace
|
||||
- name: LD_PRELOAD
|
||||
value: /usr/local/lib/libmimalloc.so
|
||||
image: registry.k8s.io/ingress-nginx/controller:v1.11.2@sha256:d5f8217feeac4887cb1ed21f27c2674e58be06bd8f5184cacea2a69abaf78dce
|
||||
imagePullPolicy: IfNotPresent
|
||||
lifecycle:
|
||||
preStop:
|
||||
exec:
|
||||
command:
|
||||
- /wait-shutdown
|
||||
livenessProbe:
|
||||
failureThreshold: 5
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 10254
|
||||
scheme: HTTP
|
||||
initialDelaySeconds: 10
|
||||
periodSeconds: 10
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 1
|
||||
name: controller
|
||||
ports:
|
||||
- containerPort: 80
|
||||
name: http
|
||||
protocol: TCP
|
||||
- containerPort: 443
|
||||
name: https
|
||||
protocol: TCP
|
||||
- containerPort: 8443
|
||||
name: webhook
|
||||
protocol: TCP
|
||||
readinessProbe:
|
||||
failureThreshold: 3
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 10254
|
||||
scheme: HTTP
|
||||
initialDelaySeconds: 10
|
||||
periodSeconds: 10
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 1
|
||||
resources:
|
||||
requests:
|
||||
cpu: 100m
|
||||
memory: 90Mi
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
add:
|
||||
- NET_BIND_SERVICE
|
||||
drop:
|
||||
- ALL
|
||||
readOnlyRootFilesystem: false
|
||||
runAsNonRoot: true
|
||||
runAsUser: 101
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
volumeMounts:
|
||||
- mountPath: /usr/local/certificates/
|
||||
name: webhook-cert
|
||||
readOnly: true
|
||||
dnsPolicy: ClusterFirst
|
||||
nodeSelector:
|
||||
kubernetes.io/os: linux
|
||||
serviceAccountName: ingress-nginx
|
||||
terminationGracePeriodSeconds: 300
|
||||
volumes:
|
||||
- name: webhook-cert
|
||||
secret:
|
||||
secretName: ingress-nginx-admission
|
||||
---
|
||||
apiVersion: batch/v1
|
||||
kind: Job
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: admission-webhook
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
name: ingress-nginx-admission-create
|
||||
namespace: ingress-nginx
|
||||
spec:
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: admission-webhook
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
name: ingress-nginx-admission-create
|
||||
spec:
|
||||
containers:
|
||||
- args:
|
||||
- create
|
||||
- --host=ingress-nginx-controller-admission,ingress-nginx-controller-admission.$(POD_NAMESPACE).svc
|
||||
- --namespace=$(POD_NAMESPACE)
|
||||
- --secret-name=ingress-nginx-admission
|
||||
env:
|
||||
- name: POD_NAMESPACE
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.namespace
|
||||
image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.3@sha256:a320a50cc91bd15fd2d6fa6de58bd98c1bd64b9a6f926ce23a600d87043455a3
|
||||
imagePullPolicy: IfNotPresent
|
||||
name: create
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
readOnlyRootFilesystem: true
|
||||
runAsNonRoot: true
|
||||
runAsUser: 65532
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
nodeSelector:
|
||||
kubernetes.io/os: linux
|
||||
restartPolicy: OnFailure
|
||||
serviceAccountName: ingress-nginx-admission
|
||||
---
|
||||
apiVersion: batch/v1
|
||||
kind: Job
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: admission-webhook
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
name: ingress-nginx-admission-patch
|
||||
namespace: ingress-nginx
|
||||
spec:
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: admission-webhook
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
name: ingress-nginx-admission-patch
|
||||
spec:
|
||||
containers:
|
||||
- args:
|
||||
- patch
|
||||
- --webhook-name=ingress-nginx-admission
|
||||
- --namespace=$(POD_NAMESPACE)
|
||||
- --patch-mutating=false
|
||||
- --secret-name=ingress-nginx-admission
|
||||
- --patch-failure-policy=Fail
|
||||
env:
|
||||
- name: POD_NAMESPACE
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.namespace
|
||||
image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.3@sha256:a320a50cc91bd15fd2d6fa6de58bd98c1bd64b9a6f926ce23a600d87043455a3
|
||||
imagePullPolicy: IfNotPresent
|
||||
name: patch
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
readOnlyRootFilesystem: true
|
||||
runAsNonRoot: true
|
||||
runAsUser: 65532
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
nodeSelector:
|
||||
kubernetes.io/os: linux
|
||||
restartPolicy: OnFailure
|
||||
serviceAccountName: ingress-nginx-admission
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: IngressClass
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: controller
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
name: nginx
|
||||
spec:
|
||||
controller: k8s.io/ingress-nginx
|
||||
---
|
||||
apiVersion: admissionregistration.k8s.io/v1
|
||||
kind: ValidatingWebhookConfiguration
|
||||
metadata:
|
||||
labels:
|
||||
app.kubernetes.io/component: admission-webhook
|
||||
app.kubernetes.io/instance: ingress-nginx
|
||||
app.kubernetes.io/name: ingress-nginx
|
||||
app.kubernetes.io/part-of: ingress-nginx
|
||||
app.kubernetes.io/version: 1.11.2
|
||||
name: ingress-nginx-admission
|
||||
webhooks:
|
||||
- admissionReviewVersions:
|
||||
- v1
|
||||
clientConfig:
|
||||
service:
|
||||
name: ingress-nginx-controller-admission
|
||||
namespace: ingress-nginx
|
||||
path: /networking/v1/ingresses
|
||||
failurePolicy: Fail
|
||||
matchPolicy: Equivalent
|
||||
name: validate.nginx.ingress.kubernetes.io
|
||||
rules:
|
||||
- apiGroups:
|
||||
- networking.k8s.io
|
||||
apiVersions:
|
||||
- v1
|
||||
operations:
|
||||
- CREATE
|
||||
- UPDATE
|
||||
resources:
|
||||
- ingresses
|
||||
sideEffects: None
|
10
nhncloud/manifests/svc.yaml
Normal file
10
nhncloud/manifests/svc.yaml
Normal file
@ -0,0 +1,10 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: test-svc
|
||||
spec:
|
||||
selector:
|
||||
app: nginx
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 80
|
30
nhncloud/migrations/0001_initial.py
Normal file
30
nhncloud/migrations/0001_initial.py
Normal file
@ -0,0 +1,30 @@
|
||||
# Generated by Django 4.2.14 on 2024-11-12 13:13
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Cluster',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(max_length=50)),
|
||||
('uuid', models.TextField(null=True)),
|
||||
('content', models.TextField(null=True)),
|
||||
('file_upload', models.FileField(blank=True, upload_to='common/files/%Y/%m/%d/')),
|
||||
('created_at', models.DateTimeField(auto_now=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('author', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
),
|
||||
]
|
18
nhncloud/migrations/0002_alter_cluster_file_upload.py
Normal file
18
nhncloud/migrations/0002_alter_cluster_file_upload.py
Normal file
@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.2.14 on 2024-11-12 17:20
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('nhncloud', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='cluster',
|
||||
name='file_upload',
|
||||
field=models.FileField(blank=True, upload_to='cluster/files/%Y/%m/%d/'),
|
||||
),
|
||||
]
|
18
nhncloud/migrations/0003_alter_cluster_title.py
Normal file
18
nhncloud/migrations/0003_alter_cluster_title.py
Normal file
@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.2.14 on 2024-11-13 14:40
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('nhncloud', '0002_alter_cluster_file_upload'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='cluster',
|
||||
name='title',
|
||||
field=models.CharField(max_length=50, unique=True),
|
||||
),
|
||||
]
|
17
nhncloud/migrations/0004_remove_cluster_file_upload.py
Normal file
17
nhncloud/migrations/0004_remove_cluster_file_upload.py
Normal file
@ -0,0 +1,17 @@
|
||||
# Generated by Django 4.2.14 on 2024-11-18 22:06
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('nhncloud', '0003_alter_cluster_title'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='cluster',
|
||||
name='file_upload',
|
||||
),
|
||||
]
|
@ -0,0 +1,23 @@
|
||||
# Generated by Django 4.2.14 on 2024-11-18 22:28
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('nhncloud', '0004_remove_cluster_file_upload'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='cluster',
|
||||
name='content',
|
||||
field=models.TextField(blank=True, null=True),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='cluster',
|
||||
name='uuid',
|
||||
field=models.TextField(blank=True, null=True),
|
||||
),
|
||||
]
|
18
nhncloud/migrations/0006_cluster_type.py
Normal file
18
nhncloud/migrations/0006_cluster_type.py
Normal file
@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.2.14 on 2024-11-18 23:53
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('nhncloud', '0005_alter_cluster_content_alter_cluster_uuid'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='cluster',
|
||||
name='type',
|
||||
field=models.CharField(blank=True, max_length=50, unique=True),
|
||||
),
|
||||
]
|
0
nhncloud/migrations/__init__.py
Normal file
0
nhncloud/migrations/__init__.py
Normal file
17
nhncloud/models.py
Normal file
17
nhncloud/models.py
Normal file
@ -0,0 +1,17 @@
|
||||
from django.db import models
|
||||
from django.conf import settings
|
||||
|
||||
class Cluster(models.Model):
|
||||
title = models.CharField(max_length=50, unique=True)
|
||||
uuid = models.TextField(null=True, blank=True)
|
||||
content = models.TextField(null=True, blank=True)
|
||||
type = models.CharField(max_length=50, blank=True, unique=True)
|
||||
|
||||
created_at = models.DateTimeField(auto_now=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
|
||||
author = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)
|
||||
|
||||
def __str__(self):
|
||||
return f'[{self.pk}] {self.title}'
|
143
nhncloud/packages/ApiCompute.py
Normal file
143
nhncloud/packages/ApiCompute.py
Normal file
@ -0,0 +1,143 @@
|
||||
import json
|
||||
import requests
|
||||
|
||||
# type : network
|
||||
# Region :
|
||||
# 판교: https://kr1-api-instance-infrastructure.nhncloudservice.com
|
||||
# 평촌: https://kr2-api-instance-infrastructure.nhncloudservice.com
|
||||
|
||||
endpoint_cpt_kr1 = "https://kr1-api-instance-infrastructure.nhncloudservice.com"
|
||||
endpoint_cpt_kr2 = "https://kr2-api-instance-infrastructure.nhncloudservice.com"
|
||||
endpoint_img_kr1 = "https://kr1-api-image-infrastructure.nhncloudservice.com"
|
||||
endpoint_img_kr2 = "https://kr2-api-image-infrastructure.nhncloudservice.com"
|
||||
|
||||
|
||||
class ApiCompute:
|
||||
def __init__(self, region, tenant_id, token):
|
||||
if region == "kr1":
|
||||
self.cptUrl = endpoint_cpt_kr1
|
||||
self.imgUrl = endpoint_img_kr1
|
||||
elif region == "kr2":
|
||||
self.cptUrl = endpoint_cpt_kr2
|
||||
self.imgUrl = endpoint_img_kr2
|
||||
else:
|
||||
self.cptUrl = endpoint_cpt_kr2
|
||||
self.imgUrl = endpoint_img_kr2
|
||||
self.token = token
|
||||
self.tenantId = tenant_id
|
||||
|
||||
def getFlavorList(self):
|
||||
url = f"{self.cptUrl}/v2/{self.tenantId}/flavors"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.get(url, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
return datas
|
||||
|
||||
def getFlavorId(self, flavor_name):
|
||||
url = f"{self.cptUrl}/v2/{self.tenantId}/flavors"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.get(url, headers=headers)
|
||||
datas = json.loads(response.text)['flavors']
|
||||
|
||||
for var in datas:
|
||||
foo = str(var['name'])
|
||||
if foo.count(flavor_name) == 1:
|
||||
return var['id']
|
||||
|
||||
def getKeypairList(self):
|
||||
url = f"{self.cptUrl}/v2/{self.tenantId}/os-keypairs"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.get(url, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
return datas
|
||||
|
||||
def getKeypairInfo(self, keypair_name):
|
||||
url = f"{self.cptUrl}/v2/{self.tenantId}/os-keypairs/{keypair_name}"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.get(url, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
return datas
|
||||
|
||||
def InstanceList(self):
|
||||
pass
|
||||
|
||||
def InstanceStatus(self, serverId):
|
||||
url = f"{self.cptUrl}/v2/{self.tenantId}/servers/{serverId}"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.get(url, headers=headers)
|
||||
datas = json.loads(response.text)['server']['status']
|
||||
return datas
|
||||
|
||||
def InstanceInfo(self, serverId):
|
||||
url = f"{self.cptUrl}/v2/{self.tenantId}/servers/{serverId}"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.get(url, headers=headers)
|
||||
datas = json.loads(response.text) # ['server']['status']
|
||||
return datas
|
||||
|
||||
def InstanceId(self, instance_name):
|
||||
pass
|
||||
|
||||
def deleteInstance(self, instance_id):
|
||||
pass
|
||||
|
||||
def createInstance(self, instance_name, instance_image_id, flavor_id, subnet_id, kepair_name):
|
||||
url = f"{self.cptUrl}/v2/{self.tenantId}/servers"
|
||||
parms = {
|
||||
"server": {
|
||||
"name": instance_name,
|
||||
"imageRef": instance_image_id,
|
||||
"flavorRef": flavor_id,
|
||||
"networks": [
|
||||
{
|
||||
"subnet": f"{subnet_id}",
|
||||
}
|
||||
],
|
||||
# "availability_zone": "kr-pub-b",
|
||||
"key_name": kepair_name,
|
||||
"max_count": 1,
|
||||
"min_count": 1,
|
||||
"block_device_mapping_v2": [
|
||||
{
|
||||
"uuid": f"{instance_image_id}",
|
||||
"boot_index": 0,
|
||||
"volume_size": 50,
|
||||
"device_name": "vda",
|
||||
"source_type": "image",
|
||||
"destination_type": "volume",
|
||||
"delete_on_termination": 1,
|
||||
}
|
||||
],
|
||||
"security_groups": [{"name": "default"}],
|
||||
}
|
||||
}
|
||||
|
||||
headers = {
|
||||
"X-Auth-Token": self.token,
|
||||
}
|
||||
# print(parms)
|
||||
response = requests.post(url, json=parms, headers=headers)
|
||||
datas = json.loads(response.text)['server']
|
||||
# print("------------------------")
|
||||
# print(response)
|
||||
# print("------------------------")
|
||||
# print(datas)
|
||||
return datas['id']
|
||||
|
||||
def getImgListAll(self):
|
||||
url = f"{self.imgUrl}/v2/images"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.get(url, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
return datas
|
||||
|
||||
def getInstanceImgId(self, img_name):
|
||||
url = f"{self.imgUrl}/v2/images"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.get(url, headers=headers)
|
||||
datas = json.loads(response.text)['images']
|
||||
|
||||
for var in datas:
|
||||
foo = str(var['name'])
|
||||
if foo.startswith(img_name) and foo.count("Container") == 0:
|
||||
return var['id']
|
175
nhncloud/packages/ApiNks.py
Normal file
175
nhncloud/packages/ApiNks.py
Normal file
@ -0,0 +1,175 @@
|
||||
import json
|
||||
import requests
|
||||
import yaml
|
||||
|
||||
# type : network
|
||||
# Region :
|
||||
# 판교: https://kr1-api-kubernetes-infrastructure.nhncloudservice.com
|
||||
# 평촌: https://kr2-api-kubernetes-infrastructure.nhncloudservice.com
|
||||
|
||||
endpoint_kr1 = "https://kr1-api-kubernetes-infrastructure.nhncloudservice.com"
|
||||
endpoint_kr2 = "https://kr2-api-kubernetes-infrastructure.nhncloudservice.com"
|
||||
|
||||
class ApiNks:
|
||||
def __init__(self, region, token):
|
||||
if region == "kr1" :
|
||||
self.region = region
|
||||
self.url = endpoint_kr1
|
||||
elif region == "kr2" :
|
||||
self.region = region
|
||||
self.url = endpoint_kr2
|
||||
else:
|
||||
self.region = region
|
||||
self.url = endpoint_kr2
|
||||
self.token = token
|
||||
|
||||
|
||||
def getClusterList(self):
|
||||
url = f"{self.url}/v1/clusters"
|
||||
headers={
|
||||
"X-Auth-Token": self.token,
|
||||
"Accept": "application/json",
|
||||
"Content-Type": "application/json",
|
||||
"OpenStack-API-Version": "container-infra latest"
|
||||
}
|
||||
response = requests.get(url, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
return datas
|
||||
|
||||
def getClusterInfo(self, cluster_name):
|
||||
url = f"{self.url}/v1/clusters/{cluster_name}"
|
||||
headers={
|
||||
"X-Auth-Token": self.token,
|
||||
"Accept": "application/json",
|
||||
"Content-Type": "application/json",
|
||||
"OpenStack-API-Version": "container-infra latest"
|
||||
}
|
||||
response = requests.get(url, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
return datas
|
||||
|
||||
def publicClusterCreate(self, parms_dict):
|
||||
print(f"리전정보 {self.region}")
|
||||
if self.region == "kr1" :
|
||||
node_img = "1213d033-bdf6-4d73-9763-4e8e57c745fb" # ubuntu 20.04
|
||||
elif self.region == "kr2" :
|
||||
node_img = "dabb6d10-937d-4952-9ce0-1e576e9164e8" # ubuntu 20.04
|
||||
else:
|
||||
node_img = "dabb6d10-937d-4952-9ce0-1e576e9164e8" # ubuntu 20.04
|
||||
|
||||
url = f"{self.url}/v1/clusters"
|
||||
parms = {
|
||||
"cluster_template_id": "iaas_console",
|
||||
"create_timeout": 60,
|
||||
"fixed_network": str(parms_dict["vpc_id"]),
|
||||
"fixed_subnet": str(parms_dict["subnet_id"]),
|
||||
"flavor_id": str(parms_dict["instance_type"]),
|
||||
"keypair": str(parms_dict["key_pair"]),
|
||||
"labels": {
|
||||
"availability_zone": str(parms_dict["az-zone"]),
|
||||
"boot_volume_size": "50",
|
||||
"boot_volume_type": "General SSD",
|
||||
"ca_enable": "false",
|
||||
# "ca_max_node_count": "10",
|
||||
# "ca_min_node_count": "1",
|
||||
# "ca_scale_down_delay_after_add": "10", # 샘플은3인데 왜 10일 요구하나
|
||||
# "ca_scale_down_enable": "true",
|
||||
# "ca_scale_down_unneeded_time": "3",
|
||||
# "ca_scale_down_util_thresh": "50",
|
||||
# "cert_manager_api": "True",
|
||||
"cert_manager_api": "True",
|
||||
"clusterautoscale": "nodegroupfeature",
|
||||
"external_network_id": str(parms_dict["external_network_id"]), # 외부 연결된경우 적용
|
||||
"external_subnet_id_list": str(parms_dict["external_subnet_id_list"]), # 외부 연결
|
||||
"kube_tag": str(parms_dict["kubernetes-version"]),
|
||||
"master_lb_floating_ip_enabled": "True", # external_network, subnet적용시 True가능.
|
||||
"node_image": node_img,
|
||||
# "user_script_v2": ""
|
||||
},
|
||||
"name": str(parms_dict["cluster_name"]),
|
||||
"node_count": str(parms_dict["nd_cnt"])
|
||||
}
|
||||
|
||||
headers={
|
||||
"Accept": "application/json",
|
||||
"Content-Type": "application/json",
|
||||
"OpenStack-API-Version": "container-infra latest",
|
||||
"X-Auth-Token": self.token
|
||||
}
|
||||
response = requests.post(url, json=parms, headers=headers)
|
||||
print(f"debug:{response}")
|
||||
datas = json.loads(response.text)
|
||||
# print("------------------------")
|
||||
# print(response)
|
||||
# print("------------------------")
|
||||
print(datas)
|
||||
return datas
|
||||
|
||||
def privateClusterCreate(self, parms_dict):
|
||||
if self.region == "kr1" :
|
||||
node_img = "1213d033-bdf6-4d73-9763-4e8e57c745fb" # ubuntu 20.04
|
||||
elif self.region == "kr2" :
|
||||
node_img = "dabb6d10-937d-4952-9ce0-1e576e9164e8" # ubuntu 20.04
|
||||
else:
|
||||
node_img = "dabb6d10-937d-4952-9ce0-1e576e9164e8" # ubuntu 20.04
|
||||
|
||||
url = f"{self.url}/v1/clusters"
|
||||
parms = {
|
||||
"cluster_template_id": "iaas_console",
|
||||
"create_timeout": 60,
|
||||
"fixed_network": str(parms_dict["vpc_id"]),
|
||||
"fixed_subnet": str(parms_dict["subnet_id"]),
|
||||
"flavor_id": str(parms_dict["instance_type"]),
|
||||
"keypair": str(parms_dict["key_pair"]),
|
||||
"labels": {
|
||||
"availability_zone": str(parms_dict["az-zone"]),
|
||||
"boot_volume_size": "50",
|
||||
"boot_volume_type": "General SSD",
|
||||
"ca_enable": "false",
|
||||
"cert_manager_api": "True",
|
||||
"clusterautoscale": "nodegroupfeature",
|
||||
"kube_tag": str(parms_dict["kubernetes-version"]),
|
||||
"master_lb_floating_ip_enabled": "False", # external_network, subnet적용시 True가능.
|
||||
"node_image": node_img,
|
||||
},
|
||||
"name": str(parms_dict["cluster_name"]),
|
||||
"node_count": str(parms_dict["nd_cnt"])
|
||||
}
|
||||
|
||||
headers={
|
||||
"Accept": "application/json",
|
||||
"Content-Type": "application/json",
|
||||
"OpenStack-API-Version": "container-infra latest",
|
||||
"X-Auth-Token": self.token
|
||||
}
|
||||
response = requests.post(url, json=parms, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
# print("DEBUG MODE")
|
||||
# print(response)
|
||||
# print("DEBUG MODE")
|
||||
# print(datas)
|
||||
return datas
|
||||
|
||||
def nksDelete(self, cluster_name):
|
||||
url = f"{self.url}/v1/clusters/{cluster_name}"
|
||||
headers={
|
||||
"X-Auth-Token": self.token,
|
||||
"Accept": "application/json",
|
||||
"Content-Type": "application/json",
|
||||
"OpenStack-API-Version": "container-infra latest"
|
||||
}
|
||||
response = requests.delete(url, headers=headers)
|
||||
|
||||
return
|
||||
|
||||
def getClusterConfig(self, cluster_name): # 작성만 하였음 확인 필요.
|
||||
url = f"{self.url}/v1/clusters/{cluster_name}/config"
|
||||
headers={
|
||||
"X-Auth-Token": self.token,
|
||||
"Accept": "application/json",
|
||||
"Content-Type": "application/json",
|
||||
"OpenStack-API-Version": "container-infra latest"
|
||||
}
|
||||
response = requests.get(url, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
return datas['config']
|
95
nhncloud/packages/ApiStorageObject.py
Normal file
95
nhncloud/packages/ApiStorageObject.py
Normal file
@ -0,0 +1,95 @@
|
||||
import requests
|
||||
import os
|
||||
|
||||
endpoint_url_kr1 = "https://kr1-api-object-storage.nhncloudservice.com/v1"
|
||||
endpoint_url_kr2 = "https://kr2-api-object-storage.nhncloudservice.com/v1"
|
||||
|
||||
class ApiStorageObject:
|
||||
def __init__(self, region, token, storageAccount):
|
||||
if region == "kr1":
|
||||
self.storage_url = endpoint_url_kr1
|
||||
elif region == "kr2":
|
||||
self.storage_url = endpoint_url_kr2
|
||||
else:
|
||||
self.storage_url = endpoint_url_kr2
|
||||
self.token = token
|
||||
self.scAccount = storageAccount
|
||||
|
||||
def _get_url(self, container=None):
|
||||
if container == None:
|
||||
container = ""
|
||||
else:
|
||||
container = container
|
||||
return self.storage_url + "/" + container
|
||||
|
||||
def _get_obj_url(self, container=None, object=None):
|
||||
return '/'.join([self.storage_url, container, object])
|
||||
|
||||
def _get_request_header(self):
|
||||
return {"X-Auth-Token": self.token}
|
||||
|
||||
def get_container_list(self):
|
||||
req_url = str(f"{self._get_url()}{self.scAccount}")
|
||||
print(f"url: {req_url}")
|
||||
headers = self._get_request_header()
|
||||
resp = requests.get(req_url, headers=headers)
|
||||
# print(resp)
|
||||
return resp.text.split("\n")
|
||||
|
||||
def create(self, container):
|
||||
req_url = str(f"{self._get_url()}{self.scAccount}/{container}")
|
||||
print(req_url)
|
||||
req_header = self._get_request_header()
|
||||
return requests.put(req_url, headers=req_header)
|
||||
def remove(self, container):
|
||||
req_url = str(f"{self._get_url()}{self.scAccount}/{container}")
|
||||
print(req_url)
|
||||
req_header = self._get_request_header()
|
||||
return requests.delete(req_url, headers=req_header)
|
||||
|
||||
# public 으로 변경
|
||||
def set_read_acl(self, container, is_public):
|
||||
req_url = str(f"{self._get_url()}{self.scAccount}/{container}")
|
||||
req_header = self._get_request_header()
|
||||
req_header["X-Container-Read"] = ".r:*" if is_public else ""
|
||||
return requests.post(req_url, headers=req_header)
|
||||
|
||||
def upload(self, container, object, object_path):
|
||||
req_url = str(f"{self._get_url()}{self.scAccount}/{container}/{object}")
|
||||
req_header = self._get_request_header()
|
||||
|
||||
path = '/'.join([object_path, object])
|
||||
with open(path, 'rb') as f:
|
||||
return requests.put(req_url, headers=req_header, data=f.read())
|
||||
|
||||
def update(self, container, object):
|
||||
req_url = str(f"{self._get_url()}{self.scAccount}/{container}/{object}")
|
||||
print(req_url)
|
||||
headers={
|
||||
"X-Auth-Token": self.token,
|
||||
"Content" : "multipart/form-data",
|
||||
"X-Delete-At" : "1705985040"
|
||||
}
|
||||
return requests.put(req_url, headers=headers)
|
||||
|
||||
# 컨테이너 디렉토리 리스트
|
||||
def _get_list(self, container):
|
||||
req_url = str(f"{self._get_url()}{self.scAccount}/{container}")
|
||||
|
||||
req_header = self._get_request_header()
|
||||
response = requests.get(req_url, headers=req_header)
|
||||
|
||||
return response.text.split('\n')
|
||||
|
||||
def get_object_list(self, container):
|
||||
req_url = str(f"{self._get_url()}{self.scAccount}/{container}")
|
||||
print(req_url)
|
||||
return self._get_list(req_url)
|
||||
|
||||
def delete(self, containerName, objectPath):
|
||||
req_url = f"{self._get_url()}{self.scAccount}/{containerName}/{objectPath}"
|
||||
headers={
|
||||
"X-Auth-Token": self.token,
|
||||
}
|
||||
return requests.delete(req_url, headers=headers)
|
||||
|
42
nhncloud/packages/ApiToken.py
Normal file
42
nhncloud/packages/ApiToken.py
Normal file
@ -0,0 +1,42 @@
|
||||
import requests
|
||||
import json
|
||||
|
||||
|
||||
# def createToken(url, parms):
|
||||
def createToken(parms):
|
||||
url = "https://api-identity-infrastructure.nhncloudservice.com/v2.0/tokens"
|
||||
response = requests.post(url, json=parms) # 응답요청
|
||||
|
||||
datas = json.loads(response.text)
|
||||
# print(datas)
|
||||
if "error" in datas:
|
||||
errDict = {
|
||||
'state' : 'err',
|
||||
'code' : datas['error']['code'],
|
||||
'errTitle' : datas['error']['title'],
|
||||
'errMsg' : datas['error']['message']
|
||||
}
|
||||
return errDict
|
||||
else:
|
||||
getDict = {
|
||||
'state' : 'steady',
|
||||
'tokenValue' : datas['access']['token']['id']
|
||||
}
|
||||
# WhatToken = getDict['tokenValue']
|
||||
return getDict
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 예제 내용
|
||||
url = "https://api-identity-infrastructure.nhncloudservice.com/v2.0/tokens"
|
||||
parms = {
|
||||
"auth": {
|
||||
"tenantId": "04a2c5b7de7e4d66b970ad950081a7c3", # kr2
|
||||
"passwordCredentials": {
|
||||
# "username": "sdjo@injeinc.co.kr",
|
||||
# "password": "ijinc123!"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
print(createToken(url, parms))
|
229
nhncloud/packages/ApiVpc.py
Normal file
229
nhncloud/packages/ApiVpc.py
Normal file
@ -0,0 +1,229 @@
|
||||
import json
|
||||
import requests
|
||||
|
||||
# type : network
|
||||
# Region :
|
||||
# 판교: https://kr1-api-network-infrastructure.nhncloudservice.com
|
||||
# 평촌: https://kr2-api-network-infrastructure.nhncloudservice.com
|
||||
|
||||
endpoint_vpc_kr1 = "https://kr1-api-network-infrastructure.nhncloudservice.com"
|
||||
endpoint_vpc_kr2 = "https://kr2-api-network-infrastructure.nhncloudservice.com"
|
||||
endpoint_floating_kr1 = "https://kr1-api-network-infrastructure.nhncloudservice.com"
|
||||
endpoint_floating_kr2 = "https://kr2-api-network-infrastructure.nhncloudservice.com"
|
||||
|
||||
|
||||
class ApiVpc:
|
||||
def __init__(self, region, token):
|
||||
if region == "kr1":
|
||||
self.vpcUrl = endpoint_vpc_kr1
|
||||
self.floatingUrl = endpoint_floating_kr1
|
||||
elif region == "kr2":
|
||||
self.vpcUrl = endpoint_vpc_kr2
|
||||
self.floatingUrl = endpoint_floating_kr2
|
||||
else:
|
||||
self.vpcUrl = endpoint_vpc_kr2
|
||||
self.floatingUrl = endpoint_floating_kr2
|
||||
self.token = token
|
||||
|
||||
def vpcList(self):
|
||||
url = f"{self.vpcUrl}/v2.0/vpcs"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.get(url, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
return datas
|
||||
|
||||
def vpcInfo(self, vpc_id):
|
||||
url = f"{self.vpcUrl}/v2.0/vpcs/{vpc_id}"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.get(url, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
return datas
|
||||
|
||||
def getVpcId(self, vpc_name):
|
||||
vpcName = vpc_name
|
||||
url = f"{self.vpcUrl}/v2.0/vpcs"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.get(url, headers=headers)
|
||||
datas = json.loads(response.text)["vpcs"]
|
||||
print(f"ss:{datas}")
|
||||
i = len(datas) - 1
|
||||
for var in reversed(datas):
|
||||
foo = str(var["name"])
|
||||
if foo.startswith(vpcName):
|
||||
break
|
||||
else:
|
||||
if i == 0:
|
||||
break
|
||||
else:
|
||||
i -= 1
|
||||
|
||||
return datas[i]["id"]
|
||||
|
||||
def vpcCreate(self, name, cidrv4):
|
||||
url = f"{self.vpcUrl}/v2.0/vpcs"
|
||||
parms = {"vpc": {"name": name, "cidrv4": cidrv4}}
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.post(url, json=parms, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
|
||||
return datas["vpc"]["id"]
|
||||
|
||||
def vpcDelete(self, vpc_id):
|
||||
url = f"{self.vpcUrl}/v2.0/vpcs/{vpc_id}"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.delete(url, headers=headers)
|
||||
|
||||
return
|
||||
|
||||
def subnetList(self):
|
||||
url = f"{self.vpcUrl}/v2.0/vpcsubnets"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.get(url, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
return datas
|
||||
|
||||
def getSubnetId(self, subnetName):
|
||||
url = f"{self.vpcUrl}/v2.0/vpcsubnets"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.get(url, headers=headers)
|
||||
datas = json.loads(response.text)["vpcsubnets"]
|
||||
|
||||
for var in datas:
|
||||
foo = str(var["name"])
|
||||
if foo.startswith(subnetName) and foo.count("rt") == 0:
|
||||
return var["id"]
|
||||
|
||||
def subnetCreate(self, vpc_id, cidr, name):
|
||||
url = f"{self.vpcUrl}/v2.0/vpcsubnets"
|
||||
parms = {"vpcsubnet": {"vpc_id": vpc_id, "cidr": cidr, "name": name}}
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.post(url, json=parms, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
|
||||
return datas["vpcsubnet"]["id"]
|
||||
|
||||
def subnetDelete(self, subnet_id):
|
||||
url = f"{self.vpcUrl}/v2.0/vpcsubnets/{subnet_id}"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.delete(url, headers=headers)
|
||||
|
||||
return
|
||||
|
||||
def routingList(self):
|
||||
# url = f"{self.vpcUrl}/v2.0/routingtables"
|
||||
url = f"{self.vpcUrl}/v2.0/routingtables?detail=true"
|
||||
# parms = {
|
||||
# "default_table": "true"
|
||||
# }
|
||||
headers = {
|
||||
"X-Auth-Token": self.token,
|
||||
#
|
||||
}
|
||||
response = requests.get(url, headers=headers)
|
||||
# response = requests.post(url, query={"detail":"true"}, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
return datas
|
||||
|
||||
def getRoutingDefault(self):
|
||||
url = f"{self.vpcUrl}/v2.0/routingtables"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.get(url, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
return datas["routingtables"][0]["id"]
|
||||
|
||||
def routingCreate(self, name, vpc_id, distributed="true"):
|
||||
url = f"{self.vpcUrl}/v2.0/routingtables"
|
||||
parms = {
|
||||
"routingtable": {"name": name, "vpc_id": vpc_id, "distributed": distributed}
|
||||
}
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.post(url, json=parms, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
|
||||
return datas["routingtable"]["id"]
|
||||
|
||||
def routingDelete(self, routingtable_Id):
|
||||
url = f"{self.vpcUrl}/v2.0/routingtables/{routingtable_Id}"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.delete(url, headers=headers)
|
||||
|
||||
return
|
||||
|
||||
def setDefaultRouting(self, routingtable_Id):
|
||||
url = f"{self.vpcUrl}/v2.0/routingtables/{routingtable_Id}/set_as_default"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.put(url, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
return datas
|
||||
|
||||
def setIgwToRoutingTable(self, routingtable_Id, igw_id):
|
||||
url = f"{self.vpcUrl}/v2.0/routingtables/{routingtable_Id}/attach_gateway"
|
||||
parms = {"gateway_id": igw_id}
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.put(url, json=parms, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
return datas
|
||||
|
||||
def detachIgwFromRoutingTable(self, routingtable_Id):
|
||||
url = f"{self.vpcUrl}/v2.0/routingtables/{routingtable_Id}/detach_gateway"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.put(url, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
return datas
|
||||
|
||||
def attachRoutingToSubnet(self, subnet_Id, routing_id):
|
||||
url = f"{self.vpcUrl}/v2.0/vpcsubnets/{subnet_Id}/attach_routingtable"
|
||||
parms = {"routingtable_id": routing_id}
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.put(url, json=parms, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
return datas
|
||||
|
||||
def getExternalNetworkId(self):
|
||||
url = f"{self.vpcUrl}/v2.0/networks?router:external=True"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.get(url, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
return datas
|
||||
|
||||
def createFloatingIp(self, external_id):
|
||||
url = f"{self.floatingUrl}/v2.0/floatingips"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
parms = {
|
||||
"floatingip": {
|
||||
"floating_network_id": external_id,
|
||||
# "port_id": ""
|
||||
}
|
||||
}
|
||||
response = requests.post(url, json=parms, headers=headers)
|
||||
|
||||
# datas = json.loads(response.text)["floatingip"]["floating_ip_address"]
|
||||
datas = json.loads(response.text)["floatingip"]["id"]
|
||||
return datas
|
||||
|
||||
def attachFloatingIpToDeviceNic(self, floating_ip_id, device_nic_id):
|
||||
url = f"{self.floatingUrl}/v2.0/floatingips/{floating_ip_id}"
|
||||
parms = {"floatingip": {"port_id": device_nic_id}}
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.put(url, json=parms, headers=headers)
|
||||
print(response)
|
||||
datas = json.loads(response.text)
|
||||
return datas
|
||||
|
||||
def nicList(self):
|
||||
url = f"{self.vpcUrl}/v2.0/ports"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.get(url, headers=headers)
|
||||
datas = json.loads(response.text)
|
||||
return datas
|
||||
|
||||
def nicId(self, network_id):
|
||||
url = f"{self.vpcUrl}/v2.0/ports"
|
||||
headers = {"X-Auth-Token": self.token}
|
||||
response = requests.get(url, headers=headers)
|
||||
datas = json.loads(response.text)["ports"]
|
||||
|
||||
for var in datas:
|
||||
foo = str(var["device_id"])
|
||||
if foo.startswith(network_id):
|
||||
return var["id"]
|
15
nhncloud/static/nhncloud/css/landing.css
Normal file
15
nhncloud/static/nhncloud/css/landing.css
Normal file
@ -0,0 +1,15 @@
|
||||
body {
|
||||
background: url('/static/nhncloud/images/nhncloud_api.jpg') no-repeat center center fixed;
|
||||
-webkit-background-size: cover;
|
||||
-moz-background-size: cover;
|
||||
-background-size: cover;
|
||||
-o-background-size: cover;
|
||||
}
|
||||
|
||||
section {
|
||||
margin-bottom: 150px;
|
||||
}
|
||||
|
||||
.card {
|
||||
background: rgba(255, 255, 255, 0.75);
|
||||
}
|
BIN
nhncloud/static/nhncloud/images/nhncloud_api.jpg
Normal file
BIN
nhncloud/static/nhncloud/images/nhncloud_api.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
111
nhncloud/templates/nhncloud/_rq_nks_components_apply.html
Normal file
111
nhncloud/templates/nhncloud/_rq_nks_components_apply.html
Normal file
@ -0,0 +1,111 @@
|
||||
{% extends 'components/base_nhncloud.html' %}
|
||||
{% load static %}
|
||||
{% block main_area %}
|
||||
<section class="pt-3">
|
||||
<h3>nginx ingress만 생성가능</h3>
|
||||
<div class="row">
|
||||
<div class="mt-5 col-12 text-center">Create LoadBalancer for ingress
|
||||
<br>
|
||||
<samp>충돌 여부 확인 후 문제 없을시 기본값 사용 가능.</samp>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-4"></div>
|
||||
<div class="col-lg-4">
|
||||
<form method="post" action="{% url 'nhncloud:kubectlApplyLB' %}">{% csrf_token %}
|
||||
<div class="mb-3 mt-5">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="clusterName">Cluster Name</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="clusterName" id="clusterName"
|
||||
value="demo-cluster">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="loadBancerName">LoadBalancer Name</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="loadBancerName" id="loadBancerName"
|
||||
value="demo-lb-ingress">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="floatingIP">Floating IP</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="floatingIP" id="floatingIP">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="region">Region</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<select class="form-control" name="region" id="region" onchange="selectRegion(this.value);">
|
||||
<option value="select...">select...</option>
|
||||
<option value="kr1">판교</option>
|
||||
<option value="kr2">평촌</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="tenantId">Tenant ID</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="tenantId" id="tenantId">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="usrEmail">User Email</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="usrEmail" id="usrEmail"
|
||||
value="{{ user.nhnc_id }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="apiPw">API Password</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="apiPw" id="apiPw">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-info float-right">Request</button>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-lg-4"></div>
|
||||
</div>
|
||||
</section>
|
||||
<script>
|
||||
function selectRegion() {
|
||||
let selectRegionValue = document.getElementById('region').value;
|
||||
console.log(selectRegionValue);
|
||||
document.getElementById('tenantId').value = "{{ user.nhnc_api_tenant_id }}";
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
function createClickMsg() {
|
||||
alert('Cluster 상태가 조회됩니다.');
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
262
nhncloud/templates/nhncloud/_rq_nks_create.html
Normal file
262
nhncloud/templates/nhncloud/_rq_nks_create.html
Normal file
@ -0,0 +1,262 @@
|
||||
{% extends 'components/base_nhncloud.html' %}
|
||||
{% load static %}
|
||||
{% block main_area %}
|
||||
|
||||
<section>
|
||||
<div class="mt-3 row">
|
||||
<div class="mt-5 col-12 text-center">Create NKS Public-Subnet
|
||||
<br>
|
||||
<samp>충돌 여부 확인 후 문제 없을시 기본값 사용 가능.</samp>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-4">
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<form method="post" action="{% url 'nhncloud:createOnlyCluster' %}">{% csrf_token %}
|
||||
<!-- vpc -->
|
||||
<div class="mb-3 mt-5">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="vpc">VPC</label>
|
||||
</div>
|
||||
<div class="col-md-7">
|
||||
<select class="form-control" name="vpc" id="vpc" onchange="vpcToSubnetList();">
|
||||
<option value="select...">select...</option>
|
||||
{% for var in vpcList %}
|
||||
{% for key, value in var.items %}
|
||||
<option value="{{ value }}">{{ key }}</option>
|
||||
<!-- <option value="{{ value }}">{{ key }}</option> -->
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<a class="btn btn-primary float-right" href="#" data-bs-toggle="modal" data-bs-target="#getVpcListeModal"><i class="fa-solid fa-magnifying-glass"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- subnet -->
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="publicSubnet">Subnet</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="publicSubnet" id="publicSubnet" readonly>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- region -->
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="region">Region</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<select class="form-control" name="region" id="region" onchange="selectRegionPost(this.value);">
|
||||
<option value="select...">select...</option>
|
||||
<option value="kr1">판교</option>
|
||||
<option value="kr2">평촌</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="clusterName">Cluster Name</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="clusterName" id="clusterName" value="demo-cluster">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="keyPair">KeyPair Name</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<select class="form-control" name="KeyPair" id="KeyPair" value="selectKeyPair">
|
||||
<option value="select...">select...</option>
|
||||
<option value="keyPair-kr1">keyPair-kr1</option>
|
||||
<option value="keyPair-kr2">keyPair-kr2</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="tenantId">Tenant ID</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="tenantId" id="tenantId" value="{{ user.nhnc_api_tenant_id }}" readonly>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="usrEmail">User Email</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="usrEmail" id="usrEmail" value="{{ user.nhnc_id }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="apiPw">API Password</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="apiPw" id="apiPw">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary float-right" onclick="createClickMsg();">Create</button>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-lg-4"></div>
|
||||
</div>
|
||||
<!-- modal -->
|
||||
<form method="post" action=".">{% csrf_token %}
|
||||
<div class="modal fade" id="getVpcListeModal" tabindex="-1" aria-labelledby="getVpcListeModal" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="getVpcListeModalTitle">API 비밀번호를 입력해주세요.</h5>
|
||||
<!-- <button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button> -->
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="region">Subnet Type</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="subnetRadio" id="publicSubnetId" value="option1" checked>
|
||||
<label class="form-check-label" for="subnetRadio1">
|
||||
Public subnet
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="subnetRadio" id="privateSubnetId" value="option2">
|
||||
<label class="form-check-label" for="subnetRadio2">
|
||||
Private subnet
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- region -->
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="region-pre">Region</label>
|
||||
</div>
|
||||
<div class="col-md-7">
|
||||
<select class="form-control" name="region-pre" id="region-pre">
|
||||
<option value="select...">select...</option>
|
||||
<option value="kr1">판교</option>
|
||||
<option value="kr2">평촌</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="apiPw">API Password</label>
|
||||
</div>
|
||||
<div class="col-md-7">
|
||||
<input type="password" class="form-control" name="apiPw" id="apiPw">
|
||||
<input type="hidden" class="form-control" name="usrEmail" id="usrEmail" value="{{ user.nhnc_id }}">
|
||||
<input type="hidden" name="tenantId-pre" id="tenantId-pre" value="{{ user.nhnc_api_tenant_id }}">
|
||||
<input type="hidden" name="searchVpcList" id="searchVpcList" value="yes">
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="submit" class="btn btn-info float-right" onclick="alert('VPC리스트가 조회됩니다...')">Request</button>
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
<script>
|
||||
function selectRegion(){
|
||||
var selectRegionValue;
|
||||
var regionPreValue;
|
||||
|
||||
regionPreValue = document.getElementById('region-pre').value;
|
||||
|
||||
console.log(selectRegionValue);
|
||||
|
||||
if (regionPreValue == "kr1") {
|
||||
document.getElementById('vpc').value = "kr1";
|
||||
}
|
||||
else if (regionPreValue == "kr2") {
|
||||
document.getElementById('vpc').value = "kr2";
|
||||
}
|
||||
else {
|
||||
console.log('pass');
|
||||
}
|
||||
vpcToSubnetList();
|
||||
|
||||
}
|
||||
|
||||
function vpcToSubnetList(){
|
||||
let selectRegionValue = document.getElementById('vpc').value;
|
||||
|
||||
console.log(selectRegionValue);
|
||||
|
||||
var dict = {};
|
||||
var subDict = {};
|
||||
{% for x, y in subnetList.items %}
|
||||
{% for a, b in y.items %}
|
||||
subDict["{{ a }}"] = "{{ b | safe}}";
|
||||
{% endfor %}
|
||||
dict["{{ x }}"] = subDict;
|
||||
subDict = {};
|
||||
{% endfor %}
|
||||
|
||||
document.getElementById('publicSubnet').value = dict[selectRegionValue]["id"];
|
||||
|
||||
}
|
||||
|
||||
function selectRegionPost(){
|
||||
var regionValue;
|
||||
|
||||
regionValue = document.getElementById('region').value;
|
||||
|
||||
if (regionValue == "kr1") {
|
||||
document.getElementById('KeyPair').value = "keyPair-kr1";
|
||||
}
|
||||
else if (regionValue == "kr2") {
|
||||
document.getElementById('KeyPair').value = "keyPair-kr2";
|
||||
}
|
||||
else {
|
||||
document.getElementById('KeyPair').value = "none";
|
||||
}
|
||||
}
|
||||
function createClickMsg(){
|
||||
alert('약 15분 이내로 Cluster가 생성됩니다.\n페이지 새로고침을 하지 말아주세요.\n생성이 완료되면 페이지가 변경됩니다.');
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
82
nhncloud/templates/nhncloud/_rq_vpc_list.html
Normal file
82
nhncloud/templates/nhncloud/_rq_vpc_list.html
Normal file
@ -0,0 +1,82 @@
|
||||
{% extends 'components/base_nhncloud.html' %}
|
||||
{% load static %}
|
||||
{% block main_area %}
|
||||
|
||||
<section>
|
||||
<div class="row">
|
||||
<div class="mt-5 col-12 text-center">Network Information</div>
|
||||
</div>
|
||||
<br>
|
||||
<div class="row">
|
||||
|
||||
<div class="col-lg-4"></div>
|
||||
<div class="col-lg-4">
|
||||
<form method="post" action="{% url 'nhncloud:infoVpcList' %}">{% csrf_token %}
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="region">Region</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<select class="form-control" name="region" id="region" onchange="selectRegion(this.value);">
|
||||
<option value="select...">select...</option>
|
||||
<option value="kr1">판교</option>
|
||||
<option value="kr2">평촌</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="tenantId">Tenant ID</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="tenantId" id="tenantId">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="usrEmail">User Email</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="usrEmail" id="usrEmail" value="{{ user.nhnc_id }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="apiPw">API Password</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="apiPw" id="apiPw">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-info float-right">Request</button>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-lg-4"></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<script>
|
||||
function selectRegion() {
|
||||
let selectRegionValue = document
|
||||
.getElementById('region')
|
||||
.value;
|
||||
console.log(selectRegionValue);
|
||||
document
|
||||
.getElementById('tenantId')
|
||||
.value = "{{ user.nhnc_api_tenant_id }}";
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
function createClickMsg() {
|
||||
alert('vpc 리스트가 조회됩니다.');
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
16
nhncloud/templates/nhncloud/_rs_err.html
Normal file
16
nhncloud/templates/nhncloud/_rs_err.html
Normal file
@ -0,0 +1,16 @@
|
||||
{% extends 'components/base_nhncloud.html' %}
|
||||
{% load static %}
|
||||
{% block main_area %}
|
||||
<section>
|
||||
<div class="col-lg-12">
|
||||
<h1>Result Message</h1>
|
||||
<hr>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
<h3>{{ resultMsg }}</h3>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{% endblock %}
|
16
nhncloud/templates/nhncloud/_rs_nks_deploy.html
Normal file
16
nhncloud/templates/nhncloud/_rs_nks_deploy.html
Normal file
@ -0,0 +1,16 @@
|
||||
{% extends 'components/base_nhncloud.html' %}
|
||||
{% load static %}
|
||||
{% block main_area %}
|
||||
<section>
|
||||
<div class="col-lg-12">
|
||||
<h1>Result Message</h1>
|
||||
<hr>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
<h3>{{ resultMsg }}</h3>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{% endblock %}
|
170
nhncloud/templates/nhncloud/_rs_nks_list.html
Normal file
170
nhncloud/templates/nhncloud/_rs_nks_list.html
Normal file
@ -0,0 +1,170 @@
|
||||
{% extends 'components/base_nhncloud.html' %}
|
||||
{% load static %}
|
||||
{% block main_area %}
|
||||
<section class="pt-3">
|
||||
{% if clusters %}
|
||||
<div class="col-lg-12">
|
||||
<h1>Result Message</h1>
|
||||
<h6>Cluster를 삭제 전 Cluster에서사용 중인 리소스를 먼저 제거해야 합니다.</h6>
|
||||
<hr>
|
||||
</div>
|
||||
{% for var in clusters %}
|
||||
<div class="col-lg-12">
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">No</th>
|
||||
<th scope="col">Region</th>
|
||||
{% for key in var.keys %}
|
||||
<th scope="col">{{ key }}</th>
|
||||
{% endfor %}
|
||||
<th scope="col">
|
||||
delete
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{ forloop.counter }}</td>
|
||||
<td id="region-{{ forloop.counter }}">{{ region }}</td>
|
||||
{% for key, value in var.items %}
|
||||
{% if key == "kubeconfig" and value != "" %}
|
||||
<td id="{{ key }}-{{ forloop.parentloop.counter }}">
|
||||
<!-- 링크에 고유 ID를 부여하여 중복 방지 -->
|
||||
<a id="download-link-{{ forloop.parentloop.counter }}" href="#" type="button" class="btn btn-primary justify-content-end" role="button" download="kubeconfig-{{ forloop.parentloop.counter }}.yaml">config</a>
|
||||
<script>
|
||||
(function (id, textContent) {
|
||||
if (textContent && textContent.trim() !== "") {
|
||||
var blob = new Blob([textContent], {type: 'text/plain'});
|
||||
var url = URL.createObjectURL(blob);
|
||||
document
|
||||
.getElementById('download-link-' + id)
|
||||
.href = url;
|
||||
}
|
||||
})('{{ forloop.parentloop.counter }}', `{{ value|escapejs }}`);
|
||||
</script>
|
||||
</td>
|
||||
{% else %}
|
||||
<td id="{{ key }}-{{ forloop.parentloop.counter }}">{{ value }}</td>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
<td>
|
||||
<a type="submit" id="delete-{{ forloop.counter }}" class="btn btn-info justify-content-end" href="#" data-bs-toggle="modal" data-bs-target="#deleteModal" onclick="tenantIdToModal();">Delete</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<div class="col-lg-12">
|
||||
<h1>Result Message</h1>
|
||||
<hr>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-6">
|
||||
<h3>리전에 생성된 Cluster가 없습니다...</h3>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<!-- End Cluster All list -->
|
||||
<div class="col-lg-12 d-flex justify-content-end">
|
||||
<a class="btn btn-primary" href="/nhncloud/createClusterOnlyRequest">create nks</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Delete kubernetes Cluster -->
|
||||
<form method="post" action="{% url 'nhncloud:removeCluster' %}">{% csrf_token %}
|
||||
<div class="modal fade" id="deleteModal" tabindex="-1" aria-labelledby="deleteModal" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="deleteModalTitle">API 비밀번호를 입력해주세요.</h5>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="region">Region</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<select class="form-control" name="region" id="region" readonly="readonly">
|
||||
<option value="select...">select...</option>
|
||||
<option value="kr1">판교</option>
|
||||
<option value="kr2">평촌</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="clusterName">Cluster Name</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="clusterName" id="clusterName" readonly="readonly">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="tenantId">Tenant ID</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="tenantId" id="tenantId" readonly="readonly">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="usrEmail">User Email</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="usrEmail" id="usrEmail" value="{{ user.nhnc_id }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="apiPw">API Password</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="apiPw" id="apiPw">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="submit" class="btn btn-info justify-content-end" onclick="alert('삭제 명령 전송 후 Cluster 리스트가 조회됩니다...')">Request</button>
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
function tenantIdToModal() {
|
||||
id = event.srcElement.id
|
||||
var idx = id.indexOf('-') + 1
|
||||
tenantId = "tenant_id-" + id.substring(idx)
|
||||
clusterNameId = "name-" + id.substring(idx)
|
||||
regionId = "region-" + id.substring(idx)
|
||||
document
|
||||
.getElementById('region')
|
||||
.value = document
|
||||
.getElementById(regionId)
|
||||
.innerText
|
||||
document
|
||||
.getElementById('clusterName')
|
||||
.value = document
|
||||
.getElementById(clusterNameId)
|
||||
.innerText
|
||||
document
|
||||
.getElementById('tenantId')
|
||||
.value = "{{ user.nhnc_api_tenant_id }}";
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
165
nhncloud/templates/nhncloud/_rs_vpc_list.html
Normal file
165
nhncloud/templates/nhncloud/_rs_vpc_list.html
Normal file
@ -0,0 +1,165 @@
|
||||
{% extends 'components/base_nhncloud.html' %}
|
||||
{% load static %}
|
||||
{% block main_area %}
|
||||
<section>
|
||||
<!-- start vpclist -->
|
||||
{% if vpcs %}
|
||||
<div class="col-lg-12">
|
||||
<h1>Result Message</h1>
|
||||
<h6 class="text-danger">Network를 삭제려면 Network에 속한 사용 중인 리소스를 먼저 제거해야 합니다.</h6>
|
||||
<hr>
|
||||
</div>
|
||||
{% for var in vpcs %}
|
||||
<div class="col-lg-12">
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">No</th>
|
||||
<th scope="col">Region</th>
|
||||
{% for key in var.keys %}
|
||||
<th scope="col">{{ key }}</th>
|
||||
{% endfor %}
|
||||
<th scope="col">
|
||||
delete
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{ forloop.counter }}</td>
|
||||
<!-- <td id="region-{{ forloop.counter }}">{{ region }}</td> -->
|
||||
<td id="region-{{ forloop.counter }}">{{ region }}</td>
|
||||
{% for key, value in var.items %}
|
||||
<td id="{{ key }}-{{ forloop.parentloop.counter }}">{{ value }}</td>
|
||||
{% endfor %}
|
||||
<td>
|
||||
<a type="submit" id="delete-{{ forloop.counter }}" class="btn btn-info float-right" href="#"
|
||||
data-bs-toggle="modal" data-bs-target="#deleteModal" onclick="vpcRemoveModal();">Delete</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<div class="col-lg-12">
|
||||
<h1>Result Message</h1>
|
||||
<hr>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
<h3>리전에 생성된 VPC가 없습니다...</h3>
|
||||
</div>
|
||||
<div class="col-lg-2">
|
||||
<a class="btn btn-primary float-left" href="/nhncloud/createVpcRequest/">CreateNetwork</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</section>
|
||||
<!-- Modal -->
|
||||
<form method="post" action="{% url 'nhncloud:removeVpc' %}">{% csrf_token %}
|
||||
<div class="modal fade" id="deleteModal" tabindex="-1" aria-labelledby="deleteModal" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="deleteModalTitle">삭제를 위하여 계정 및 api 비밀번호를 입력해주세요.</h5>
|
||||
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="region">InterNetGateway</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="igwRadios" id="igwInclude" value="option1" checked>
|
||||
<label class="form-check-label" for="igwRadios1">
|
||||
Include
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="igwRadios" id="igwDetach" value="option2">
|
||||
<label class="form-check-label" for="igwRadios2">
|
||||
Detach
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="region">Region</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="region" id="region" value="{{ region }}" readonly>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="vpcName">Vpc Name</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="vpcName" id="vpcName" readonly>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="tenantId">Tenant ID</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="tenantId" id="tenantId" value="{{ user.nhnc_api_tenant_id }}" readonly>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="usrEmail">User Email</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="usrEmail" id="usrEmail" value="{{ user.nhnc_id }}" readonly>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="apiPw">API Password</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="apiPw" id="apiPw">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="submit" class="btn btn-info float-right"
|
||||
onclick="alert('삭제 완료 후 VPC리스트가 조회됩니다...')">Request</button>
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
function vpcRemoveModal() {
|
||||
|
||||
id = event.srcElement.id
|
||||
console.log(id);
|
||||
var idx = id.indexOf('-') + 1
|
||||
tenantId = "tenant_id-" + id.substring(idx)
|
||||
vpcNameId = "name-" + id.substring(idx)
|
||||
regionId = "region-" + id.substring(idx)
|
||||
document.getElementById('vpcName').value = document.getElementById(vpcNameId).innerText
|
||||
document.getElementById('region').value = document.getElementById(regionId).innerText
|
||||
document.getElementById('tenantId').value = "{{ user.nhnc_api_tenant_id }}";
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
182
nhncloud/templates/nhncloud/apiList.html
Normal file
182
nhncloud/templates/nhncloud/apiList.html
Normal file
@ -0,0 +1,182 @@
|
||||
{% extends 'components/base_nhncloud.html' %}
|
||||
{% load static %}
|
||||
{% block main_area %}
|
||||
|
||||
<section>
|
||||
<div class="container">
|
||||
<div class="row justify-content-between">
|
||||
<div class="col-lg-4 text-warning">
|
||||
<h2 class="text-dark mt-5">NHN Cloud</h2>
|
||||
<div class="card mt-1">
|
||||
<div class="card-body">
|
||||
<h6 class="text-dark">사용전 주의 사항</h6>
|
||||
<a class="btn btn-warning float-left text-white" href="/nhncloud/preparations" target="_blank">Preparations</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card mt-1">
|
||||
<div class="card-body">
|
||||
<h6 class="text-dark">VPC 조회 및 삭제</h6>
|
||||
<a class="btn btn-primary float-left" href="/nhncloud/infoVpcListRequest">Network Info</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card mt-1">
|
||||
<div class="card-body">
|
||||
<h6 class="text-dark">VPC 및 Public Subnet 구성</h6>
|
||||
<a class="btn btn-primary float-left" href="/nhncloud/createVpcRequest">CreateNetwork</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4 text-warning">
|
||||
<h2 class="text-dark mt-5">NKS Cluster</h2>
|
||||
<div class="card mt-1">
|
||||
<div class="card-body">
|
||||
<h6 class="text-dark">NHN Cloud Kubernetes Cluster 생성</h6>
|
||||
<div class="row">
|
||||
<div class="col-lg-6">
|
||||
<a class="btn btn-primary float-left" href="/nhncloud/createClusterOnlyRequest">Cluster Only</a>
|
||||
</div>
|
||||
<div class="col-lg-6">
|
||||
<a class="btn btn-danger text-white float-left" href="/nhncloud/createClusterRequest">Cluster + VPC</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card mt-1">
|
||||
<div class="card-body">
|
||||
<h6 class="text-dark">Kubernetes Cluster Info</h6>
|
||||
<a class="btn btn-primary float-left" href="/nhncloud/infoClusterListRequest">Cluster List Info</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="col-lg-4 text-warning">
|
||||
<h2 class="text-dark mt-5">NKS Components</h2>
|
||||
<div class="card mt-1">
|
||||
<div class="card-body">
|
||||
<h6 class="text-dark">Ingress LoadBalancer Deploy</h6>
|
||||
<div class="row">
|
||||
<div class="col-lg-4">
|
||||
<a class="btn btn-dark float-left" href="#">View</a>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<a class="btn btn-info float-left" href="/nhncloud/applyClusterLbRequest">Deploy</a>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<a class="btn btn-dark float-left" href="#">Delete</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card mt-1">
|
||||
<div class="card-body">
|
||||
<h6 class="text-dark">Sample Pod Deploy</h6>
|
||||
<div class="row">
|
||||
<div class="col-lg-4">
|
||||
<a class="btn btn-dark float-left" href="#">View</a>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<a class="btn btn-dark float-left" href="#">Deploy</a>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<a class="btn btn-dark float-left" href="#">Delete</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card mt-1">
|
||||
<div class="card-body">
|
||||
<h6 class="text-dark">개발 예정</h6>
|
||||
<a class="btn btn-dark float-left" href="#">개발 예정</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row justify-content-between">
|
||||
<div class="col-lg-4 text-warning">
|
||||
<h2 class="text-dark mt-5">Storage</h2>
|
||||
<div class="card mt-1">
|
||||
<div class="card-body">
|
||||
<h6 class="text-dark">Object Storage</h6>
|
||||
<div class="row">
|
||||
<div class="col-lg-4">
|
||||
<a class="btn btn-primary float-left" href="/nhncloud/infoObjectStorageRequest">View</a>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<a class="btn btn-dark float-left" href="#">Create</a>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<a class="btn btn-dark float-left" href="#">empty</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card mt-1">
|
||||
<div class="card-body">
|
||||
<h6 class="text-dark">Block Storage</h6>
|
||||
<div class="row">
|
||||
<div class="col-lg-4">
|
||||
<a class="btn btn-dark float-left" href="#">View</a>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<a class="btn btn-dark float-left" href="#">Deploy</a>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<a class="btn btn-dark float-left" href="#">Delete</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card mt-1">
|
||||
<div class="card-body">
|
||||
<h6 class="text-dark">NFS</h6>
|
||||
<a class="btn btn-dark text-whitefloat-left" href="#">API 기능 없음</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4 text-warning">
|
||||
<h2 class="text-dark mt-5">...</h2>
|
||||
<div class="card mt-1">
|
||||
<div class="card-body">
|
||||
<h6 class="text-dark">개발 예정</h6>
|
||||
<a class="btn btn-dark float-left" href="#">개발 예정</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card mt-1">
|
||||
<div class="card-body">
|
||||
<h6 class="text-dark">개발 예정</h6>
|
||||
<a class="btn btn-dark float-left" href="#">개발 예정</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card mt-1">
|
||||
<div class="card-body">
|
||||
<h6 class="text-dark">개발 예정</h6>
|
||||
<a class="btn btn-dark float-left" href="#">개발 예정</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4 text-warning">
|
||||
<h2 class="text-dark mt-5">...</h2>
|
||||
<div class="card mt-1">
|
||||
<div class="card-body">
|
||||
<h6 class="text-dark">개발 예정</h6>
|
||||
<a class="btn btn-dark float-left" href="#">개발 예정</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card mt-1">
|
||||
<div class="card-body">
|
||||
<h6 class="text-dark">개발 예정</h6>
|
||||
<a class="btn btn-dark float-left" href="#">개발 예정</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card mt-1">
|
||||
<div class="card-body">
|
||||
<h6 class="text-dark">개발 예정</h6>
|
||||
<a class="btn btn-dark float-left" href="#">개발 예정</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{% endblock %}
|
312
nhncloud/templates/nhncloud/createClusterOnlyRequest.bak.html
Normal file
312
nhncloud/templates/nhncloud/createClusterOnlyRequest.bak.html
Normal file
@ -0,0 +1,312 @@
|
||||
<!DOCTYPE html>
|
||||
{% load static %}
|
||||
<html lang="ko">
|
||||
|
||||
<head>
|
||||
<title>Create Cluster | sdjo web site</title>
|
||||
<link rel="stylesheet" href="{% static 'blog/bootstrap/bootstrap.min.css' %}" type="text/css">
|
||||
<script src="https://kit.fontawesome.com/77d81e5d17.js" crossorigin="anonymous"></script>
|
||||
</head>
|
||||
|
||||
<body class="pb-5">
|
||||
{% include 'common/navbar.html' %}
|
||||
<section>
|
||||
<div class="mt-3 row">
|
||||
<div class="mt-5 col-12 text-center">Create NKS Public-Subnet
|
||||
<br>
|
||||
<samp>충돌 여부 확인 후 문제 없을시 기본값 사용 가능.</samp>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-4">
|
||||
<!-- region -->
|
||||
<form name="formRegion" action="." method="post">{% csrf_token %}
|
||||
<div class="mb-3 mt-5">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="region-pre">Region</label>
|
||||
</div>
|
||||
<div class="col-md-7">
|
||||
<select class="form-control" name="region-pre" id="region-pre">
|
||||
<option value="select...">select...</option>
|
||||
<option value="kr1">판교</option>
|
||||
<option value="kr2">평촌</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="apiPw">API Password</label>
|
||||
</div>
|
||||
<div class="col-md-7">
|
||||
<input type="password" class="form-control" name="apiPw" id="apiPw">
|
||||
<input type="hidden" class="form-control" name="usrEmail" id="usrEmail" value="{{ user.nhn_id }}">
|
||||
<input type="hidden" name="tenantId-pre" id="tenantId-pre" value="{{ user.nhn_cpt_tntid }}">
|
||||
<input type="hidden" name="searchVpcList" id="searchVpcList" value="yes">
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<button type="submit" class="btn btn-primary float-right"><i class="fa-solid fa-magnifying-glass"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<form method="post" action="{% url 'nhncloud:createOnlyCluster' %}">{% csrf_token %}
|
||||
<div class="mb-3 mt-5">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="region-pre">Region</label>
|
||||
</div>
|
||||
<div class="col-md-7">
|
||||
<select class="form-control" name="region-pre" id="region-pre">
|
||||
<option value="select...">select...</option>
|
||||
<option value="kr1">판교</option>
|
||||
<option value="kr2">평촌</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- vpc -->
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="vpc">VPC</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<select class="form-control" name="vpc" id="vpc" onchange="vpcToSubnetList();">
|
||||
<option value="select...">select...</option>
|
||||
{% for var in vpcList %}
|
||||
{% for key, value in var.items %}
|
||||
<option value="{{ key }}">{{ key }}</option>
|
||||
<!-- <option value="{{ value }}">{{ key }}</option> -->
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- subnet -->
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="publicSubnet">Public subnet</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="publicSubnet" id="publicSubnet" readonly>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="clusterName">Cluster Name</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="clusterName" id="clusterName" value="demo-cluster">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="keyPair">KeyPair Name</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<select class="form-control" name="KeyPair" id="KeyPair" value="selectKeyPair">
|
||||
<option value="select...">select...</option>
|
||||
<option value="keyPair-kr1">keyPair-kr1</option>
|
||||
<option value="keyPair-kr2">keyPair-kr2</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="tenantId">Tenant ID</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="tenantId" id="tenantId">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="igwId">InternetGateway ID</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="igwId" id="igwId">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="usrEmail">User Email</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="usrEmail" id="usrEmail" value="{{ user.nhn_id }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="apiPw">API Password</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="apiPw" id="apiPw">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary float-right" onclick="createClickMsg();">Create</button>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-lg-4"></div>
|
||||
</div>
|
||||
<!-- modal -->
|
||||
<form method="post" action="{% url 'nhncloud:removeCluster' %}">{% csrf_token %}
|
||||
<div class="modal fade" id="deleteModal" tabindex="-1" aria-labelledby="deleteModal" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="deleteModalTitle">API 비밀번호를 입력해주세요.</h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="region">Region</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<select class="form-control" name="region" id="region" readonly>
|
||||
<option value="select...">select...</option>
|
||||
<option value="kr1">판교</option>
|
||||
<option value="kr2">평촌</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="clusterName">Cluster Name</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="clusterName" id="clusterName" readonly>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="tenantId">Tenant ID</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="tenantId" id="tenantId" readonly>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="usrEmail">User Email</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="usrEmail" id="usrEmail" value="{{ user.nhn_id }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="apiPw">API Password</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="apiPw" id="apiPw">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="submit" class="btn btn-info float-right" onclick="alert('삭제 명령 전송 후 Cluster 리스트가 조회됩니다...')">Request</button>
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"
|
||||
integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj"
|
||||
crossorigin="anonymous"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"
|
||||
integrity="sha384-Fy6S3B9q64WdZWQUiU+q4/2Lc9npb8tCaSX9FK7E8HnRr0Jz8D6OP9dO5Vg3Q9ct"
|
||||
crossorigin="anonymous"></script>
|
||||
<script>
|
||||
function selectRegion(){
|
||||
var selectRegionValue;
|
||||
|
||||
if(document.getElementById('region-pre').value == ""){
|
||||
selectRegionValue = document.getElementById('region').value;
|
||||
}else{
|
||||
selectRegionValue = document.getElementById('region-pre').value;
|
||||
}
|
||||
|
||||
console.log(selectRegionValue);
|
||||
|
||||
document.getElementById('tenantId').value = "{{ user.nhn_cpt_tntid }}";
|
||||
if (selectRegionValue == "kr1") {
|
||||
document.getElementById('vpc').value = "kr1";
|
||||
}
|
||||
else if (selectRegionValue == "kr2") {
|
||||
document.getElementById('vpc').value = "kr2";
|
||||
}
|
||||
else {
|
||||
document.getElementById('KeyPair').value = "none";
|
||||
}
|
||||
console.log("다른 함수 호출");
|
||||
vpcToSubnetList();
|
||||
}
|
||||
|
||||
function vpcToSubnetList(){
|
||||
let selectRegionValue = document.getElementById('vpc').value;
|
||||
var dict = {};
|
||||
var subDict = {};
|
||||
{% for x, y in subnetList.items %}
|
||||
{% for a, b in y.items %}
|
||||
subDict["{{ a }}"] = "{{ b | safe}}";
|
||||
{% endfor %}
|
||||
dict["{{ x }}"] = subDict;
|
||||
subDict = {};
|
||||
{% endfor %}
|
||||
console.log("dict출력 : ");
|
||||
console.log(dict);
|
||||
// console.log(dict["demo2-vpc"]["name"]);
|
||||
// console.log(dict["demo2-vpc"]["id"]);
|
||||
// console.log(selectRegionValue);
|
||||
console.log(dict[selectRegionValue]["name"]);
|
||||
console.log(dict[selectRegionValue]["id"]);
|
||||
document.getElementById('publicSubnet').value = dict[selectRegionValue]["id"];
|
||||
|
||||
}
|
||||
|
||||
function createClickMsg(){
|
||||
alert('약 15분 이내로 Cluster가 생성됩니다.\n페이지 새로고침을 하지 말아주세요.\n생성이 완료되면 페이지가 변경됩니다.');
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
{% include 'blog/footer.html' %}
|
||||
</html>
|
157
nhncloud/templates/nhncloud/createClusterRequest.html
Normal file
157
nhncloud/templates/nhncloud/createClusterRequest.html
Normal file
@ -0,0 +1,157 @@
|
||||
<!DOCTYPE html>
|
||||
{% load static %}
|
||||
<html lang="ko">
|
||||
|
||||
<head>
|
||||
<title>Create Cluster | sdjo web site</title>
|
||||
<link rel="stylesheet" href="{% static 'blog/bootstrap/bootstrap.min.css' %}" type="text/css">
|
||||
<script src="https://kit.fontawesome.com/77d81e5d17.js" crossorigin="anonymous"></script>
|
||||
</head>
|
||||
|
||||
<body class="pb-5">
|
||||
{% include 'common/navbar.html' %}
|
||||
<section>
|
||||
<div class="mt-3 row">
|
||||
<div class="mt-5 col-12 text-center">Create NKS Public-Subnet
|
||||
<br>
|
||||
<samp>충돌 여부 확인 후 문제 없을시 기본값 사용 가능.</samp>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-4"></div>
|
||||
<div class="col-lg-4">
|
||||
<form method="post" action="{% url 'nhncloud:createCluster' %}">{% csrf_token %}
|
||||
<div class="mb-3 mt-5">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="taskName">Task Name</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="taskName" id="taskName" value="demo">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="region">Region</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<select class="form-control" name="region" id="region" onchange="selectRegion(this.value);">
|
||||
<option value="select...">select...</option>
|
||||
<option value="kr1">판교</option>
|
||||
<option value="kr2">평촌</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="keyPair">KeyPair Name</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<select class="form-control" name="KeyPair" id="KeyPair" value="selectKeyPair">
|
||||
<option value="select...">select...</option>
|
||||
<option value="keyPair-kr1">keyPair-kr1</option>
|
||||
<option value="keyPair-kr2">keyPair-kr2</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="tenantId">Tenant ID</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="tenantId" id="tenantId">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="usrEmail">User Email</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="usrEmail" id="usrEmail" value="{{ user.nhn_id }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="apiPw">API Password</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="apiPw" id="apiPw">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="vpcCidr">Vpc cidr</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="vpcCidr" id="vpcCidr" value="10.5.0.0/16">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="subnetCidr">Subnet cidr</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="subnetCidr" id="subnetCidr" value="10.5.2.0/24">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="igwId">InternetGateway ID</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="igwId" id="igwId">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary float-right" onclick="createClickMsg();">Create</button>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-lg-4"></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"
|
||||
integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj"
|
||||
crossorigin="anonymous"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"
|
||||
integrity="sha384-Fy6S3B9q64WdZWQUiU+q4/2Lc9npb8tCaSX9FK7E8HnRr0Jz8D6OP9dO5Vg3Q9ct"
|
||||
crossorigin="anonymous"></script>
|
||||
<script>
|
||||
function selectRegion(){
|
||||
let selectRegionValue = document.getElementById('region').value;
|
||||
console.log(selectRegionValue);
|
||||
document.getElementById('tenantId').value = "{{ user.nhn_cpt_tntid }}";
|
||||
if (selectRegionValue == "kr1") {
|
||||
document.getElementById('KeyPair').value = "keyPair-kr1";
|
||||
}
|
||||
else if (selectRegionValue == "kr2") {
|
||||
document.getElementById('KeyPair').value = "keyPair-kr2";
|
||||
}
|
||||
else {
|
||||
document.getElementById('KeyPair').value = "none";
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
function createClickMsg(){
|
||||
alert('약 15분 이내로 Cluster가 생성됩니다.\n페이지 새로고침을 하지 말아주세요.\n생성이 완료되면 페이지가 변경됩니다.');
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
133
nhncloud/templates/nhncloud/createVpcRequest.html
Normal file
133
nhncloud/templates/nhncloud/createVpcRequest.html
Normal file
@ -0,0 +1,133 @@
|
||||
{% extends 'components/base_nhncloud.html' %}
|
||||
|
||||
{% block main_area %}
|
||||
<section>
|
||||
<div class="mt-3 row">
|
||||
<div class="mt-5 col-12 text-center">Create VPC & Public-Subnet
|
||||
<br>
|
||||
<samp>충돌 여부 확인 후 문제 없을시 기본값 사용 가능.</samp>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-4"></div>
|
||||
<div class="col-lg-4">
|
||||
<form method="post" action="{% url 'nhncloud:createVpc' %}">{% csrf_token %}
|
||||
<div class="mb-3 mt-5">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="taskName">VPC Name</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="taskName" id="taskName" value="demo-vpc">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="region">Region</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<select class="form-control" name="region" id="region" onchange="selectRegion(this.value);">
|
||||
<option value="select...">select...</option>
|
||||
<option value="kr1">판교</option>
|
||||
<option value="kr2">평촌</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="tenantId">Tenant ID</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="tenantId" id="tenantId">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="usrEmail">User Email</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="usrEmail" id="usrEmail"
|
||||
value="{{ user.nhnc_id }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="apiPw">API Password</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="apiPw" id="apiPw">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="vpcCidr">Vpc cidr</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="vpcCidr" id="vpcCidr" value="10.5.0.0/16">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="subnetCidr">Subnet cidr</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="subnetCidr" id="subnetCidr"
|
||||
value="10.5.2.0/24">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="igwId">InternetGateway ID</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control bg-light" name="igwId" id="igwId"
|
||||
placeholder="값을 넣지 않으면 Private Subnet으로 생성됩니다.">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary float-right" onclick="createClickMsg();">Create</button>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-lg-4"></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
<script>
|
||||
function selectRegion() {
|
||||
let selectRegionValue = document.getElementById('region').value;
|
||||
console.log(selectRegionValue);
|
||||
document.getElementById('tenantId').value = "{{ user.nhnc_api_tenant_id }}";
|
||||
if (selectRegionValue == "kr1") {
|
||||
document.getElementById('KeyPair').value = "keyPair-kr1";
|
||||
}
|
||||
else if (selectRegionValue == "kr2") {
|
||||
document.getElementById('KeyPair').value = "keyPair-kr2";
|
||||
}
|
||||
else {
|
||||
document.getElementById('KeyPair').value = "none";
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
function createClickMsg() {
|
||||
alert('약 5분 이내로 Vpc가 생성됩니다.\n페이지 새로고침을 하지 말아주세요.\n생성이 완료되면 페이지가 변경됩니다.');
|
||||
}
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
109
nhncloud/templates/nhncloud/infoClusterDetailRequest.html
Normal file
109
nhncloud/templates/nhncloud/infoClusterDetailRequest.html
Normal file
@ -0,0 +1,109 @@
|
||||
<!DOCTYPE html>
|
||||
{% load static %}
|
||||
<html lang="ko">
|
||||
|
||||
<head>
|
||||
<title>Info Request | sdjo web site</title>
|
||||
<link rel="stylesheet" href="{% static 'blog/bootstrap/bootstrap.min.css' %}" type="text/css">
|
||||
<script src="https://kit.fontawesome.com/77d81e5d17.js" crossorigin="anonymous"></script>
|
||||
</head>
|
||||
|
||||
<body class="pt-5">
|
||||
{% include 'common/navbar.html' %}
|
||||
|
||||
<section>
|
||||
<div class="row">
|
||||
<div class="mt-5 col-12 text-center">Create NKS Public-Subnet
|
||||
<br>
|
||||
<samp>충돌 여부 확인 후 문제 없을시 기본값 사용 가능.</samp>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
|
||||
<div class="col-lg-4"></div>
|
||||
<div class="col-lg-4">
|
||||
<form method="post" action="{% url 'nhncloud:infoClusterDetail' %}">{% csrf_token %}
|
||||
<div class="mb-3 mt-5">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="clusterName">Cluster Name</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="clusterName" id="clusterName" value="demo-cluster">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="region">Region</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<select class="form-control" name="region" id="region" onchange="selectRegion(this.value);">
|
||||
<option value="select...">select...</option>
|
||||
<option value="kr1">판교</option>
|
||||
<option value="kr2">평촌</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="tenantId">Tenant ID</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="tenantId" id="tenantId">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="usrEmail">User Email</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="usrEmail" id="usrEmail" value="{{ user.nhn_id }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="apiPw">API Password</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="apiPw" id="apiPw">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-info float-right">Request</button>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-lg-4"></div>
|
||||
</div>
|
||||
</section>
|
||||
<div class="fixed-bottom">
|
||||
{% include 'blog/footer.html' %}
|
||||
</div>
|
||||
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"
|
||||
integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj"
|
||||
crossorigin="anonymous"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"
|
||||
integrity="sha384-Fy6S3B9q64WdZWQUiU+q4/2Lc9npb8tCaSX9FK7E8HnRr0Jz8D6OP9dO5Vg3Q9ct"
|
||||
crossorigin="anonymous"></script>
|
||||
<script>
|
||||
function selectRegion(){
|
||||
let selectRegionValue = document.getElementById('region').value;
|
||||
console.log(selectRegionValue);
|
||||
document.getElementById('tenantId').value = "{{ user.nhn_cpt_tntid }}";
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
function createClickMsg(){
|
||||
alert('Cluster 상태가 조회됩니다.');
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
76
nhncloud/templates/nhncloud/infoClusterListRequest.html
Normal file
76
nhncloud/templates/nhncloud/infoClusterListRequest.html
Normal file
@ -0,0 +1,76 @@
|
||||
{% extends 'components/base_nhncloud.html' %}
|
||||
{% load static %}
|
||||
{% block main_area %}
|
||||
<section>
|
||||
<div class="row">
|
||||
<div class="mt-5 col-12 text-center">NKS Cluster Information</div>
|
||||
</div>
|
||||
<br>
|
||||
<div class="row">
|
||||
|
||||
<div class="col-lg-4"></div>
|
||||
<div class="col-lg-4">
|
||||
<form method="post" action="{% url 'nhncloud:infoClusterList' %}">{% csrf_token %}
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="region">Region</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<select class="form-control" name="region" id="region" onchange="selectRegion(this.value);">
|
||||
<option value="select...">select...</option>
|
||||
<option value="kr1">판교</option>
|
||||
<option value="kr2">평촌</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="tenantId">Tenant ID</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="tenantId" id="tenantId">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="usrEmail">User Email</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="usrEmail" id="usrEmail" value="{{ user.nhnc_id }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="apiPw">API Password</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="apiPw" id="apiPw">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-info float-right">Request</button>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-lg-4"></div>
|
||||
</div>
|
||||
</section>
|
||||
<script>
|
||||
function selectRegion(){
|
||||
let selectRegionValue = document.getElementById('region').value;
|
||||
console.log(selectRegionValue);
|
||||
document.getElementById('tenantId').value = "{{ user.nhnc_api_tenant_id }}";
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
function createClickMsg(){
|
||||
alert('Cluster 상태가 조회됩니다.');
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
97
nhncloud/templates/nhncloud/infoObjectStorageRequest.html
Normal file
97
nhncloud/templates/nhncloud/infoObjectStorageRequest.html
Normal file
@ -0,0 +1,97 @@
|
||||
<!DOCTYPE html>
|
||||
{% load static %}
|
||||
<html lang="ko">
|
||||
|
||||
<head>
|
||||
<title>Info Request | sdjo web site</title>
|
||||
<link rel="stylesheet" href="{% static 'blog/bootstrap/bootstrap.min.css' %}" type="text/css">
|
||||
<script src="https://kit.fontawesome.com/77d81e5d17.js" crossorigin="anonymous"></script>
|
||||
</head>
|
||||
|
||||
<body class="pt-5">
|
||||
{% include 'common/navbar.html' %}
|
||||
<section>
|
||||
<div class="row">
|
||||
<div class="mt-5 col-12 text-center">NKS ObjectStorage Information</div>
|
||||
</div>
|
||||
<br>
|
||||
<div class="row">
|
||||
|
||||
<div class="col-lg-4"></div>
|
||||
<div class="col-lg-4">
|
||||
<form method="post" action="{% url 'nhncloud:infoObjectStorageList' %}">{% csrf_token %}
|
||||
<input type="hidden" class="form-control" name="objStrgAccount" id="objStrgAccount" value="{{ user.nhn_obstg_sc }}">
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="region">Region</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<select class="form-control" name="region" id="region" onchange="selectRegion(this.value);">
|
||||
<option value="select...">select...</option>
|
||||
<option value="kr1">판교</option>
|
||||
<option value="kr2">평촌</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="tenantId">Tenant ID</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="tenantId" id="tenantId">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="usrEmail">User Email</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="usrEmail" id="usrEmail" value="{{ user.nhn_id }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="apiPw">API Password</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="apiPw" id="apiPw">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-info float-right">Request</button>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-lg-4"></div>
|
||||
</div>
|
||||
</section>
|
||||
<div class="fixed-bottom">
|
||||
{% include 'blog/footer.html' %}
|
||||
</div>
|
||||
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"
|
||||
integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj"
|
||||
crossorigin="anonymous"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"
|
||||
integrity="sha384-Fy6S3B9q64WdZWQUiU+q4/2Lc9npb8tCaSX9FK7E8HnRr0Jz8D6OP9dO5Vg3Q9ct"
|
||||
crossorigin="anonymous"></script>
|
||||
<script>
|
||||
function selectRegion(){
|
||||
let selectRegionValue = document.getElementById('region').value;
|
||||
console.log(selectRegionValue);
|
||||
document.getElementById('tenantId').value = "{{ user.nhn_obstg_tntid }}";
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
function createClickMsg(){
|
||||
alert('Object Storage 리스트가 조회됩니다.');
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
37
nhncloud/templates/nhncloud/preparations.html
Normal file
37
nhncloud/templates/nhncloud/preparations.html
Normal file
@ -0,0 +1,37 @@
|
||||
{% extends 'components/base_nhncloud.html' %}
|
||||
{% load static %}
|
||||
{% block main_area %}
|
||||
<section>
|
||||
<div class="container">
|
||||
<div class="row justify-content-between">
|
||||
<div class="mt-5">
|
||||
<h1>
|
||||
주의 사항</h1>
|
||||
<p>
|
||||
<ul>
|
||||
<li>InternetGateway는 사용 전 미리 생성해두어야 합니다(NHN Cloud API 기능 미제공).</li>
|
||||
<li>Compute Instance의 TenantId정보가 필요합니다..</li>
|
||||
<li>Object Storage 기능을 사용하려면 ObjectStorage의 TenantId정보가 필요합니다..</li>
|
||||
<hr>
|
||||
<li>VPC 삭제 시 Detach(연결해제) 옵션으로 삭제하면 InternetGateway를 재사용 할 수 있습니다.</li>
|
||||
<ul>
|
||||
<li>`NHN Cloud API` > 관리대장 > 인터넷 게이트웨이'에 수동 등록관리하여 사용을 권장합니다.</li>
|
||||
</ul>
|
||||
<li>Region 별로 KeyPair를 미리 생성해주세요.</li>
|
||||
<ul>
|
||||
<li>판교: keyPair-kr1</li>
|
||||
<li>평촌: keyPair-kr2</li>
|
||||
</ul>
|
||||
<hr>
|
||||
<li>`Butler DDoCHI`에서 생성한 NHN Cloud리소스가 아닌 다른 방법으로 리소스가 추가 및 생성된 경우 본 솔루션에서 NHN Cloud 리소스를 정상적으로 제어하지 못 할 수 있습니다.
|
||||
</li>
|
||||
<hr>
|
||||
<li>지속 기능 구현 중 입니다...</li>
|
||||
</ul>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{% endblock %}
|
222
nhncloud/templates/nhncloud/resultRequest.html
Normal file
222
nhncloud/templates/nhncloud/resultRequest.html
Normal file
@ -0,0 +1,222 @@
|
||||
{% extends 'components/base_nhncloud.html' %}
|
||||
{% load static %}
|
||||
{% block main_area %}
|
||||
<section>
|
||||
<div class="container mt-5">
|
||||
<div class="row justify-content-between">
|
||||
{% if target == "tokenErr" %}
|
||||
<div class="col-lg-12">
|
||||
<h1>Toekn Identification Get ERR</h1>
|
||||
<hr>
|
||||
</div>
|
||||
<div class="col-lg-12">
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">status</th>
|
||||
<th scope="col">title</th>
|
||||
<th scope="col">detail</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{ code }} </td>
|
||||
<td>{{ errTitle }}</td>
|
||||
<td>{{ errMsg }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% elif target == "infoClusterErr" %}
|
||||
<div class="col-lg-12">
|
||||
<h1>Cluster Information Get ERR Message</h1>
|
||||
<hr>
|
||||
</div>
|
||||
<div class="col-lg-12">
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">status</th>
|
||||
<th scope="col">title</th>
|
||||
<th scope="col">detail</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{ clusterInfoStatus }} </td>
|
||||
<td>{{ clusterInfoTitle }}</td>
|
||||
<td>{{ clusterInfoDetail }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% elif target == "infoClusterDetail" %}
|
||||
<div class="col-lg-12">
|
||||
<h1>Result Message</h1>
|
||||
<hr>
|
||||
</div>
|
||||
<div class="col-lg-12">
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">name</th>
|
||||
<th scope="col">status</th>
|
||||
<th scope="col">config</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{ clusterName }} </td>
|
||||
<td>{{ clusterInfoStatus }} </td>
|
||||
<td>{{ kubeConfig }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- start ObjectStorageList -->
|
||||
{% elif target == "objectStorageList" %}
|
||||
{% if objectList %}
|
||||
<div class="col-lg-12">
|
||||
<h1>Result Message</h1>
|
||||
<h6>Object 삭제시 Object에 속한 저장 중인 데이터가 모두 삭제 됩니다.</h6>
|
||||
<hr>
|
||||
</div>
|
||||
{% for var in objectList %}
|
||||
<div class="col-lg-12">
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">No</th>
|
||||
<th scope="col">Region</th>
|
||||
<th scope="col">Name</th>
|
||||
<th scope="col">
|
||||
delete
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{ forloop.counter }}</td>
|
||||
<td id="region-{{ forloop.counter }}">{{ region }}</td>
|
||||
<td id="objStorageNameId-{{ forloop.counter }}">{{ var }}</td>
|
||||
<td>
|
||||
<a type="submit" id="delete-{{ forloop.counter }}" class="btn btn-info float-right" href="#" data-bs-toggle="modal" data-bs-target="#deleteModal" onclick="tenantIdToModal();">Delete</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<div class="col-lg-12">
|
||||
<h1>Result Message</h1>
|
||||
<hr>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
<h3>리전에 생성된 Object Storage가 없습니다...</h3>
|
||||
</div>
|
||||
<div class="col-lg-2">
|
||||
<a class="btn btn-primary float-left" href="/nhncloud/">API List</a>
|
||||
</div>
|
||||
<div class="col-lg-2">
|
||||
<a class="btn btn-primary float-left" href="/nhncloud/infoObjectStorageRequest">Create Object</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<!-- end ObjectStorageList -->
|
||||
{% else %}
|
||||
<div class="col-lg-12">
|
||||
<h1>Result Message</h1>
|
||||
<hr>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
<h3>{{ resultMsg }}</h3>
|
||||
</div>
|
||||
<div class="col-lg-2">
|
||||
<a class="btn btn-primary float-left" href="/nhncloud/">API List</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Delete ObjectStorage -->
|
||||
{% elif target == "objectStorageList" %}
|
||||
<form method="post" action="{% url 'nhncloud:removeObjectStorage' %}">{% csrf_token %}
|
||||
<input type="hidden" class="form-control" name="objStrgAccount" id="objStrgAccount" value="{{ user.nhn_obstg_sc }}">
|
||||
<input type="hidden" class="form-control" name="tenantId" id="tenantId" value="{{ user.nhn_obstg_tntid }}">
|
||||
<input type="hidden" class="form-control" name="usrEmail" id="usrEmail" value="{{ user.nhnc_id }}">
|
||||
<div class="modal fade" id="deleteModal" tabindex="-1" aria-labelledby="deleteModal" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="deleteModalTitle">API 비밀번호를 입력해주세요.</h5>
|
||||
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4 form-group">
|
||||
<label for="region">Region</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<select class="form-control" name="region" id="region" readonly>
|
||||
<option value="select...">select...</option>
|
||||
<option value="kr1">판교</option>
|
||||
<option value="kr2">평촌</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="objStorageNameId">Object Name</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="text" class="form-control" name="objStorageNameId" id="objStorageNameId" readonly>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<label for="apiPw">API Password</label>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
<input type="password" class="form-control" name="apiPw" id="apiPw">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="submit" class="btn btn-info float-right" onclick="alert('삭제 명령 전송 후 Cluster 리스트가 조회됩니다...')">Request</button>
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
function tenantIdToModal(){
|
||||
id = event.srcElement.id
|
||||
var idx = id.indexOf('-') + 1
|
||||
tenantId = "tenant_id-" + id.substring(idx)
|
||||
objStorageNameId = "objStorageNameId-" + id.substring(idx)
|
||||
regionId = "region-" + id.substring(idx)
|
||||
document.getElementById('region').value = document.getElementById(regionId).innerText
|
||||
// 오브젝트 스토리지이름
|
||||
document.getElementById('objStorageNameId').value = document.getElementById(objStorageNameId).innerText
|
||||
}
|
||||
</script>
|
||||
{% else %}
|
||||
{% endif %}
|
||||
</section>
|
||||
|
||||
{% endblock %}
|
10
nhncloud/templates/nhncloud/rs_test.html
Normal file
10
nhncloud/templates/nhncloud/rs_test.html
Normal file
@ -0,0 +1,10 @@
|
||||
{% extends 'components/base_nhncloud.html' %}
|
||||
{% load static %}
|
||||
{% block main_area %}
|
||||
<section>
|
||||
<h1>Token</h1>
|
||||
{{ state }}
|
||||
{{ tokenValue}}
|
||||
</section>
|
||||
|
||||
{% endblock %}
|
3
nhncloud/tests.py
Normal file
3
nhncloud/tests.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
53
nhncloud/urls.py
Normal file
53
nhncloud/urls.py
Normal file
@ -0,0 +1,53 @@
|
||||
from django.urls import path
|
||||
from . import views
|
||||
|
||||
app_name = 'nhncloud'
|
||||
|
||||
urlpatterns = [
|
||||
path('', views.apiList),
|
||||
|
||||
# TEST
|
||||
# path('test/', views.rs_test),
|
||||
path('test/<int:pk>/', views.modelIndex_single),
|
||||
path('fileUpload/', views.fileUpload, name='fileUpload'),
|
||||
# VIEW
|
||||
path('preparations/', views.preparations), # 사용전 주의 사항 매뉴얼
|
||||
# path('applyClusterLbRequest/', views.applyClusterLbRequest), # kubernetes Apply
|
||||
path('nksApply/', views.nksApply), # kubernetes Apply
|
||||
path('createVpcRequest/', views.createVpcRequest), # vpc생성 입력 페이지
|
||||
path('createClusterRequest/', views.createClusterRequest), # 클러스터 생성 입력 페이지
|
||||
path('createClusterOnlyRequest/', views.createClusterOnlyRequest), # 클러스터 생성 입력 페이지
|
||||
path('removeClusterRequest/', views.removeClusterRequest), # 클러스터 삭제 입력 페이지
|
||||
path('infoClusterDetailRequest/', views.infoClusterDetailRequest), # 클러스터 1개 상세 정보 조회 요청
|
||||
path('infoVpcListRequest/', views.infoVpcListRequest), # Vpc 전체 리스트 조회
|
||||
path('infoClusterListRequest/', views.infoClusterListRequest), # Cluster 전체리스트 조회
|
||||
path('infoObjectStorageRequest/', views.infoObjectStorageRequest), # Cluster 전체리스트 조회
|
||||
path('createObjectStorageRequest/', views.createObjectStorageRequest), # createObjectStorageRequest
|
||||
|
||||
# Apply
|
||||
path('kubectlApplyLB/', views.kubectlApplyLB, name='kubectlApplyLB'), # post 전송 페이지 kubectlApply
|
||||
# CREATE
|
||||
path('createVpc/', views.createVpc, name='createVpc'), # post 전송 페이지
|
||||
path('createCluster/', views.createCluster, name='createCluster'), # post 전송 페이지
|
||||
path('createOnlyCluster/', views.createOnlyCluster, name='createOnlyCluster'), # post 전송 페이지
|
||||
path('createObjectStorage/', views.createObjectStorage, name='createObjectStorage'), # createObjectStorage
|
||||
|
||||
# DELETE
|
||||
# path('removeVpc/', views.removeVpc, name='removeVpc'), # vpc 삭제 실행
|
||||
path('removeCluster/', views.removeCluster, name='removeCluster'), # post 전송 페이지
|
||||
path('removeVpc/', views.removeVpc, name='removeVpc'), # post 전송 페이지
|
||||
path('removeObjectStorage/', views.removeObjectStorage, name='removeObjectStorage'), # post 전송 페이지
|
||||
|
||||
# READ
|
||||
path('infoVpcList/', views.infoVpcList, name='infoVpcList'), # getClusterinfo
|
||||
path('infoClusterList/', views.infoClusterList, name='infoClusterList'), # getClusterinfo
|
||||
path('infoObjectStorageList/', views.infoObjectStorageList, name='infoObjectStorageList'), # infoObjectStorageList
|
||||
path('infoClusterDetail/', views.infoClusterDetail, name='infoClusterDetail'), # cluster 상세 상태 조회
|
||||
|
||||
|
||||
|
||||
# test
|
||||
path('pythonRun/', views.pythonRun), # Cluster 전체리스트 조회
|
||||
|
||||
#파일다운로드 테스트
|
||||
]
|
1053
nhncloud/views.py
Normal file
1053
nhncloud/views.py
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user