mirror of
https://github.com/intel/intel-device-plugins-for-kubernetes.git
synced 2025-06-03 03:59:37 +00:00
Merge pull request #300 from askervin/55B_fpga_kustomization
fpga plugin kustomization, stage 2
This commit is contained in:
commit
332fbdc35c
2
.gitignore
vendored
2
.gitignore
vendored
@ -12,6 +12,8 @@ cmd/fpga_tool/fpga_tool
|
|||||||
cmd/gpu_plugin/gpu_plugin
|
cmd/gpu_plugin/gpu_plugin
|
||||||
cmd/qat_plugin/qat_plugin
|
cmd/qat_plugin/qat_plugin
|
||||||
|
|
||||||
|
deployments/fpga_admissionwebhook/base/intel-fpga-webhook-certs-secret
|
||||||
|
|
||||||
*.h
|
*.h
|
||||||
*.gbs
|
*.gbs
|
||||||
*.gbs.*
|
*.gbs.*
|
||||||
|
@ -36,4 +36,4 @@ RUN chmod a+x /go/bin/fpga_plugin \
|
|||||||
|
|
||||||
FROM scratch as final
|
FROM scratch as final
|
||||||
COPY --from=builder /install_root /
|
COPY --from=builder /install_root /
|
||||||
CMD ["/usr/local/bin/intel_fpga_device_plugin"]
|
ENTRYPOINT ["/usr/local/bin/intel_fpga_device_plugin"]
|
||||||
|
@ -189,6 +189,31 @@ If you intend to deploy your own image, you will need to reference the
|
|||||||
If you do not want to deploy the `devel` tagged image, you will need to edit the
|
If you do not want to deploy the `devel` tagged image, you will need to edit the
|
||||||
YAML deployment files to reference your required image.
|
YAML deployment files to reference your required image.
|
||||||
|
|
||||||
|
### For beta testing: new deployment model
|
||||||
|
|
||||||
|
The FPGA plugin deployment is currently being rewritten to enable
|
||||||
|
straight-forward deployment of both `af/preprogrammed` and
|
||||||
|
`region/orchestrated` modes. The deployment has two steps:
|
||||||
|
|
||||||
|
1. Run `scripts/fpga-plugin-prepare-for-kustomization.sh`. This will
|
||||||
|
create the necessary secrets: a key and a signed certificate for
|
||||||
|
the FPGA admission controller.
|
||||||
|
|
||||||
|
2. Depending on the FPGA mode, run either
|
||||||
|
```bash
|
||||||
|
$ kubectl create -k deployments/fpga_plugin/overlays/af
|
||||||
|
```
|
||||||
|
or
|
||||||
|
```bash
|
||||||
|
$ kubectl create -k deployments/fpga_plugin/overlays/region
|
||||||
|
```
|
||||||
|
This will create the service account and deploy
|
||||||
|
both the FPGA plugin and the admission controller in the chosen mode.
|
||||||
|
|
||||||
|
This deployment model is under development. The remaining part of this
|
||||||
|
document goes through the current deployment model: here for the
|
||||||
|
FPGA plugin and in the next document for the FPGA admission controller.
|
||||||
|
|
||||||
### Create a service account
|
### Create a service account
|
||||||
|
|
||||||
To deploy the plugin in a production cluster, create a service account
|
To deploy the plugin in a production cluster, create a service account
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
apiVersion: apiextensions.k8s.io/v1beta1
|
||||||
|
kind: CustomResourceDefinition
|
||||||
|
metadata:
|
||||||
|
name: acceleratorfunctions.fpga.intel.com
|
||||||
|
spec:
|
||||||
|
group: fpga.intel.com
|
||||||
|
version: v1
|
||||||
|
scope: Namespaced
|
||||||
|
names:
|
||||||
|
plural: acceleratorfunctions
|
||||||
|
singular: acceleratorfunction
|
||||||
|
kind: AcceleratorFunction
|
||||||
|
shortNames:
|
||||||
|
- af
|
||||||
|
validation:
|
||||||
|
openAPIV3Schema:
|
||||||
|
properties:
|
||||||
|
spec:
|
||||||
|
properties:
|
||||||
|
afuId:
|
||||||
|
type: string
|
||||||
|
pattern: '^[0-9a-f]{8,128}$'
|
@ -0,0 +1,66 @@
|
|||||||
|
# DCP 1.0
|
||||||
|
apiVersion: fpga.intel.com/v1
|
||||||
|
kind: AcceleratorFunction
|
||||||
|
metadata:
|
||||||
|
name: arria10.dcp1.0-compress
|
||||||
|
spec:
|
||||||
|
afuId: 946c21d1e49704a5e5daa0805bc6b0785e1765bf
|
||||||
|
---
|
||||||
|
apiVersion: fpga.intel.com/v1
|
||||||
|
kind: AcceleratorFunction
|
||||||
|
metadata:
|
||||||
|
name: arria10.dcp1.0-nlb0
|
||||||
|
spec:
|
||||||
|
afuId: d8424dc4a4a3c413f89e433683f9040b
|
||||||
|
---
|
||||||
|
apiVersion: fpga.intel.com/v1
|
||||||
|
kind: AcceleratorFunction
|
||||||
|
metadata:
|
||||||
|
name: arria10.dcp1.0-nlb3
|
||||||
|
spec:
|
||||||
|
afuId: f7df405cbd7acf7222f144b0b93acd18
|
||||||
|
---
|
||||||
|
# DCP 1.1
|
||||||
|
apiVersion: fpga.intel.com/v1
|
||||||
|
kind: AcceleratorFunction
|
||||||
|
metadata:
|
||||||
|
name: arria10.dcp1.1-nlb0
|
||||||
|
spec:
|
||||||
|
afuId: d8424dc4a4a3c413f89e433683f9040b
|
||||||
|
---
|
||||||
|
apiVersion: fpga.intel.com/v1
|
||||||
|
kind: AcceleratorFunction
|
||||||
|
metadata:
|
||||||
|
name: arria10.dcp1.1-nlb3
|
||||||
|
spec:
|
||||||
|
afuId: f7df405cbd7acf7222f144b0b93acd18
|
||||||
|
---
|
||||||
|
# DCP 1.2
|
||||||
|
apiVersion: fpga.intel.com/v1
|
||||||
|
kind: AcceleratorFunction
|
||||||
|
metadata:
|
||||||
|
name: arria10.dcp1.2-nlb0
|
||||||
|
spec:
|
||||||
|
afuId: d8424dc4a4a3c413f89e433683f9040b
|
||||||
|
---
|
||||||
|
apiVersion: fpga.intel.com/v1
|
||||||
|
kind: AcceleratorFunction
|
||||||
|
metadata:
|
||||||
|
name: arria10.dcp1.2-nlb3
|
||||||
|
spec:
|
||||||
|
afuId: f7df405cbd7acf7222f144b0b93acd18
|
||||||
|
---
|
||||||
|
# D5005
|
||||||
|
apiVersion: fpga.intel.com/v1
|
||||||
|
kind: AcceleratorFunction
|
||||||
|
metadata:
|
||||||
|
name: d5005-nlb0
|
||||||
|
spec:
|
||||||
|
afuId: d8424dc4a4a3c413f89e433683f9040b
|
||||||
|
---
|
||||||
|
apiVersion: fpga.intel.com/v1
|
||||||
|
kind: AcceleratorFunction
|
||||||
|
metadata:
|
||||||
|
name: d5005-nlb3
|
||||||
|
spec:
|
||||||
|
afuId: f7df405cbd7acf7222f144b0b93acd18
|
@ -0,0 +1,23 @@
|
|||||||
|
apiVersion: admissionregistration.k8s.io/v1beta1
|
||||||
|
kind: MutatingWebhookConfiguration
|
||||||
|
metadata:
|
||||||
|
name: fpga-mutator-webhook-cfg
|
||||||
|
labels:
|
||||||
|
app: intel-fpga-webhook
|
||||||
|
webhooks:
|
||||||
|
- name: fpga.mutator.webhooks.intel.com
|
||||||
|
rules:
|
||||||
|
- apiGroups:
|
||||||
|
- ""
|
||||||
|
apiVersions:
|
||||||
|
- v1
|
||||||
|
operations:
|
||||||
|
- CREATE
|
||||||
|
resources:
|
||||||
|
- pods
|
||||||
|
clientConfig:
|
||||||
|
service:
|
||||||
|
path: "/pods"
|
||||||
|
namespace: default
|
||||||
|
name: intel-fpga-webhook-svc
|
||||||
|
caBundle: $(CA_BUNDLE)
|
@ -0,0 +1,21 @@
|
|||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
kind: ClusterRole
|
||||||
|
metadata:
|
||||||
|
name: fpga-reader
|
||||||
|
rules:
|
||||||
|
- apiGroups: ["fpga.intel.com"]
|
||||||
|
resources: ["acceleratorfunctions", "fpgaregions"]
|
||||||
|
verbs: ["get", "list", "watch"]
|
||||||
|
---
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
kind: ClusterRoleBinding
|
||||||
|
metadata:
|
||||||
|
name: default-fpga-reader
|
||||||
|
roleRef:
|
||||||
|
apiGroup: rbac.authorization.k8s.io
|
||||||
|
kind: ClusterRole
|
||||||
|
name: fpga-reader
|
||||||
|
subjects:
|
||||||
|
- kind: ServiceAccount
|
||||||
|
name: default
|
||||||
|
namespace: default
|
@ -0,0 +1,41 @@
|
|||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: intel-fpga-webhook-deployment
|
||||||
|
labels:
|
||||||
|
app: intel-fpga-webhook
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: intel-fpga-webhook
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: intel-fpga-webhook
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: fpga-mutator
|
||||||
|
image: intel/intel-fpga-admissionwebhook:devel
|
||||||
|
imagePullPolicy: IfNotPresent
|
||||||
|
ports:
|
||||||
|
- containerPort: 8443
|
||||||
|
name: webhook-api
|
||||||
|
securityContext:
|
||||||
|
runAsNonRoot: true
|
||||||
|
runAsUser: 3210
|
||||||
|
runAsGroup: 3210
|
||||||
|
readOnlyRootFilesystem: true
|
||||||
|
args:
|
||||||
|
- -tls-cert-file=/etc/webhook/certs/cert.pem
|
||||||
|
- -tls-private-key-file=/etc/webhook/certs/key.pem
|
||||||
|
- -mode=preprogrammed
|
||||||
|
- -debug
|
||||||
|
volumeMounts:
|
||||||
|
- name: webhook-certs
|
||||||
|
mountPath: /etc/webhook/certs
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: webhook-certs
|
||||||
|
secret:
|
||||||
|
secretName: intel-fpga-webhook-certs
|
@ -0,0 +1,12 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: intel-fpga-webhook-svc
|
||||||
|
labels:
|
||||||
|
app: intel-fpga-webhook
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- port: 443
|
||||||
|
targetPort: 8443
|
||||||
|
selector:
|
||||||
|
app: intel-fpga-webhook
|
29
deployments/fpga_admissionwebhook/base/kustomization.yaml
Normal file
29
deployments/fpga_admissionwebhook/base/kustomization.yaml
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
resources:
|
||||||
|
- fpga-reader-clusterrole.yaml
|
||||||
|
- intel-fpga-webhook-deployment.yaml
|
||||||
|
- intel-fpga-webhook-svc.yaml
|
||||||
|
- fpga-mutator-webhook-cfg.yaml
|
||||||
|
- acceleratorfunction-crd.yaml
|
||||||
|
- acceleratorfunctions.yaml
|
||||||
|
|
||||||
|
configurations:
|
||||||
|
- kustomize-varreference.yaml
|
||||||
|
|
||||||
|
generatorOptions:
|
||||||
|
disableNameSuffixHash: true
|
||||||
|
|
||||||
|
secretGenerator:
|
||||||
|
- name: intel-fpga-webhook-certs
|
||||||
|
files:
|
||||||
|
- key.pem=intel-fpga-webhook-certs-secret/key.pem
|
||||||
|
- cert.pem=intel-fpga-webhook-certs-secret/cert.pem
|
||||||
|
- client-ca-file=intel-fpga-webhook-certs-secret/client-ca-file
|
||||||
|
|
||||||
|
vars:
|
||||||
|
- name: CA_BUNDLE
|
||||||
|
objref:
|
||||||
|
kind: Secret
|
||||||
|
version: v1
|
||||||
|
name: intel-fpga-webhook-certs
|
||||||
|
fieldref:
|
||||||
|
fieldpath: data[client-ca-file]
|
@ -0,0 +1,3 @@
|
|||||||
|
varReference:
|
||||||
|
- path: webhooks/clientConfig/caBundle
|
||||||
|
kind: MutatingWebhookConfiguration
|
@ -0,0 +1,8 @@
|
|||||||
|
# make sure to change only the -mode=preprogrammed argument
|
||||||
|
- op: test
|
||||||
|
path: /spec/template/spec/containers/0/args/2
|
||||||
|
value: -mode=preprogrammed
|
||||||
|
|
||||||
|
- op: replace
|
||||||
|
path: /spec/template/spec/containers/0/args/2
|
||||||
|
value: -mode=orchestrated
|
@ -0,0 +1,22 @@
|
|||||||
|
apiVersion: apiextensions.k8s.io/v1beta1
|
||||||
|
kind: CustomResourceDefinition
|
||||||
|
metadata:
|
||||||
|
name: fpgaregions.fpga.intel.com
|
||||||
|
spec:
|
||||||
|
group: fpga.intel.com
|
||||||
|
version: v1
|
||||||
|
scope: Namespaced
|
||||||
|
names:
|
||||||
|
plural: fpgaregions
|
||||||
|
singular: fpgaregion
|
||||||
|
kind: FpgaRegion
|
||||||
|
shortNames:
|
||||||
|
- fpga
|
||||||
|
validation:
|
||||||
|
openAPIV3Schema:
|
||||||
|
properties:
|
||||||
|
spec:
|
||||||
|
properties:
|
||||||
|
interfaceId:
|
||||||
|
type: string
|
||||||
|
pattern: '^[0-9a-f]{8,128}$'
|
@ -0,0 +1,31 @@
|
|||||||
|
# DCP 1.0
|
||||||
|
apiVersion: fpga.intel.com/v1
|
||||||
|
kind: FpgaRegion
|
||||||
|
metadata:
|
||||||
|
name: arria10.dcp1.0
|
||||||
|
spec:
|
||||||
|
interfaceId: ce48969398f05f33946d560708be108a
|
||||||
|
---
|
||||||
|
# DCP 1.1
|
||||||
|
apiVersion: fpga.intel.com/v1
|
||||||
|
kind: FpgaRegion
|
||||||
|
metadata:
|
||||||
|
name: arria10.dcp1.1
|
||||||
|
spec:
|
||||||
|
interfaceId: 9926ab6d6c925a68aabca7d84c545738
|
||||||
|
---
|
||||||
|
# DCP 1.2
|
||||||
|
apiVersion: fpga.intel.com/v1
|
||||||
|
kind: FpgaRegion
|
||||||
|
metadata:
|
||||||
|
name: arria10.dcp1.2
|
||||||
|
spec:
|
||||||
|
interfaceId: 69528db6eb31577a8c3668f9faa081f6
|
||||||
|
---
|
||||||
|
# D5005
|
||||||
|
apiVersion: fpga.intel.com/v1
|
||||||
|
kind: FpgaRegion
|
||||||
|
metadata:
|
||||||
|
name: d5005
|
||||||
|
spec:
|
||||||
|
interfaceId: bfac4d851ee856fe8c95865ce1bbaa2d
|
@ -0,0 +1,15 @@
|
|||||||
|
bases:
|
||||||
|
- ../../base
|
||||||
|
|
||||||
|
resources:
|
||||||
|
- fpgaregion-crd.yaml
|
||||||
|
- fpgaregions.yaml
|
||||||
|
|
||||||
|
patchesJson6902:
|
||||||
|
- target:
|
||||||
|
group: apps
|
||||||
|
version: v1
|
||||||
|
kind: Deployment
|
||||||
|
name: intel-fpga-webhook-deployment
|
||||||
|
path:
|
||||||
|
change-mode-orchestrated.yaml
|
@ -0,0 +1,2 @@
|
|||||||
|
bases:
|
||||||
|
- ../../base
|
@ -0,0 +1,28 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: intel-fpga-plugin-controller
|
||||||
|
namespace: kube-system
|
||||||
|
---
|
||||||
|
kind: ClusterRole
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
metadata:
|
||||||
|
name: node-getter
|
||||||
|
rules:
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["nodes"]
|
||||||
|
verbs: ["get"]
|
||||||
|
---
|
||||||
|
kind: ClusterRoleBinding
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
metadata:
|
||||||
|
name: get-nodes
|
||||||
|
namespace: kube-system
|
||||||
|
subjects:
|
||||||
|
- kind: ServiceAccount
|
||||||
|
name: intel-fpga-plugin-controller
|
||||||
|
namespace: kube-system
|
||||||
|
roleRef:
|
||||||
|
kind: ClusterRole
|
||||||
|
name: node-getter
|
||||||
|
apiGroup: rbac.authorization.k8s.io
|
@ -0,0 +1,69 @@
|
|||||||
|
apiVersion: apps/v1
|
||||||
|
kind: DaemonSet
|
||||||
|
metadata:
|
||||||
|
name: intel-fpga-plugin
|
||||||
|
namespace: kube-system
|
||||||
|
labels:
|
||||||
|
app: intel-fpga-plugin
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: intel-fpga-plugin
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: intel-fpga-plugin
|
||||||
|
spec:
|
||||||
|
serviceAccountName: intel-fpga-plugin-controller
|
||||||
|
initContainers:
|
||||||
|
- name: intel-fpga-initcontainer
|
||||||
|
image: intel/intel-fpga-initcontainer:devel
|
||||||
|
imagePullPolicy: IfNotPresent
|
||||||
|
securityContext:
|
||||||
|
readOnlyRootFilesystem: true
|
||||||
|
volumeMounts:
|
||||||
|
- mountPath: /opt/intel/fpga-sw
|
||||||
|
name: intel-fpga-sw
|
||||||
|
- mountPath: /etc/containers/oci/hooks.d
|
||||||
|
name: oci-hooks-config
|
||||||
|
containers:
|
||||||
|
- name: intel-fpga-plugin
|
||||||
|
env:
|
||||||
|
- name: NODE_NAME
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: spec.nodeName
|
||||||
|
image: intel/intel-fpga-plugin:devel
|
||||||
|
imagePullPolicy: IfNotPresent
|
||||||
|
args:
|
||||||
|
- -mode=af
|
||||||
|
terminationMessagePath: /tmp/termination-log
|
||||||
|
securityContext:
|
||||||
|
readOnlyRootFilesystem: true
|
||||||
|
volumeMounts:
|
||||||
|
- name: devfs
|
||||||
|
mountPath: /dev
|
||||||
|
readOnly: true
|
||||||
|
- name: sysfs
|
||||||
|
mountPath: /sys/class
|
||||||
|
readOnly: true
|
||||||
|
- name: kubeletsockets
|
||||||
|
mountPath: /var/lib/kubelet/device-plugins
|
||||||
|
volumes:
|
||||||
|
- name: devfs
|
||||||
|
hostPath:
|
||||||
|
path: /dev
|
||||||
|
- name: sysfs
|
||||||
|
hostPath:
|
||||||
|
path: /sys/class
|
||||||
|
- name: kubeletsockets
|
||||||
|
hostPath:
|
||||||
|
path: /var/lib/kubelet/device-plugins
|
||||||
|
- name: intel-fpga-sw
|
||||||
|
hostPath:
|
||||||
|
path: /opt/intel/fpga-sw
|
||||||
|
type: DirectoryOrCreate
|
||||||
|
- name: oci-hooks-config
|
||||||
|
hostPath:
|
||||||
|
path: /etc/containers/oci/hooks.d
|
||||||
|
type: DirectoryOrCreate
|
3
deployments/fpga_plugin/base/kustomization.yaml
Normal file
3
deployments/fpga_plugin/base/kustomization.yaml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
resources:
|
||||||
|
- intel-fpga-plugin-controller-serviceaccount.yaml
|
||||||
|
- intel-fpga-plugin-daemonset.yaml
|
3
deployments/fpga_plugin/overlays/af/kustomization.yaml
Normal file
3
deployments/fpga_plugin/overlays/af/kustomization.yaml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
bases:
|
||||||
|
- ../../base
|
||||||
|
- ../../../fpga_admissionwebhook/overlays/preprogrammed
|
@ -0,0 +1,8 @@
|
|||||||
|
# make sure to change only the -mode=af argument
|
||||||
|
- op: test
|
||||||
|
path: /spec/template/spec/containers/0/args/0
|
||||||
|
value: -mode=af
|
||||||
|
|
||||||
|
- op: replace
|
||||||
|
path: /spec/template/spec/containers/0/args/0
|
||||||
|
value: -mode=region
|
12
deployments/fpga_plugin/overlays/region/kustomization.yaml
Normal file
12
deployments/fpga_plugin/overlays/region/kustomization.yaml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
bases:
|
||||||
|
- ../../base
|
||||||
|
- ../../../fpga_admissionwebhook/overlays/orchestrated
|
||||||
|
|
||||||
|
patchesJson6902:
|
||||||
|
- target:
|
||||||
|
group: apps
|
||||||
|
version: v1
|
||||||
|
kind: DaemonSet
|
||||||
|
name: intel-fpga-plugin
|
||||||
|
path:
|
||||||
|
change-mode-region.yaml
|
26
scripts/fpga-plugin-prepare-for-kustomization.sh
Executable file
26
scripts/fpga-plugin-prepare-for-kustomization.sh
Executable file
@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# This script prepares fpga_plugin ready for full deployment by
|
||||||
|
#
|
||||||
|
# kubectl apply -k deployments/fpga_plugin/overlays/af
|
||||||
|
#
|
||||||
|
# or
|
||||||
|
#
|
||||||
|
# kubectl apply -k deployments/fpga_plugin/overlays/region
|
||||||
|
|
||||||
|
service="intel-fpga-webhook-svc"
|
||||||
|
secret="intel-fpga-webhook-certs"
|
||||||
|
|
||||||
|
script_dir="$(realpath $(dirname $0))"
|
||||||
|
srcroot="$(realpath ${script_dir}/..)"
|
||||||
|
|
||||||
|
kustomize_secret_dir="${srcroot}/deployments/fpga_admissionwebhook/base/${secret}-secret"
|
||||||
|
|
||||||
|
mkdir -p "${kustomize_secret_dir}"
|
||||||
|
|
||||||
|
# Create signed cert files to kustomize_secret_dir
|
||||||
|
${script_dir}/webhook-create-signed-cert.sh --output-dir ${kustomize_secret_dir} --service=$service && {
|
||||||
|
echo ""
|
||||||
|
echo created for kustomization:
|
||||||
|
echo - "${kustomize_secret_dir}"
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user