diff --git a/stable/kommander/Chart.yaml b/stable/kommander/Chart.yaml index 6ec6f1034..012916020 100644 --- a/stable/kommander/Chart.yaml +++ b/stable/kommander/Chart.yaml @@ -3,7 +3,7 @@ name: kommander home: https://github.com/mesosphere/kommander appVersion: "1.149.0" description: Kommander -version: 0.2.0 +version: 0.2.1 maintainers: - name: hectorj2f - name: alejandroEsc diff --git a/stable/kommander/templates/federated-addons.yaml b/stable/kommander/files/federated-addons.yaml similarity index 86% rename from stable/kommander/templates/federated-addons.yaml rename to stable/kommander/files/federated-addons.yaml index f2a78004a..0a3ea311a 100644 --- a/stable/kommander/templates/federated-addons.yaml +++ b/stable/kommander/files/federated-addons.yaml @@ -1,27 +1,3 @@ -{{- if and .Values.federate.addons .Values.kubefed.enabled }} ---- -apiVersion: core.kubefed.io/v1beta1 -kind: FederatedTypeConfig -metadata: - finalizers: - - core.kubefed.io/federated-type-config - generation: 1 - name: addons.kubeaddons.mesosphere.io - namespace: {{ .Release.Namespace }} -spec: - federatedType: - group: types.kubefed.io - kind: FederatedAddon - pluralName: federatedaddons - scope: Namespaced - version: v1beta1 - propagation: Enabled - targetType: - group: kubeaddons.mesosphere.io - kind: Addon - pluralName: addons - scope: Namespaced - version: v1beta1 --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition @@ -158,5 +134,4 @@ spec: versions: - name: v1beta1 served: true - storage: true -{{ end }} \ No newline at end of file + storage: true \ No newline at end of file diff --git a/stable/kommander/templates/federated-cluster-rolebindings.yaml b/stable/kommander/files/federated-cluster-rolebindings.yaml similarity index 84% rename from stable/kommander/templates/federated-cluster-rolebindings.yaml rename to stable/kommander/files/federated-cluster-rolebindings.yaml index 84ba5561e..1f615321c 100644 --- a/stable/kommander/templates/federated-cluster-rolebindings.yaml +++ b/stable/kommander/files/federated-cluster-rolebindings.yaml @@ -1,27 +1,3 @@ -{{- if and .Values.federate.clusterrolebindings .Values.kubefed.enabled }} ---- -apiVersion: core.kubefed.io/v1beta1 -kind: FederatedTypeConfig -metadata: - finalizers: - - core.kubefed.io/federated-type-config - generation: 1 - name: clusterrolebindings.rbac.authorization.k8s.io - namespace: {{ .Release.Namespace }} -spec: - federatedType: - group: types.kubefed.io - kind: FederatedClusterRoleBinding - pluralName: federatedclusterrolebindings - scope: Cluster - version: v1beta1 - propagation: Enabled - targetType: - group: rbac.authorization.k8s.io - kind: ClusterRoleBinding - pluralName: clusterrolebindings - scope: Cluster - version: v1 --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition @@ -158,5 +134,4 @@ spec: versions: - name: v1beta1 served: true - storage: true -{{ end }} + storage: true \ No newline at end of file diff --git a/stable/kommander/templates/federated-clusteraddons.yaml b/stable/kommander/files/federated-clusteraddons.yaml similarity index 85% rename from stable/kommander/templates/federated-clusteraddons.yaml rename to stable/kommander/files/federated-clusteraddons.yaml index 1fadb3d86..dbc94e87e 100644 --- a/stable/kommander/templates/federated-clusteraddons.yaml +++ b/stable/kommander/files/federated-clusteraddons.yaml @@ -1,27 +1,3 @@ -{{- if and .Values.federate.clusteraddons .Values.kubefed.enabled }} ---- -apiVersion: core.kubefed.io/v1beta1 -kind: FederatedTypeConfig -metadata: - finalizers: - - core.kubefed.io/federated-type-config - generation: 1 - name: clusteraddons.kubeaddons.mesosphere.io - namespace: {{ .Release.Namespace }} -spec: - federatedType: - group: types.kubefed.io - kind: FederatedClusterAddon - pluralName: federatedclusteraddons - scope: Cluster - version: v1beta1 - propagation: Enabled - targetType: - group: kubeaddons.mesosphere.io - kind: ClusterAddon - pluralName: clusteraddons - scope: Cluster - version: v1beta1 --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition @@ -158,5 +134,4 @@ spec: versions: - name: v1beta1 served: true - storage: true -{{ end }} \ No newline at end of file + storage: true \ No newline at end of file diff --git a/stable/kommander/templates/federated-customresourcedefinition.yaml b/stable/kommander/files/federated-customresourcedefinition.yaml similarity index 84% rename from stable/kommander/templates/federated-customresourcedefinition.yaml rename to stable/kommander/files/federated-customresourcedefinition.yaml index 18004efa4..79ce80c0a 100644 --- a/stable/kommander/templates/federated-customresourcedefinition.yaml +++ b/stable/kommander/files/federated-customresourcedefinition.yaml @@ -1,27 +1,3 @@ -{{- if and .Values.federate.customresourcedefinitions .Values.kubefed.enabled }} ---- -apiVersion: core.kubefed.io/v1beta1 -kind: FederatedTypeConfig -metadata: - finalizers: - - core.kubefed.io/federated-type-config - generation: 1 - name: customresourcedefinitions.apiextensions.k8s.io - namespace: {{ .Release.Namespace }} -spec: - federatedType: - group: types.kubefed.io - kind: FederatedCustomResourceDefinition - pluralName: federatedcustomresourcedefinitions - scope: Cluster - version: v1beta1 - propagation: Enabled - targetType: - group: apiextensions.k8s.io - kind: CustomResourceDefinition - pluralName: customresourcedefinitions - scope: Cluster - version: v1beta1 --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition @@ -161,5 +137,4 @@ spec: versions: - name: v1beta1 served: true - storage: true -{{- end }} \ No newline at end of file + storage: true \ No newline at end of file diff --git a/stable/kommander/templates/federated-rolebindings.yaml b/stable/kommander/files/federated-rolebindings.yaml similarity index 85% rename from stable/kommander/templates/federated-rolebindings.yaml rename to stable/kommander/files/federated-rolebindings.yaml index d74eeccdb..eab39a47e 100644 --- a/stable/kommander/templates/federated-rolebindings.yaml +++ b/stable/kommander/files/federated-rolebindings.yaml @@ -1,27 +1,3 @@ -{{- if and .Values.federate.rolebindings .Values.kubefed.enabled }} ---- -apiVersion: core.kubefed.io/v1beta1 -kind: FederatedTypeConfig -metadata: - finalizers: - - core.kubefed.io/federated-type-config - generation: 1 - name: rolebindings.rbac.authorization.k8s.io - namespace: {{ .Release.Namespace }} -spec: - federatedType: - group: types.kubefed.io - kind: FederatedRoleBinding - pluralName: federatedrolebindings - scope: Namespaced - version: v1beta1 - propagation: Enabled - targetType: - group: rbac.authorization.k8s.io - kind: RoleBinding - pluralName: rolebindings - scope: Namespaced - version: v1 --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition @@ -158,5 +134,4 @@ spec: versions: - name: v1beta1 served: true - storage: true -{{ end }} \ No newline at end of file + storage: true \ No newline at end of file diff --git a/stable/kommander/templates/federated-roles.yaml b/stable/kommander/files/federated-roles.yaml similarity index 86% rename from stable/kommander/templates/federated-roles.yaml rename to stable/kommander/files/federated-roles.yaml index 021fad827..9dd87f3bb 100644 --- a/stable/kommander/templates/federated-roles.yaml +++ b/stable/kommander/files/federated-roles.yaml @@ -1,27 +1,3 @@ -{{- if and .Values.federate.roles .Values.kubefed.enabled }} ---- -apiVersion: core.kubefed.io/v1beta1 -kind: FederatedTypeConfig -metadata: - finalizers: - - core.kubefed.io/federated-type-config - generation: 1 - name: roles.rbac.authorization.k8s.io - namespace: {{ .Release.Namespace }} -spec: - federatedType: - group: types.kubefed.io - kind: FederatedRole - pluralName: federatedroles - scope: Namespaced - version: v1beta1 - propagation: Enabled - targetType: - group: rbac.authorization.k8s.io - kind: Role - pluralName: roles - scope: Namespaced - version: v1 --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition @@ -158,5 +134,4 @@ spec: versions: - name: v1beta1 served: true - storage: true -{{ end }} \ No newline at end of file + storage: true \ No newline at end of file diff --git a/stable/kommander/templates/crd.yaml b/stable/kommander/files/observableclusters-crd.yaml similarity index 80% rename from stable/kommander/templates/crd.yaml rename to stable/kommander/files/observableclusters-crd.yaml index 25dd98058..b1dabd599 100644 --- a/stable/kommander/templates/crd.yaml +++ b/stable/kommander/files/observableclusters-crd.yaml @@ -1,15 +1,8 @@ -{{- if .Values.createObservableClusterCRD }} -{{- if not (.Capabilities.APIVersions.Has "stable.mesosphere.com/v1") }} --- apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: observableclusters.stable.mesosphere.com - labels: - app: {{ template "kommander.fullname" . }} - chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - release: "{{ .Release.name }}" - heritage: "{{ .Release.Service }}" annotations: "helm.sh/hook": crd-install spec: @@ -62,6 +55,4 @@ spec: JSONPath: .spec.authenticationSecretName - name: Age type: date - JSONPath: .metadata.creationTimestamp -{{- end }} -{{- end }} \ No newline at end of file + JSONPath: .metadata.creationTimestamp \ No newline at end of file diff --git a/stable/kommander/templates/federated-crds.yaml b/stable/kommander/templates/federated-crds.yaml new file mode 100644 index 000000000..461a65eda --- /dev/null +++ b/stable/kommander/templates/federated-crds.yaml @@ -0,0 +1,128 @@ +{{- if .Values.kubefed.enabled }} +{{- if not (.Capabilities.APIVersions.Has "types.kubefed.io/v1beta1") }} +{{- if .Values.federate.addons }} +{{.Files.Get "files/federated-addons.yaml" }} +{{- end }} +{{- if .Values.federate.clusterrolebindings }} +{{.Files.Get "files/federated-cluster-rolebindings.yaml" }} +{{- end }} +{{- if .Values.federate.clusteraddons }} +{{.Files.Get "files/federated-clusteraddons.yaml" }} +{{- end }} +{{- if .Values.federate.customresourcedefinitions }} +{{.Files.Get "files/federated-customresourcedefinition.yaml" }} +{{- end }} +{{- if .Values.federate.rolebindings }} +{{.Files.Get "files/federated-rolebindings.yaml" }} +{{- end }} +{{- if .Values.federate.roles }} +{{.Files.Get "files/federated-roles.yaml" }} +{{- end }} +{{- end }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: federated-crds + namespace: {{ .Release.Namespace }} + annotations: + "helm.sh/hook": pre-install, pre-upgrade + "helm.sh/hook-weight": "-5" + "helm.sh/hook-delete-policy": hook-succeeded + labels: +{{ include "kommander.labels" . | indent 4 }} +data: +{{- if .Values.federate.addons }} + federated-addons.yaml: | +{{.Files.Get "files/federated-addons.yaml" | indent 6}} +{{- end }} +{{- if .Values.federate.clusterrolebindings }} + federated-cluster-rolebindings.yaml: | +{{.Files.Get "files/federated-cluster-rolebindings.yaml" | indent 6}} +{{- end }} +{{- if .Values.federate.clusteraddons }} + federated-clusteraddons.yaml: | +{{.Files.Get "files/federated-clusteraddons.yaml" | indent 6}} +{{- end }} +{{- if .Values.federate.customresourcedefinitions }} + federated-customresourcedefinition.yaml: | +{{.Files.Get "files/federated-customresourcedefinition.yaml" | indent 6}} +{{- end }} +{{- if .Values.federate.rolebindings }} + federated-rolebindings.yaml: | +{{.Files.Get "files/federated-rolebindings.yaml" | indent 6}} +{{- end }} +{{- if .Values.federate.roles }} + federated-roles.yaml: | +{{.Files.Get "files/federated-roles.yaml" | indent 6}} +{{- end }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: kommander-crds + namespace: {{ .Release.Namespace }} + annotations: + "helm.sh/hook": pre-install, pre-upgrade + "helm.sh/hook-weight": "-5" + "helm.sh/hook-delete-policy": hook-succeeded +rules: + - apiGroups: ["apiextensions.k8s.io"] + resources: ["customresourcedefinitions"] + verbs: ["create", "get", "list", "watch", "patch"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: kommander-crds + namespace: {{ .Release.Namespace }} + annotations: + "helm.sh/hook": pre-install, pre-upgrade + "helm.sh/hook-weight": "-5" + "helm.sh/hook-delete-policy": hook-succeeded +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: kommander-crds +subjects: + - kind: ServiceAccount + name: kommander-crds + namespace: {{ .Release.Namespace }} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: kommander-crds + namespace: {{ .Release.Namespace }} + annotations: + "helm.sh/hook": pre-install, pre-upgrade + "helm.sh/hook-weight": "-5" + "helm.sh/hook-delete-policy": hook-succeeded +--- +apiVersion: batch/v1 +kind: Job +metadata: + namespace: {{ .Release.Namespace }} + name: federated-crds + annotations: + "helm.sh/hook": pre-install, pre-upgrade + "helm.sh/hook-weight": "-4" + "helm.sh/hook-delete-policy": hook-succeeded +spec: + template: + spec: + serviceAccountName: kommander-crds + containers: + - name: federated-crds + image: "bitnami/kubectl:1.16.2" + volumeMounts: + - name: federated-crds + mountPath: /etc/federated-crds + readOnly: true + command: ["kubectl", "apply", "-f", "/etc/federated-crds"] + volumes: + - name: federated-crds + configMap: + name: federated-crds + restartPolicy: OnFailure +{{- end }} \ No newline at end of file diff --git a/stable/kommander/templates/federated-kubeaddons.yaml b/stable/kommander/templates/federated-kubeaddons.yaml index 7f44b3936..7959f50a6 100644 --- a/stable/kommander/templates/federated-kubeaddons.yaml +++ b/stable/kommander/templates/federated-kubeaddons.yaml @@ -5,6 +5,8 @@ kind: FederatedNamespace metadata: name: kubeaddons namespace: kubeaddons + labels: +{{ include "kommander.labels" . | indent 4 }} spec: placement: clusterSelector: @@ -16,6 +18,8 @@ apiVersion: types.kubefed.io/v1beta1 kind: FederatedCustomResourceDefinition metadata: name: addons.kubeaddons.mesosphere.io + labels: +{{ include "kommander.labels" . | indent 4 }} spec: placement: clusterSelector: @@ -214,6 +218,8 @@ apiVersion: types.kubefed.io/v1beta1 kind: FederatedCustomResourceDefinition metadata: name: clusteraddons.kubeaddons.mesosphere.io + labels: +{{ include "kommander.labels" . | indent 4 }} spec: placement: clusterSelector: @@ -418,6 +424,8 @@ kind: FederatedServiceAccount metadata: name: kubeaddons-controller-manager namespace: kubeaddons + labels: +{{ include "kommander.labels" . | indent 4 }} spec: placement: clusterSelector: @@ -428,6 +436,8 @@ apiVersion: types.kubefed.io/v1beta1 kind: FederatedClusterRoleBinding metadata: name: kubeaddons-controller-manager-cluster-admin-binding + labels: +{{ include "kommander.labels" . | indent 4 }} spec: placement: clusterSelector: @@ -447,6 +457,8 @@ kind: FederatedDeployment metadata: name: kubeaddons-controller-manager namespace: kubeaddons + labels: +{{ include "kommander.labels" . | indent 4 }} spec: placement: clusterSelector: diff --git a/stable/kommander/templates/federated-typeconfigs.yaml b/stable/kommander/templates/federated-typeconfigs.yaml new file mode 100644 index 000000000..8bc0a1704 --- /dev/null +++ b/stable/kommander/templates/federated-typeconfigs.yaml @@ -0,0 +1,162 @@ +--- +{{- if and .Values.federate.addons .Values.kubefed.enabled }} +apiVersion: core.kubefed.io/v1beta1 +kind: FederatedTypeConfig +metadata: + finalizers: + - core.kubefed.io/federated-type-config + generation: 1 + name: addons.kubeaddons.mesosphere.io + namespace: {{ .Release.Namespace }} + labels: +{{ include "kommander.labels" . | indent 4 }} +spec: + federatedType: + group: types.kubefed.io + kind: FederatedAddon + pluralName: federatedaddons + scope: Namespaced + version: v1beta1 + propagation: Enabled + targetType: + group: kubeaddons.mesosphere.io + kind: Addon + pluralName: addons + scope: Namespaced + version: v1beta1 +{{- end }} +--- +{{- if and .Values.federate.clusterrolebindings .Values.kubefed.enabled }} +apiVersion: core.kubefed.io/v1beta1 +kind: FederatedTypeConfig +metadata: + finalizers: + - core.kubefed.io/federated-type-config + generation: 1 + name: clusterrolebindings.rbac.authorization.k8s.io + namespace: {{ .Release.Namespace }} + labels: +{{ include "kommander.labels" . | indent 4 }} +spec: + federatedType: + group: types.kubefed.io + kind: FederatedClusterRoleBinding + pluralName: federatedclusterrolebindings + scope: Cluster + version: v1beta1 + propagation: Enabled + targetType: + group: rbac.authorization.k8s.io + kind: ClusterRoleBinding + pluralName: clusterrolebindings + scope: Cluster + version: v1 +{{- end }} +--- +{{- if and .Values.federate.clusteraddons .Values.kubefed.enabled }} +apiVersion: core.kubefed.io/v1beta1 +kind: FederatedTypeConfig +metadata: + finalizers: + - core.kubefed.io/federated-type-config + generation: 1 + name: clusteraddons.kubeaddons.mesosphere.io + namespace: {{ .Release.Namespace }} + labels: +{{ include "kommander.labels" . | indent 4 }} +spec: + federatedType: + group: types.kubefed.io + kind: FederatedClusterAddon + pluralName: federatedclusteraddons + scope: Cluster + version: v1beta1 + propagation: Enabled + targetType: + group: kubeaddons.mesosphere.io + kind: ClusterAddon + pluralName: clusteraddons + scope: Cluster + version: v1beta1 +{{- end }} +--- +{{- if and .Values.federate.customresourcedefinitions .Values.kubefed.enabled }} +apiVersion: core.kubefed.io/v1beta1 +kind: FederatedTypeConfig +metadata: + finalizers: + - core.kubefed.io/federated-type-config + generation: 1 + name: customresourcedefinitions.apiextensions.k8s.io + namespace: {{ .Release.Namespace }} + labels: +{{ include "kommander.labels" . | indent 4 }} +spec: + federatedType: + group: types.kubefed.io + kind: FederatedCustomResourceDefinition + pluralName: federatedcustomresourcedefinitions + scope: Cluster + version: v1beta1 + propagation: Enabled + targetType: + group: apiextensions.k8s.io + kind: CustomResourceDefinition + pluralName: customresourcedefinitions + scope: Cluster + version: v1beta1 +{{- end }} +--- +{{- if and .Values.federate.rolebindings .Values.kubefed.enabled }} +apiVersion: core.kubefed.io/v1beta1 +kind: FederatedTypeConfig +metadata: + finalizers: + - core.kubefed.io/federated-type-config + generation: 1 + name: rolebindings.rbac.authorization.k8s.io + namespace: {{ .Release.Namespace }} + labels: +{{ include "kommander.labels" . | indent 4 }} +spec: + federatedType: + group: types.kubefed.io + kind: FederatedRoleBinding + pluralName: federatedrolebindings + scope: Namespaced + version: v1beta1 + propagation: Enabled + targetType: + group: rbac.authorization.k8s.io + kind: RoleBinding + pluralName: rolebindings + scope: Namespaced + version: v1 +{{- end }} +--- +{{- if and .Values.federate.roles .Values.kubefed.enabled }} +apiVersion: core.kubefed.io/v1beta1 +kind: FederatedTypeConfig +metadata: + finalizers: + - core.kubefed.io/federated-type-config + generation: 1 + name: roles.rbac.authorization.k8s.io + namespace: {{ .Release.Namespace }} + labels: +{{ include "kommander.labels" . | indent 4 }} +spec: + federatedType: + group: types.kubefed.io + kind: FederatedRole + pluralName: federatedroles + scope: Namespaced + version: v1beta1 + propagation: Enabled + targetType: + group: rbac.authorization.k8s.io + kind: Role + pluralName: roles + scope: Namespaced + version: v1 +{{- end }} \ No newline at end of file diff --git a/stable/kommander/templates/observable-crd.yaml b/stable/kommander/templates/observable-crd.yaml new file mode 100644 index 000000000..f6e08f435 --- /dev/null +++ b/stable/kommander/templates/observable-crd.yaml @@ -0,0 +1,89 @@ +{{- if .Values.createObservableClusterCRD }} +{{- if not (.Capabilities.APIVersions.Has "stable.mesosphere.com/v1") }} +{{.Files.Get "files/observableclusters-crd.yaml" }} +{{- end }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: observable-crds + namespace: {{ .Release.Namespace }} + annotations: + "helm.sh/hook": pre-install, pre-upgrade + "helm.sh/hook-weight": "-5" + "helm.sh/hook-delete-policy": hook-succeeded + labels: +{{ include "kommander.labels" . | indent 4 }} +data: + observableclusters-crd.yaml: | +{{.Files.Get "files/observableclusters-crd.yaml" | indent 6}} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: observable-crds + namespace: {{ .Release.Namespace }} + annotations: + "helm.sh/hook": pre-install, pre-upgrade + "helm.sh/hook-weight": "-5" + "helm.sh/hook-delete-policy": hook-succeeded +rules: + - apiGroups: ["apiextensions.k8s.io"] + resources: ["customresourcedefinitions"] + verbs: ["create", "get", "list", "watch", "patch"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: observable-crds + namespace: {{ .Release.Namespace }} + annotations: + "helm.sh/hook": pre-install, pre-upgrade + "helm.sh/hook-weight": "-5" + "helm.sh/hook-delete-policy": hook-succeeded +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: observable-crds +subjects: + - kind: ServiceAccount + name: observable-crds + namespace: {{ .Release.Namespace }} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: observable-crds + namespace: {{ .Release.Namespace }} + annotations: + "helm.sh/hook": pre-install, pre-upgrade + "helm.sh/hook-weight": "-5" + "helm.sh/hook-delete-policy": hook-succeeded +--- +apiVersion: batch/v1 +kind: Job +metadata: + namespace: {{ .Release.Namespace }} + name: observable-crds + annotations: + "helm.sh/hook": pre-install, pre-upgrade + "helm.sh/hook-weight": "-4" + "helm.sh/hook-delete-policy": hook-succeeded +spec: + template: + spec: + serviceAccountName: observable-crds + containers: + - name: observable-crds + image: "bitnami/kubectl:1.16.2" + volumeMounts: + - name: observable-crds + mountPath: /etc/observable-crds + readOnly: true + command: ["kubectl", "apply", "-f", "/etc/c-crds"] + volumes: + - name: observable-crds + configMap: + name: observable-crds + restartPolicy: OnFailure +{{- end }} \ No newline at end of file