├── .gitignore ├── README.md ├── demo ├── 01_iaac_ansible_day0-1.sh ├── 02_install_trident.sh ├── 03_create_k8s_backends.sh ├── 04_create_k8s_storageclasses.sh ├── 05_create_pvc.sh ├── 06_create_pods.sh ├── 07_scale_pods_manually.sh ├── 08_sidecar_pod.sh ├── 09_pod_pvc_rwo.sh ├── 10_create_frontend_service.sh ├── 11_create_backend_service.sh ├── 12_import_web_service.sh ├── 13_restore_web_service.sh ├── 14_datalake_clone.sh ├── 15_data_analytics_services.sh ├── 16_clone_web.sh ├── 17_create_staging_web_service.sh ├── 18_coding_new_website.sh ├── 19_iaac_ansible_day2.sh ├── 20_get_protection_volumes.sh ├── ansible_files │ ├── day0-1.yaml │ └── day2.yaml ├── k8s_backup │ ├── export.sh │ └── import.sh └── k8s_files │ ├── backend-nas.json │ ├── backend-san.json │ ├── clone-datalake-bryan.yaml │ ├── clone-datalake-harry.yaml │ ├── clone-datalake-john.yaml │ ├── datalake.yaml │ ├── frontend.yaml │ ├── mongodb-sts.yaml │ ├── pod-pvc-rwo.yaml │ ├── pods-bryan.yaml │ ├── pods-harry.yaml │ ├── pods-john.yaml │ ├── pv-alpine-nas-clone.yaml │ ├── pv-alpine-nas1.yaml │ ├── pv-alpine-nas2.yaml │ ├── pv-alpine-nas3.yaml │ ├── pv-alpine-san1.yaml │ ├── pv-alpine-san2.yaml │ ├── pv-alpine-san3.yaml │ ├── pvcfornas-clone.yaml │ ├── pvcfornas.yaml │ ├── pvcforsan.yaml │ ├── sc-nas-gold.yaml │ ├── sc-nas-silver.yaml │ ├── sc-san.yaml │ ├── sidecar-pod.yaml │ ├── snap-datalake.yaml │ ├── snap-sc.yaml │ ├── web-content-clone.yaml │ ├── web-content-prod.yaml │ ├── web-dev.yaml │ └── web-prod.yaml └── making ├── 01_prepare_k8s_servers.sh ├── 02_init_k8s_master.sh ├── 03_join_k8s_workers.sh ├── 04_configure_k8s_cluster.sh ├── ansible_files ├── datalake.yaml └── legacy-website.yaml ├── configure_demo.sh ├── k8s_files ├── metailb-configmap-k8s-dev.yaml └── metailb-configmap-k8s-prod.yaml ├── monitoring ├── grafana │ ├── cm-grafana-datasources.yaml │ ├── dashboards │ │ ├── .DS_Store │ │ ├── cluster-total.json │ │ ├── controller-manager.json │ │ ├── k8s-resources-cluster.json │ │ ├── k8s-resources-namespace.json │ │ ├── k8s-resources-node.json │ │ ├── k8s-resources-pod.json │ │ ├── k8s-resources-workload.json │ │ ├── k8s-resources-workloads-namespace.json │ │ ├── namespace-by-pod.json │ │ ├── namespace-by-workload.json │ │ ├── node-cluster-rsrc-use.json │ │ ├── node-rsrc-use.json │ │ ├── nodes.json │ │ ├── persistentvolumesusage.json │ │ ├── pod-total.json │ │ ├── pods.json │ │ ├── prometheus.json │ │ ├── proxy.json │ │ ├── scheduler.json │ │ ├── statefulset.json │ │ ├── trident.json │ │ └── workload-total.json │ ├── deployment-prom-operator-grafana.yaml │ └── service-prom-operator-grafana.yaml └── prometheus │ ├── prometheus-datasource.yaml │ ├── service-prom-operator-prometheus.yaml │ └── servicemonitor.yaml └── netapp_website ├── v1 ├── .DS_Store ├── Network Appliance - The Multiprotocol File Server (Unix, Windows, HTTP)_files │ ├── Q2ndmp.gif │ ├── ait-client-rewrite.js │ ├── analytics.js │ ├── auto-complete.js │ ├── banner-styles.css │ ├── bluebar2.gif │ ├── buttons2.gif │ ├── graph-calc.js │ ├── iconochive.css │ ├── info2.gif │ ├── mainbanner.jpg │ ├── timestamp.js │ ├── toolbar.js │ └── wbhack.js ├── demo.pdf └── index.htm └── v2 ├── .DS_Store ├── NetApp_ Data Services for Hybrid Cloud_files ├── 26609-disaster-recovery.jpg ├── 26609-rules-of-application-performance.jpg ├── 26609-speed-and-agility.jpg ├── 4sNyFtNi.min.js ├── 6FSMF-C9TB6-XLEBP-V5VVN-JCRY5 ├── DXD192-OG-ExploreNetApp-465x294.png ├── DXD192-OG-ExploreNetApp-600x400.jpg ├── June18-announcement.jpg ├── T27417-2.jpg ├── T27417-google-partner.jpg ├── T27559.jpg ├── T27802-video-poster-wsj.jpg ├── aff-series-card.png ├── ai.0.js ├── ait-client-rewrite.js ├── analytics.js ├── auto-complete.js ├── axj8dlz.css ├── banner-styles.css ├── components-min.js ├── customer-dreamworks.jpg ├── customer-ducati.jpg ├── customer-wuxinextcode.jpg ├── elqCfg.min.js ├── eu-cookie-legacy-styles.css ├── eucookielaw.js ├── fontfaceobserver.js ├── gmq-2019-hp-660x660.jpg ├── graph-calc.js ├── iconochive.css ├── ip.js ├── ip.json ├── jquery-1.8.1.min.js ├── jquery.colorbox-min.js ├── jquery.reel-min.js ├── luci-dotcom.min.css ├── modaal.min.js ├── netapp-dotcom.css ├── netapp-dotcom.js ├── netapp-insight-2019-card.jpg ├── netapp-library-critical.min.css ├── netapp-library-non-critical.min.css ├── netapp-library.min.js ├── omniture.js ├── pio.min.js ├── prehide-target.min.js ├── s-code-contents-c785f4bf58dc47f718f9c52197f3a256682bca2a.js ├── satellite-54b68af031393000157c0400.js ├── satellite-555de6a93736390017f20200.js ├── satellite-5566103e3661634a99250100.js ├── satellite-5799201064746d367d0001a7.html ├── satellite-58a4e8d564746d452c000444.js ├── satellite-59231b7564746d58c200493e.js ├── satellite-595587c564746d0b95004eab.js ├── satellite-597abf4964746d09f5002d4a.js ├── satellite-5a04f80f64746d07fd004bec.js ├── satellite-5a3afcb364746d2212001f06.html ├── satellite-5a56b21a64746d13a20000b7.js ├── satellite-5a66639c64746d7cf10009e4.js ├── satellite-5b8869ee64746d450c008bea.js ├── satellite-5c081fc764746d461600dcd3.js ├── satellite-5c10271664746d19e60108b0.js ├── satellite-5c180c4764746d101a00e3dd.js ├── satellite-5c8301c664746d10100059f6.js ├── satellite-5cf18ccf64746d440100177f.js ├── satellite-5d1e25cb64746d08e8003756.js ├── satellite-5d4c56ee64746d092a00026f.js ├── satellite-5d89583164746d1615000dd5.js ├── satelliteLib-b890475dbffe4f59822f38480b7b298879cac858.js ├── saved_resource.html ├── setcacookie.min.js ├── svg4everybody.min.js ├── timestamp.js ├── toolbar.js ├── vms.js └── wbhack.js └── index.htm /.gitignore: -------------------------------------------------------------------------------- 1 | *.code-workspace 2 | making/netapp_website/.DS_Store 3 | making/monitoring/.DS_Store 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /demo/01_iaac_ansible_day0-1.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | clear 4 | echo "[root@rhel3 ~]# cat ansible_files/day0-1.yaml" 5 | cat ansible_files/day0-1.yaml 6 | read -p "Press any key to continue... " -n1 -s 7 | clear 8 | echo "" 9 | echo "[root@rhel3 ~]# ansible-playbook ansible_files/day0-1.yaml" 10 | ansible-playbook ansible_files/day0-1.yaml 11 | 12 | -------------------------------------------------------------------------------- /demo/02_install_trident.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | clear 4 | echo "[root@rhel3 ~]# wget https://github.com/NetApp/trident/releases/download/v20.04.0/trident-installer-20.04.0.tar.gz" 5 | wget https://github.com/NetApp/trident/releases/download/v20.04.0/trident-installer-20.04.0.tar.gz 6 | echo "[root@rhel3 ~]# tar -xf trident-installer-20.04.0.tar.gz" 7 | tar -xf trident-installer-20.04.0.tar.gz 8 | echo "[root@rhel3 ~]# cd trident-installer" 9 | cd trident-installer 10 | 11 | # Run twice the obliviate alpha-snapshot-crd command due to a known issue 12 | echo "[root@rhel3 ~]# tridentctl obliviate alpha-snapshot-crd" 13 | tridentctl obliviate alpha-snapshot-crd 14 | tridentctl obliviate alpha-snapshot-crd 15 | 16 | # Installing Trident without the operator 17 | 18 | echo "[root@rhel3 ~]# tridentctl install -n trident" 19 | tridentctl install -n trident 20 | echo "" 21 | echo "[root@rhel3 ~]# kubectl get all -n trident" 22 | kubectl get all -n trident 23 | echo "" 24 | read -p "Press any key to continue... " -n1 -s 25 | clear 26 | 27 | # Show Trident version 28 | echo "[root@rhel3 ~]# tridentctl version -n trident" 29 | tridentctl version -n trident 30 | echo "" 31 | read -p "Press any key to continue... " -n1 -s 32 | clear 33 | 34 | echo "Enabling snapshots for K8s 1.17 or later" 35 | # Install Snapshot Beta CRDs per cluster 36 | echo "[root@rhel3 ~]# kubectl create -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-2.0/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml" 37 | kubectl create -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-2.0/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml 38 | echo "[root@rhel3 ~]# kubectl create -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-2.0/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml" 39 | kubectl create -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-2.0/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml 40 | echo "[root@rhel3 ~]# kubectl create -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-2.0/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml" 41 | kubectl create -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-2.0/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml 42 | 43 | # Install Snapshot Controller per cluster 44 | echo "[root@rhel3 ~]# kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-2.0/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml" 45 | kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-2.0/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml 46 | echo "[root@rhel3 ~]# kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-2.0/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml" 47 | kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-2.0/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml 48 | echo "" 49 | -------------------------------------------------------------------------------- /demo/03_create_k8s_backends.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | clear 4 | echo "[root@rhel3 ~]# cat k8s_files/backend-san.json" 5 | cat k8s_files/backend-san.json 6 | echo "" 7 | read -p "Press any key to continue... " -n1 -s 8 | clear 9 | echo "[root@rhel3 ~]# cat k8s_files/backend-nas.json" 10 | cat k8s_files/backend-nas.json 11 | echo "" 12 | read -p "Press any key to continue... " -n1 -s 13 | clear 14 | 15 | echo "[root@rhel3 ~]# tridentctl create backend --filename ../demo/k8s_files/backend-nas.json -n trident" 16 | tridentctl create backend --filename ../demo/k8s_files/backend-nas.json -n trident 17 | echo "[root@rhel3 ~]# tridentctl create backend --filename ../demo/k8s_files/backend-san.json -n trident" 18 | tridentctl create backend --filename ../demo/k8s_files/backend-san.json -n trident 19 | echo "" 20 | 21 | echo "[root@rhel3 ~]# tridentctl get backends -n trident" 22 | tridentctl get backends -n trident 23 | -------------------------------------------------------------------------------- /demo/04_create_k8s_storageclasses.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | clear 4 | echo "[root@rhel3 ~]# cat k8s_files/sc-san.yaml" 5 | cat k8s_files/sc-san.yaml 6 | echo "" 7 | read -p "Press any key to continue... " -n1 -s 8 | clear 9 | echo "[root@rhel3 ~]# cat k8s_files/sc-nas-gold.yaml" 10 | cat k8s_files/sc-nas-gold.yaml 11 | echo "" 12 | read -p "Press any key to continue... " -n1 -s 13 | clear 14 | echo "[root@rhel3 ~]# cat k8s_files/sc-nas-silver.yaml" 15 | cat k8s_files/sc-nas-silver.yaml 16 | echo "" 17 | read -p "Press any key to continue... " -n1 -s 18 | clear 19 | 20 | echo "[root@rhel3 ~]# kubectl apply -f ../demo/k8s_files/sc-san.yaml" 21 | kubectl apply -f ../demo/k8s_files/sc-san.yaml 22 | echo "[root@rhel3 ~]# kubectl apply -f ../demo/k8s_files/sc-nas-gold.yaml" 23 | kubectl apply -f ../demo/k8s_files/sc-nas-gold.yaml 24 | echo "[root@rhel3 ~]# kubectl apply -f ../demo/k8s_files/sc-nas-silver.yaml" 25 | kubectl apply -f ../demo/k8s_files/sc-nas-silver.yaml 26 | kubectl patch storageclass san -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' 27 | echo "" 28 | 29 | echo "[root@rhel3 ~]# kubectl get storageclass" 30 | kubectl get storageclass -------------------------------------------------------------------------------- /demo/05_create_pvc.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | clear 4 | echo "[root@rhel3 ~]# cat k8s_files/pvcforsan.yaml" 5 | cat k8s_files/pvcforsan.yaml 6 | echo "" 7 | read -p "Press any key to continue... " -n1 -s 8 | clear 9 | echo "[root@rhel3 ~]# cat k8s_files/pvcfornas.yaml" 10 | cat k8s_files/pvcfornas.yaml 11 | echo "" 12 | read -p "Press any key to continue... " -n1 -s 13 | clear 14 | echo "[root@rhel3 ~]# kubectl apply -f k8s_files/pvcfornas.yaml" 15 | kubectl apply -f k8s_files/pvcfornas.yaml 16 | echo "[root@rhel3 ~]# kubectl apply -f k8s_files/pvcforsan.yaml" 17 | kubectl apply -f k8s_files/pvcforsan.yaml 18 | read -p "Press any key to continue... " -n1 -s 19 | echo "" 20 | echo "[root@rhel3 ~]# kubectl get pvc" 21 | kubectl get pvc 22 | echo "" 23 | echo "[root@rhel3 ~]# kubectl get pv" 24 | kubectl get pv 25 | echo "" 26 | read -p "Press any key to continue... " -n1 -s 27 | echo "" 28 | echo "curl -k -X GET 'https://cluster1.demo.netapp.com/api/storage/volumes' -H 'accept: application/json' -H 'authorization: Basic YWRtaW46TmV0YXBwMSE='" 29 | curl -k -X GET "https://cluster1.demo.netapp.com/api/storage/volumes" -H "accept: application/json" -H "authorization: Basic YWRtaW46TmV0YXBwMSE=" 30 | -------------------------------------------------------------------------------- /demo/06_create_pods.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | clear 4 | echo "[root@rhel3 ~]# cat k8s_files/pv-alpine-nas1.yaml" 5 | cat k8s_files/pv-alpine-nas1.yaml 6 | echo "" 7 | read -p "Press any key to continue... " -n1 -s 8 | clear 9 | echo "[root@rhel3 ~]# cat k8s_files/pv-alpine-san1.yaml" 10 | cat k8s_files/pv-alpine-san1.yaml 11 | echo "" 12 | read -p "Press any key to continue... " -n1 -s 13 | clear 14 | echo "[root@rhel3 ~]# kubectl apply -f k8s_files/pv-alpine-nas1.yaml" 15 | kubectl apply -f k8s_files/pv-alpine-nas1.yaml 16 | echo "[root@rhel3 ~]# kubectl apply -f k8s_files/pv-alpine-san1.yaml" 17 | kubectl apply -f k8s_files/pv-alpine-san1.yaml 18 | echo "" 19 | echo "[root@rhel3 ~]# kubectl get pods" 20 | kubectl get pods 21 | -------------------------------------------------------------------------------- /demo/07_scale_pods_manually.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | clear 4 | echo "[root@rhel3 ~]# cat k8s_files/pv-alpine-nas2.yaml" 5 | cat k8s_files/pv-alpine-nas2.yaml 6 | echo "" 7 | read -p "Press any key to continue... " -n1 -s 8 | clear 9 | 10 | echo "[root@rhel3 ~]# cat k8s_files/pv-alpine-nas3.yaml" 11 | cat k8s_files/pv-alpine-nas3.yaml 12 | echo "" 13 | read -p "Press any key to continue... " -n1 -s 14 | clear 15 | 16 | echo "[root@rhel3 ~]# cat k8s_files/pv-alpine-san2.yaml" 17 | cat k8s_files/pv-alpine-san2.yaml 18 | echo "" 19 | read -p "Press any key to continue... " -n1 -s 20 | clear 21 | 22 | echo "[root@rhel3 ~]# cat k8s_files/pv-alpine-san3.yaml" 23 | cat k8s_files/pv-alpine-san3.yaml 24 | echo "" 25 | read -p "Press any key to continue... " -n1 -s 26 | clear 27 | 28 | echo "[root@rhel3 ~]# kubectl apply -f k8s_files/pv-alpine-nas2.yaml" 29 | kubectl apply -f k8s_files/pv-alpine-nas2.yaml 30 | echo "[root@rhel3 ~]# kubectl apply -f k8s_files/pv-alpine-nas3.yaml" 31 | kubectl apply -f k8s_files/pv-alpine-nas3.yaml 32 | echo "[root@rhel3 ~]# kubectl apply -f k8s_files/pv-alpine-san2.yaml" 33 | kubectl apply -f k8s_files/pv-alpine-san2.yaml 34 | echo "[root@rhel3 ~]# kubectl apply -f k8s_files/pv-alpine-san3.yaml" 35 | kubectl apply -f k8s_files/pv-alpine-san3.yaml 36 | 37 | -------------------------------------------------------------------------------- /demo/08_sidecar_pod.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | clear 4 | echo "[root@rhel3 ~]# cat k8s_files/sidecar-pod.yaml" 5 | cat k8s_files/sidecar-pod.yaml 6 | echo "" 7 | read -p "Press any key to continue... " -n1 -s 8 | clear 9 | 10 | echo "[root@rhel3 ~]# kubectl apply -f k8s_files/sidecar-pod.yaml" 11 | kubectl apply -f k8s_files/sidecar-pod.yaml 12 | 13 | echo "[root@rhel3 ~]# kubectl get pods -o wide" 14 | kubectl get pods -o wide 15 | echo "" 16 | read -p "Wait a few seconds and press any key to continue... " -n1 -s 17 | echo "[root@rhel3 ~]# kubectl get pods -o wide" 18 | kubectl get pods -o wide 19 | echo "" 20 | read -p "Press any key to continue... " -n1 -s 21 | echo "" 22 | echo "curl http://$(kubectl get pod sidecar-pod -o=jsonpath='{.status.podIP}')" 23 | echo "" 24 | curl http://$(kubectl get pod sidecar-pod -o=jsonpath='{.status.podIP}') 25 | -------------------------------------------------------------------------------- /demo/09_pod_pvc_rwo.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | clear 4 | echo "[root@rhel3 ~]# cat k8s_files/pod-pvc-rwo.yaml" 5 | cat k8s_files/pod-pvc-rwo.yaml 6 | 7 | echo "" 8 | read -p "Press any key to continue... " -n1 -s 9 | clear 10 | 11 | echo "[root@rhel3 ~]# kubectl apply -f k8s_files/pod-pvc-rwo.yaml" 12 | kubectl apply -f k8s_files/pod-pvc-rwo.yaml 13 | echo "" 14 | 15 | echo "[root@rhel3 ~]# kubectl get pods" 16 | kubectl get pods 17 | echo "" 18 | 19 | echo "[root@rhel3 ~]# kubectl get pvc" 20 | kubectl get pvc -------------------------------------------------------------------------------- /demo/10_create_frontend_service.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | clear 4 | echo "[root@rhel3 ~]# cat k8s_files/frontend.yaml" 5 | cat k8s_files/frontend.yaml 6 | echo "" 7 | read -p "Press any key to continue... " -n1 -s 8 | clear 9 | echo "[root@rhel3 ~]# kubectl apply -f k8s_files/frontend.yaml" 10 | kubectl apply -f k8s_files/frontend.yaml 11 | echo "[root@rhel3 ~]# kubectl get service" 12 | kubectl get service 13 | echo "" 14 | echo "[root@rhel3 ~]# kubectl get pods" 15 | kubectl get pods 16 | -------------------------------------------------------------------------------- /demo/11_create_backend_service.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | clear 4 | echo "[root@rhel3 ~]# cat k8s_files/mongodb-sts.yaml" 5 | cat k8s_files/mongodb-sts.yaml 6 | echo "" 7 | read -p "Press any key to continue... " -n1 -s 8 | clear 9 | echo "[root@rhel3 ~]# kubectl apply -f k8s_files/mongodb-sts.yaml" 10 | kubectl apply -f k8s_files/mongodb-sts.yaml 11 | echo "[root@rhel3 ~]# kubectl get service" 12 | kubectl get service 13 | echo "" 14 | echo "[root@rhel3 ~]# kubectl get pods" 15 | kubectl get pods 16 | -------------------------------------------------------------------------------- /demo/12_import_web_service.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | clear 4 | echo "[root@rhel3 ~]# kubectl create namespace web" 5 | kubectl create namespace web 6 | echo "" 7 | echo "[root@rhel3 ~]# cat k8s_files/web-content-prod.yaml" 8 | cat k8s_files/web-content-prod.yaml 9 | read -p "Press any key to continue... " -n1 -s 10 | clear 11 | 12 | echo "[root@rhel3 ~]# tridentctl import volume BackendForNAS web_content -f k8s_files/web-content-prod.yaml -n trident" 13 | tridentctl import volume BackendForNAS web_content -f k8s_files/web-content-prod.yaml -n trident 14 | echo "" 15 | 16 | persistentVolumeName=$(kubectl get pvc web-content-prod -n web -o=jsonpath='{.spec.volumeName}') 17 | kubectl patch pv $persistentVolumeName -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}' 18 | 19 | echo "[root@rhel3 ~]# kubectl get pvc -n web" 20 | kubectl get pvc -n web 21 | echo "" 22 | echo "[root@rhel3 ~]# kubectl get pv" 23 | kubectl get pv 24 | read -p "Press any key to continue... " -n1 -s 25 | clear 26 | 27 | echo "[root@rhel3 ~]# cat k8s_files/web-prod.yaml" 28 | cat k8s_files/web-prod.yaml 29 | read -p "Press any key to continue... " -n1 -s 30 | clear 31 | 32 | echo "[root@rhel3 ~]# kubectl apply -f k8s_files/web-prod.yaml -n web" 33 | kubectl apply -f k8s_files/web-prod.yaml -n web 34 | echo "[root@rhel3 ~]# kubectl get all -n web" 35 | kubectl get all -n web 36 | read -p "Press any key to continue... " -n1 -s 37 | 38 | echo "# Copying the volume name" 39 | 40 | echo "(echo -n \"trident_\" && kubectl get pvc web-content-prod -n web -o=jsonpath='{.spec.volumeName}' | sed 's/-/_/g') > volume-name.txt" 41 | (echo -n "trident_" && kubectl get pvc web-content-prod -n web -o=jsonpath='{.spec.volumeName}' | sed 's/-/_/g') > volume-name.txt 42 | 43 | echo "" 44 | 45 | echo "# Copying the PVC name replacing a character to match with the ONTAP volume name" 46 | echo "(echo -n "{\"source_volume_to_protect\": trident_" && kubectl get pvc web-content-prod -n web -o=jsonpath='{.spec.volumeName}' | sed 's/-/_/g' && echo -n "}") > volume-name-snapmirror.json" 47 | (echo -n "{\"source_volume_to_protect\": trident_" && kubectl get pvc web-content-prod -n web -o=jsonpath='{.spec.volumeName}' | sed 's/-/_/g' && echo -n "}") > volume-name-snapmirror.json 48 | 49 | persistentVolumeName=$(kubectl get pvc web-content-prod -n web -o=jsonpath='{.spec.volumeName}') 50 | echo -n $persistentVolumeName > /root/demo-trident/demo/persistent-volume-name.txt 51 | echo "" 52 | echo "Running a yaml files backup for the namespace web..." 53 | echo "" 54 | cd k8s_backup/ 55 | echo "[root@rhel3 ~]# ./export.sh web" 56 | ./export.sh web 57 | -------------------------------------------------------------------------------- /demo/13_restore_web_service.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | clear 4 | persistentVolumeName=$(cat /root/demo-trident/demo/persistent-volume-name.txt) 5 | kubectl patch pv $persistentVolumeName -p '{"spec":{"claimRef":null}}' 6 | 7 | echo "Running a yaml files restore for the namespace web..." 8 | echo "" 9 | cd k8s_backup/ 10 | echo "[root@rhel3 ~]# ./import.sh" 11 | ./import.sh 12 | 13 | -------------------------------------------------------------------------------- /demo/14_datalake_clone.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | clear 4 | echo "[root@rhel3 ~]# kubectl create namespace data-analytics" 5 | kubectl create namespace data-analytics 6 | echo "" 7 | 8 | echo "[root@rhel3 ~]# tridentctl import volume BackendForNAS datalake -f k8s_files/datalake.yaml -n trident" 9 | tridentctl import volume BackendForNAS datalake -f k8s_files/datalake.yaml -n trident 10 | echo "" 11 | echo "[root@rhel3 ~]# kubectl get pvc -n data-analytics" 12 | kubectl get pvc -n data-analytics 13 | read -p "Press any key to continue... " -n1 -s 14 | clear 15 | 16 | echo "[root@rhel3 ~]# cat ./k8s_files/snap-sc.yaml" 17 | cat ./k8s_files/snap-sc.yaml 18 | echo "" 19 | echo "[root@rhel3 ~]# kubectl apply -f ./k8s_files/snap-sc.yaml -n data-analytics" 20 | kubectl apply -f ./k8s_files/snap-sc.yaml -n data-analytics 21 | read -p "Press any key to continue... " -n1 -s 22 | clear 23 | 24 | echo "[root@rhel3 ~]# cat k8s_files/snap-datalake.yaml" 25 | cat k8s_files/snap-datalake.yaml 26 | echo "" 27 | echo "[root@rhel3 ~]# kubectl apply -f k8s_files/snap-datalake.yaml" 28 | kubectl apply -f k8s_files/snap-datalake.yaml -n data-analytics 29 | read -p "Press any key to continue... " -n1 -s 30 | clear 31 | 32 | echo "[root@rhel3 ~]# cat k8s_files/clone-datalake-bryan.yaml" 33 | cat k8s_files/clone-datalake-bryan.yaml 34 | read -p "Press any key to continue... " -n1 -s 35 | clear 36 | 37 | echo "[root@rhel3 ~]# kubectl apply -f k8s_files/clone-datalake-bryan.yaml -n data-analytics" 38 | kubectl apply -f k8s_files/clone-datalake-bryan.yaml -n data-analytics 39 | echo "[root@rhel3 ~]# kubectl apply -f k8s_files/clone-datalake-harry.yaml -n data-analytics" 40 | kubectl apply -f k8s_files/clone-datalake-harry.yaml -n data-analytics 41 | echo "[root@rhel3 ~]# kubectl apply -f k8s_files/clone-datalake-john.yaml -n data-analytics" 42 | kubectl apply -f k8s_files/clone-datalake-john.yaml -n data-analytics 43 | 44 | echo "" 45 | echo "[root@rhel3 ~]# kubectl get pvc -n data-analytics" 46 | kubectl get pvc -n data-analytics 47 | -------------------------------------------------------------------------------- /demo/15_data_analytics_services.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | clear 4 | echo "[root@rhel3 ~]# kubectl apply -f k8s_files/pods-bryan.yaml" 5 | kubectl apply -f k8s_files/pods-bryan.yaml 6 | echo "[root@rhel3 ~]# kubectl apply -f k8s_files/pods-harry.yaml" 7 | kubectl apply -f k8s_files/pods-harry.yaml 8 | echo "[root@rhel3 ~]# kubectl apply -f k8s_files/pods-john.yaml" 9 | kubectl apply -f k8s_files/pods-john.yaml 10 | echo "" 11 | 12 | echo "[root@rhel3 ~]# kubectl get all -n data-analytics" 13 | kubectl get all -n data-analytics -------------------------------------------------------------------------------- /demo/16_clone_web.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | clear 4 | echo "[root@rhel3 ~]# cat volume-name.txt" 5 | cat volume-name.txt 6 | echo "" 7 | volumeName=$(cat volume-name.txt) 8 | cloneJson="{\"name\":\"web_content_dev\",\"clone\":{\"parent_volume\": {\"name\": \"$volumeName\"},\"is_flexclone\":\"true\"},\"svm\":{\"name\": \"svm1\"}}" 9 | 10 | echo "[root@rhel3 ~]# curl -k -X POST \"https://cluster1.demo.netapp.com/api/storage/volumes\" -H \"accept: application/hal+json\" -H 'authorization: Basic YWRtaW46TmV0YXBwMSE=' -d '{\"name\":\"web_content_dev\",\"clone\":{\"parent_volume\": {\"name\": \"$volumeName\"},\"is_flexclone\":\"true\"},\"svm\":{\"name\": \"svm1\"}}'" 11 | curl -k -X POST 'https://cluster1.demo.netapp.com/api/storage/volumes' -H 'accept: application/hal+json' -H 'authorization: Basic YWRtaW46TmV0YXBwMSE=' -d "$cloneJson" 12 | -------------------------------------------------------------------------------- /demo/17_create_staging_web_service.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | clear 4 | echo "[root@rhel4 ~]# kubectl create namespace web" 5 | kubectl create namespace web 6 | echo "" 7 | echo "[root@rhel4 ~]# tridentctl import volume BackendForNAS web_content_dev -f k8s_files/web-content-clone.yaml -n trident" 8 | tridentctl import volume BackendForNAS web_content_dev -f k8s_files/web-content-clone.yaml -n trident 9 | echo "" 10 | read -p "Press any key to continue... " -n1 -s 11 | clear 12 | echo "[root@rhel4 ~]# cat k8s_files/web-dev.yaml" 13 | cat k8s_files/web-dev.yaml 14 | 15 | echo "" 16 | read -p "Press any key to continue... " -n1 -s 17 | clear 18 | echo "[root@rhel4 ~]# kubectl apply -f k8s_files/web-dev.yaml -n web" 19 | kubectl apply -f k8s_files/web-dev.yaml -n web 20 | echo "" 21 | echo "[root@rhel4 ~]# kubectl get all -n web" 22 | kubectl get all -n web 23 | 24 | -------------------------------------------------------------------------------- /demo/18_coding_new_website.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | clear 3 | echo "Coding new website..." 4 | cd /root/demo-trident/making/netapp_website/v2 > /dev/null 5 | tar -cvf netapp_website_v2.tar . > /dev/null 6 | kubectl cp /root/demo-trident/making/netapp_website/v2/netapp_website_v2.tar web/web-dev-0:/usr/share/nginx/html/ > /dev/null 7 | kubectl exec web-dev-0 -n web -- bash -c "tar -xvf /usr/share/nginx/html/netapp_website_v2.tar -C /usr/share/nginx/html" > /dev/null 8 | echo " _nnnn_" 9 | echo " _________ dGGGGMMb" 10 | echo " / ======= \ @p~qp~~qMb" 11 | echo " / __________\ M|@||@) M|" 12 | echo " | ___________ | @,----.JM|" 13 | echo " | | - | | JS^\__/ qKL" 14 | echo " | | | | dZP qKRb" 15 | echo " | |_________| | dZP qKKb" 16 | echo " \=____________/ fZP SMMb" 17 | echo " / '''''''''' \ HZM MMMM" 18 | echo " / ::::::::::::: \ FqM MMMM" 19 | echo "(_________________) __| ll. |\dSoqML" 20 | echo " | l. | MM \Zq" 21 | echo " _) \.___.,| .." 22 | echo " \____ )MMMMMP| .." 23 | echo " - -- " 24 | echo "" 25 | read -p "Press any key to continue... " -n1 -s 26 | clear 27 | -------------------------------------------------------------------------------- /demo/19_iaac_ansible_day2.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | clear 4 | echo "[root@rhel3 ~]# cat ansible_files/day2.yaml" 5 | cat ansible_files/day2.yaml 6 | read -p "Press any key to continue... " -n1 -s 7 | echo "" 8 | echo "[root@rhel3 ~]# cat volume-name-snapmirror.json" 9 | cat volume-name-snapmirror.json 10 | echo "" 11 | echo "[root@rhel3 ~]# ansible-playbook ansible_files/day2.yaml-e \"@volume-name-snapmirror.json\"" 12 | ansible-playbook ansible_files/day2.yaml -e "@volume-name-snapmirror.json" 13 | 14 | 15 | -------------------------------------------------------------------------------- /demo/20_get_protection_volumes.sh: -------------------------------------------------------------------------------- 1 | clear 2 | 3 | SM_ID=$(curl --silent -k -X GET 'https://cluster1.demo.netapp.com/api/snapmirror/relationships' -H 'accept: application/json' -H 'authorization: Basic YWRtaW46TmV0YXBwMSE=' | grep uuid | tr -s ' ' | cut -d ' ' -f 3 | tr -d '\"') 4 | echo "" 5 | echo "curl -k -X GET \"https://cluster1.demo.netapp.com/api/snapmirror/relationships/${SM_ID}\" -H 'accept: application/json' -H 'authorization: Basic YWRtaW46TmV0YXBwMSE='" 6 | curl -k -X GET "https://cluster1.demo.netapp.com/api/snapmirror/relationships/${SM_ID}" -H 'accept: application/json' -H 'authorization: Basic YWRtaW46TmV0YXBwMSE=' 7 | 8 | -------------------------------------------------------------------------------- /demo/ansible_files/day0-1.yaml: -------------------------------------------------------------------------------- 1 | # Configure ONTAP SVM for NFS & iSCSI protocol 2 | 3 | - name: Configure an ONTAP SVM for iSCSI protocol 4 | hosts: localhost 5 | gather_facts: no 6 | connection: local 7 | 8 | vars: 9 | netapp_hostname: 192.168.0.101 10 | netapp_username: admin 11 | netapp_password: Netapp1! 12 | tasks: 13 | - name: Enable iSCSI protocol 14 | na_ontap_svm: 15 | state: present 16 | name: svm1 17 | allowed_protocols: nfs,iscsi 18 | hostname: "{{ netapp_hostname }}" 19 | username: "{{ netapp_username }}" 20 | password: "{{ netapp_password }}" 21 | https: true 22 | validate_certs: false 23 | - name: Create interface 24 | na_ontap_interface: 25 | state: present 26 | interface_name: svm1_iscsi 27 | home_port: e0d 28 | home_node: cluster1-01 29 | role: data 30 | protocols: iscsi 31 | admin_status: up 32 | address: 192.168.0.45 33 | netmask: 255.255.255.0 34 | vserver: svm1 35 | hostname: "{{ netapp_hostname }}" 36 | username: "{{ netapp_username }}" 37 | password: "{{ netapp_password }}" 38 | https: true 39 | validate_certs: false 40 | - name: Enable iscsi service 41 | na_ontap_iscsi: 42 | state: present 43 | service_state: started 44 | vserver: svm1 45 | hostname: "{{ netapp_hostname }}" 46 | username: "{{ netapp_username }}" 47 | password: "{{ netapp_password }}" 48 | https: true 49 | validate_certs: false 50 | 51 | -------------------------------------------------------------------------------- /demo/ansible_files/day2.yaml: -------------------------------------------------------------------------------- 1 | # Configure a destination ONTAP SVM and run a SnapMirror relationship 2 | # Replace with the volume name in the source volume to protect variable 3 | 4 | - name: Configure a snapmirror relationship 5 | hosts: localhost 6 | gather_facts: no 7 | connection: local 8 | 9 | vars: 10 | netapp_hostname: 192.168.0.101 11 | netapp_username: admin 12 | netapp_password: Netapp1! 13 | source_volume_to_protect: 14 | tasks: 15 | - name: Create destination SVM 16 | na_ontap_svm: 17 | state: present 18 | name: cloud_volumes_ontap 19 | root_volume: root 20 | root_volume_aggregate: aggr1 21 | root_volume_security_style: unix 22 | hostname: "{{ netapp_hostname }}" 23 | username: "{{ netapp_username }}" 24 | password: "{{ netapp_password }}" 25 | https: true 26 | validate_certs: false 27 | - name: Create FlexVol 28 | na_ontap_volume: 29 | state: present 30 | name: trident_default_persistent_volume_claim_dest 31 | is_infinite: False 32 | aggregate_name: aggr1 33 | size: 1 34 | size_unit: gb 35 | type: DP 36 | vserver: cloud_volumes_ontap 37 | hostname: "{{ netapp_hostname }}" 38 | username: "{{ netapp_username }}" 39 | password: "{{ netapp_password }}" 40 | https: true 41 | validate_certs: false 42 | - name: Create SVM peering 43 | na_ontap_command: 44 | hostname: "{{ netapp_hostname }}" 45 | username: "{{ netapp_username }}" 46 | password: "{{ netapp_password }}" 47 | command: ['vserver', 'peer', 'create', '-vserver', 'svm1', '-peer-vserver', 'cloud_volumes_ontap', '-applications', 'snapmirror'] 48 | privilege: 'admin' 49 | https: true 50 | validate_certs: false 51 | - name: Create SnapMirror 52 | na_ontap_snapmirror: 53 | state: present 54 | source_volume: "{{ source_volume_to_protect }}" 55 | destination_volume: trident_default_persistent_volume_claim_dest 56 | source_vserver: svm1 57 | destination_vserver: cloud_volumes_ontap 58 | hostname: "{{ netapp_hostname }}" 59 | username: "{{ netapp_username }}" 60 | password: "{{ netapp_password }}" 61 | https: true 62 | validate_certs: false 63 | -------------------------------------------------------------------------------- /demo/k8s_backup/export.sh: -------------------------------------------------------------------------------- 1 | NAMESPACE=$1 2 | i=$((0)) 3 | for n in $(kubectl get -o=custom-columns=NAMESPACE:.metadata.namespace,KIND:.kind,NAME:.metadata.name pvc,configmap,ingress,service,secret,deployment,statefulset,hpa,job,cronjob -n $NAMESPACE | grep -v 'secrets/default-token') 4 | do 5 | if (( $i < 1 )); then 6 | namespace=$n 7 | i=$(($i+1)) 8 | if [[ "$namespace" == "PersistentVolume" ]]; then 9 | kind=$n 10 | i=$(($i+1)) 11 | fi 12 | elif (( $i < 2 )); then 13 | kind=$n 14 | i=$(($i+1)) 15 | elif (( $i < 3 )); then 16 | name=$n 17 | i=$((0)) 18 | echo "saving ${namespace} ${kind} ${name}" 19 | if [[ "$namespace" != "NAMESPACE" ]]; then 20 | mkdir -p $namespace 21 | kubectl get $kind -o=yaml $name -n $namespace > $namespace/$kind.$name.yaml 22 | fi 23 | fi 24 | done -------------------------------------------------------------------------------- /demo/k8s_backup/import.sh: -------------------------------------------------------------------------------- 1 | path=$(pwd) 2 | for n in $(ls -d */) 3 | do 4 | echo "Creating namespace ${n:0:-1}" 5 | kubectl create namespace ${n:0:-1} 6 | 7 | for yaml in $(ls $path/$n) 8 | do 9 | echo -e "\t Importing $yaml" 10 | kubectl apply -f $path/$n$yaml -n ${n:0:-1} 11 | done 12 | 13 | done -------------------------------------------------------------------------------- /demo/k8s_files/backend-nas.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "storageDriverName": "ontap-nas", 4 | "backendName": "BackendForNAS", 5 | "managementLIF": "192.168.0.135", 6 | "dataLIF": "192.168.0.132", 7 | "svm": "svm1", 8 | "username": "vsadmin", 9 | "password": "Netapp1!", 10 | "limitVolumeSize": "50Gi", 11 | "defaults": { 12 | "spaceReserve": "volume", 13 | "exportPolicy": "default", 14 | "snapshotPolicy": "default", 15 | "snapshotReserve": "10" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /demo/k8s_files/backend-san.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "storageDriverName": "ontap-san", 4 | "backendName": "BackendForSAN", 5 | "managementLIF": "192.168.0.135", 6 | "dataLIF": "192.168.0.45", 7 | "svm": "svm1", 8 | "igroupName": "k8s", 9 | "username": "vsadmin", 10 | "password": "Netapp1!", 11 | "limitVolumeSize": "50Gi", 12 | "defaults": { 13 | "spaceReserve": "volume", 14 | "snapshotPolicy": "default", 15 | "snapshotReserve": "10" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /demo/k8s_files/clone-datalake-bryan.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: PersistentVolumeClaim 3 | metadata: 4 | name: clone-datalake-bryan 5 | spec: 6 | accessModes: 7 | - ReadWriteMany 8 | resources: 9 | requests: 10 | storage: 1Ti 11 | storageClassName: nas-silver 12 | dataSource: 13 | name: snap-datalake 14 | kind: VolumeSnapshot 15 | apiGroup: snapshot.storage.k8s.io 16 | -------------------------------------------------------------------------------- /demo/k8s_files/clone-datalake-harry.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: PersistentVolumeClaim 3 | metadata: 4 | name: clone-datalake-harry 5 | spec: 6 | accessModes: 7 | - ReadWriteMany 8 | resources: 9 | requests: 10 | storage: 1Ti 11 | storageClassName: nas-silver 12 | dataSource: 13 | name: snap-datalake 14 | kind: VolumeSnapshot 15 | apiGroup: snapshot.storage.k8s.io 16 | -------------------------------------------------------------------------------- /demo/k8s_files/clone-datalake-john.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: PersistentVolumeClaim 3 | metadata: 4 | name: clone-datalake-john 5 | spec: 6 | accessModes: 7 | - ReadWriteMany 8 | resources: 9 | requests: 10 | storage: 1Ti 11 | storageClassName: nas-silver 12 | dataSource: 13 | name: snap-datalake 14 | kind: VolumeSnapshot 15 | apiGroup: snapshot.storage.k8s.io 16 | -------------------------------------------------------------------------------- /demo/k8s_files/datalake.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: PersistentVolumeClaim 3 | metadata: 4 | name: datalake 5 | namespace: data-analytics 6 | spec: 7 | accessModes: 8 | - ReadWriteMany 9 | storageClassName: nas-silver 10 | -------------------------------------------------------------------------------- /demo/k8s_files/frontend.yaml: -------------------------------------------------------------------------------- 1 | kind: PersistentVolumeClaim 2 | apiVersion: v1 3 | metadata: 4 | name: persistent-volume-claim-nas 5 | annotations: 6 | trident.netapp.io/snapshotPolicy: "default" 7 | trident.netapp.io/snapshotDirectory: "true" 8 | trident.netapp.io/reclaimPolicy: "Retain" 9 | spec: 10 | accessModes: 11 | - ReadWriteMany 12 | storageClassName: storage-class-nas 13 | resources: 14 | requests: 15 | storage: 1Gi 16 | --- 17 | apiVersion: v1 18 | kind: Service 19 | metadata: 20 | name: frontend-service 21 | spec: 22 | ports: 23 | - port: 80 24 | name: web 25 | clusterIP: None 26 | selector: 27 | app: frontend 28 | --- 29 | apiVersion: apps/v1 30 | metadata: 31 | name: frontend 32 | labels: 33 | app: frontend 34 | kind: Deployment 35 | spec: 36 | replicas: 3 37 | selector: 38 | matchLabels: 39 | app: frontend 40 | template: 41 | metadata: 42 | labels: 43 | app: frontend 44 | spec: 45 | containers: 46 | - name: nginx 47 | image: nginx:1.8 48 | volumeMounts: 49 | - name: my-pvc-nfs 50 | mountPath: /mnt 51 | ports: 52 | - containerPort: 80 53 | name: web 54 | volumes: 55 | - name: my-pvc-nfs 56 | persistentVolumeClaim: 57 | claimName: persistent-volume-claim-nas 58 | -------------------------------------------------------------------------------- /demo/k8s_files/mongodb-sts.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: mongodb-service 5 | labels: 6 | name: mongo 7 | spec: 8 | ports: 9 | - port: 27017 10 | targetPort: 27017 11 | clusterIP: None 12 | selector: 13 | role: mongo 14 | --- 15 | apiVersion: apps/v1 16 | kind: StatefulSet 17 | metadata: 18 | name: mongodb 19 | spec: 20 | serviceName: mongodb-service 21 | replicas: 3 22 | selector: 23 | matchLabels: 24 | role: mongo 25 | environment: test 26 | replicaset: MainRepSet 27 | template: 28 | metadata: 29 | labels: 30 | role: mongo 31 | environment: test 32 | replicaset: MainRepSet 33 | spec: 34 | terminationGracePeriodSeconds: 10 35 | volumes: 36 | - name: secrets-volume 37 | secret: 38 | secretName: shared-bootstrap-data 39 | defaultMode: 256 40 | containers: 41 | - name: mongod-container 42 | image: mongo 43 | command: 44 | - "mongod" 45 | - "--bind_ip" 46 | - "0.0.0.0" 47 | - "--replSet" 48 | - "MainRepSet" 49 | - "--auth" 50 | - "--clusterAuthMode" 51 | - "keyFile" 52 | - "--keyFile" 53 | - "/etc/secrets-volume/internal-auth-mongodb-keyfile" 54 | - "--setParameter" 55 | - "authenticationMechanisms=SCRAM-SHA-1" 56 | ports: 57 | - containerPort: 27017 58 | volumeMounts: 59 | - name: secrets-volume 60 | readOnly: true 61 | mountPath: /etc/secrets-volume 62 | - name: mongodb-persistent-storage-claim 63 | mountPath: /data/db 64 | volumeClaimTemplates: 65 | - metadata: 66 | name: mongodb-persistent-storage-claim 67 | spec: 68 | accessModes: [ "ReadWriteOnce" ] 69 | resources: 70 | requests: 71 | storage: 1Gi 72 | storageClassName: storage-class-san 73 | -------------------------------------------------------------------------------- /demo/k8s_files/pod-pvc-rwo.yaml: -------------------------------------------------------------------------------- 1 | kind: PersistentVolumeClaim 2 | apiVersion: v1 3 | metadata: 4 | name: persistent-volume-rwo 5 | spec: 6 | accessModes: 7 | - ReadWriteOnce 8 | storageClassName: nas-silver 9 | resources: 10 | requests: 11 | storage: 1Gi 12 | --- 13 | kind: Pod 14 | apiVersion: v1 15 | metadata: 16 | name: pvpod-rwo 17 | spec: 18 | volumes: 19 | - name: task-pv-storage 20 | persistentVolumeClaim: 21 | claimName: persistent-volume-rwo 22 | containers: 23 | - name: task-pv-container 24 | image: alpine:3.2 25 | command: 26 | - /bin/sh 27 | - "-c" 28 | - "sleep 60m" 29 | volumeMounts: 30 | - mountPath: "/data" 31 | name: task-pv-storage 32 | -------------------------------------------------------------------------------- /demo/k8s_files/pods-bryan.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: bryan 5 | namespace: data-analytics 6 | spec: 7 | ports: 8 | - port: 80 9 | name: web 10 | protocol: TCP 11 | targetPort: 80 12 | type: LoadBalancer 13 | selector: 14 | app: bryan 15 | --- 16 | kind: Pod 17 | apiVersion: v1 18 | metadata: 19 | name: bryan-pytorch 20 | namespace: data-analytics 21 | labels: 22 | app: bryan 23 | spec: 24 | volumes: 25 | - name: datalake 26 | persistentVolumeClaim: 27 | claimName: clone-datalake-bryan 28 | containers: 29 | - name: task-pv-container 30 | image: alpine:3.2 31 | command: 32 | - /bin/sh 33 | - "-c" 34 | - "sleep 60m" 35 | volumeMounts: 36 | - mountPath: "/data" 37 | name: datalake 38 | --- 39 | kind: Pod 40 | apiVersion: v1 41 | metadata: 42 | name: bryan-jupyter 43 | namespace: data-analytics 44 | labels: 45 | app: bryan 46 | spec: 47 | containers: 48 | - name: task-pv-container 49 | image: alpine:3.2 50 | command: 51 | - /bin/sh 52 | - "-c" 53 | - "sleep 60m" 54 | --- 55 | kind: Pod 56 | apiVersion: v1 57 | metadata: 58 | name: bryan-envoy 59 | namespace: data-analytics 60 | labels: 61 | app: bryan 62 | spec: 63 | containers: 64 | - name: task-pv-container 65 | image: alpine:3.2 66 | command: 67 | - /bin/sh 68 | - "-c" 69 | - "sleep 60m" 70 | --- 71 | kind: Pod 72 | apiVersion: v1 73 | metadata: 74 | name: bryan-argo 75 | namespace: data-analytics 76 | labels: 77 | app: bryan 78 | spec: 79 | containers: 80 | - name: task-pv-container 81 | image: alpine:3.2 82 | command: 83 | - /bin/sh 84 | - "-c" 85 | - "sleep 60m" 86 | --- 87 | kind: Pod 88 | apiVersion: v1 89 | metadata: 90 | name: bryan-ml-pipeline 91 | namespace: data-analytics 92 | labels: 93 | app: bryan 94 | spec: 95 | containers: 96 | - name: task-pv-container 97 | image: alpine:3.2 98 | command: 99 | - /bin/sh 100 | - "-c" 101 | - "sleep 60m" 102 | --- 103 | kind: Pod 104 | apiVersion: v1 105 | metadata: 106 | name: bryan-katiib-ui 107 | namespace: data-analytics 108 | labels: 109 | app: bryan 110 | spec: 111 | containers: 112 | - name: task-pv-container 113 | image: alpine:3.2 114 | command: 115 | - /bin/sh 116 | - "-c" 117 | - "sleep 60m" 118 | --- 119 | kind: Pod 120 | apiVersion: v1 121 | metadata: 122 | name: bryan-seldon 123 | namespace: data-analytics 124 | labels: 125 | app: bryan 126 | spec: 127 | containers: 128 | - name: task-pv-container 129 | image: alpine:3.2 130 | command: 131 | - /bin/sh 132 | - "-c" 133 | - "sleep 60m" 134 | -------------------------------------------------------------------------------- /demo/k8s_files/pods-harry.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: harry 5 | namespace: data-analytics 6 | spec: 7 | ports: 8 | - port: 80 9 | name: web 10 | protocol: TCP 11 | targetPort: 80 12 | type: LoadBalancer 13 | selector: 14 | app: harry 15 | --- 16 | kind: Pod 17 | apiVersion: v1 18 | metadata: 19 | name: harry-pytorch 20 | namespace: data-analytics 21 | labels: 22 | app: harry 23 | spec: 24 | volumes: 25 | - name: datalake 26 | persistentVolumeClaim: 27 | claimName: clone-datalake-harry 28 | containers: 29 | - name: task-pv-container 30 | image: alpine:3.2 31 | command: 32 | - /bin/sh 33 | - "-c" 34 | - "sleep 60m" 35 | volumeMounts: 36 | - mountPath: "/data" 37 | name: datalake 38 | --- 39 | kind: Pod 40 | apiVersion: v1 41 | metadata: 42 | name: harry-jupyter 43 | namespace: data-analytics 44 | labels: 45 | app: harry 46 | spec: 47 | containers: 48 | - name: task-pv-container 49 | image: alpine:3.2 50 | command: 51 | - /bin/sh 52 | - "-c" 53 | - "sleep 60m" 54 | --- 55 | kind: Pod 56 | apiVersion: v1 57 | metadata: 58 | name: harry-envoy 59 | namespace: data-analytics 60 | labels: 61 | app: harry 62 | spec: 63 | containers: 64 | - name: task-pv-container 65 | image: alpine:3.2 66 | command: 67 | - /bin/sh 68 | - "-c" 69 | - "sleep 60m" 70 | --- 71 | kind: Pod 72 | apiVersion: v1 73 | metadata: 74 | name: harry-argo 75 | namespace: data-analytics 76 | labels: 77 | app: harry 78 | spec: 79 | containers: 80 | - name: task-pv-container 81 | image: alpine:3.2 82 | command: 83 | - /bin/sh 84 | - "-c" 85 | - "sleep 60m" 86 | --- 87 | kind: Pod 88 | apiVersion: v1 89 | metadata: 90 | name: harry-ml-pipeline 91 | namespace: data-analytics 92 | labels: 93 | app: harry 94 | spec: 95 | containers: 96 | - name: task-pv-container 97 | image: alpine:3.2 98 | command: 99 | - /bin/sh 100 | - "-c" 101 | - "sleep 60m" 102 | --- 103 | kind: Pod 104 | apiVersion: v1 105 | metadata: 106 | name: harry-katiib-ui 107 | namespace: data-analytics 108 | labels: 109 | app: harry 110 | spec: 111 | containers: 112 | - name: task-pv-container 113 | image: alpine:3.2 114 | command: 115 | - /bin/sh 116 | - "-c" 117 | - "sleep 60m" 118 | --- 119 | kind: Pod 120 | apiVersion: v1 121 | metadata: 122 | name: harry-seldon 123 | namespace: data-analytics 124 | labels: 125 | app: harry 126 | spec: 127 | containers: 128 | - name: task-pv-container 129 | image: alpine:3.2 130 | command: 131 | - /bin/sh 132 | - "-c" 133 | - "sleep 60m" 134 | -------------------------------------------------------------------------------- /demo/k8s_files/pods-john.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: john 5 | namespace: data-analytics 6 | spec: 7 | ports: 8 | - port: 80 9 | name: web 10 | protocol: TCP 11 | targetPort: 80 12 | type: LoadBalancer 13 | selector: 14 | app: john 15 | --- 16 | kind: Pod 17 | apiVersion: v1 18 | metadata: 19 | name: john-pytorch 20 | namespace: data-analytics 21 | labels: 22 | app: john 23 | spec: 24 | volumes: 25 | - name: datalake 26 | persistentVolumeClaim: 27 | claimName: clone-datalake-john 28 | containers: 29 | - name: task-pv-container 30 | image: alpine:3.2 31 | command: 32 | - /bin/sh 33 | - "-c" 34 | - "sleep 60m" 35 | volumeMounts: 36 | - mountPath: "/data" 37 | name: datalake 38 | --- 39 | kind: Pod 40 | apiVersion: v1 41 | metadata: 42 | name: john-jupyter 43 | namespace: data-analytics 44 | labels: 45 | app: john 46 | spec: 47 | containers: 48 | - name: task-pv-container 49 | image: alpine:3.2 50 | command: 51 | - /bin/sh 52 | - "-c" 53 | - "sleep 60m" 54 | --- 55 | kind: Pod 56 | apiVersion: v1 57 | metadata: 58 | name: john-envoy 59 | namespace: data-analytics 60 | labels: 61 | app: john 62 | spec: 63 | containers: 64 | - name: task-pv-container 65 | image: alpine:3.2 66 | command: 67 | - /bin/sh 68 | - "-c" 69 | - "sleep 60m" 70 | --- 71 | kind: Pod 72 | apiVersion: v1 73 | metadata: 74 | name: john-argo 75 | namespace: data-analytics 76 | labels: 77 | app: john 78 | spec: 79 | containers: 80 | - name: task-pv-container 81 | image: alpine:3.2 82 | command: 83 | - /bin/sh 84 | - "-c" 85 | - "sleep 60m" 86 | --- 87 | kind: Pod 88 | apiVersion: v1 89 | metadata: 90 | name: john-ml-pipeline 91 | namespace: data-analytics 92 | labels: 93 | app: john 94 | spec: 95 | containers: 96 | - name: task-pv-container 97 | image: alpine:3.2 98 | command: 99 | - /bin/sh 100 | - "-c" 101 | - "sleep 60m" 102 | --- 103 | kind: Pod 104 | apiVersion: v1 105 | metadata: 106 | name: john-katiib-ui 107 | namespace: data-analytics 108 | labels: 109 | app: john 110 | spec: 111 | containers: 112 | - name: task-pv-container 113 | image: alpine:3.2 114 | command: 115 | - /bin/sh 116 | - "-c" 117 | - "sleep 60m" 118 | --- 119 | kind: Pod 120 | apiVersion: v1 121 | metadata: 122 | name: john-seldon 123 | namespace: data-analytics 124 | labels: 125 | app: john 126 | spec: 127 | containers: 128 | - name: task-pv-container 129 | image: alpine:3.2 130 | command: 131 | - /bin/sh 132 | - "-c" 133 | - "sleep 60m" 134 | -------------------------------------------------------------------------------- /demo/k8s_files/pv-alpine-nas-clone.yaml: -------------------------------------------------------------------------------- 1 | kind: Pod 2 | apiVersion: v1 3 | metadata: 4 | name: pvpod-nas1-clone 5 | spec: 6 | volumes: 7 | - name: task-pv-clone-storage 8 | persistentVolumeClaim: 9 | claimName: persistent-volume-claim-nas-clone 10 | containers: 11 | - name: task-pv-clone-container 12 | image: alpine:3.2 13 | command: 14 | - /bin/sh 15 | - "-c" 16 | - "sleep 60m" 17 | volumeMounts: 18 | - mountPath: "/data" 19 | name: task-pv-clone-storage 20 | -------------------------------------------------------------------------------- /demo/k8s_files/pv-alpine-nas1.yaml: -------------------------------------------------------------------------------- 1 | kind: Pod 2 | apiVersion: v1 3 | metadata: 4 | name: pvpod-nas1 5 | spec: 6 | volumes: 7 | - name: task-pv-storage 8 | persistentVolumeClaim: 9 | claimName: persistent-volume-claim-nas 10 | containers: 11 | - name: task-pv-container 12 | image: alpine:3.2 13 | command: 14 | - /bin/sh 15 | - "-c" 16 | - "sleep 60m" 17 | volumeMounts: 18 | - mountPath: "/data" 19 | name: task-pv-storage 20 | nodeName: rhel1 21 | -------------------------------------------------------------------------------- /demo/k8s_files/pv-alpine-nas2.yaml: -------------------------------------------------------------------------------- 1 | kind: Pod 2 | apiVersion: v1 3 | metadata: 4 | name: pvpod-nas2 5 | spec: 6 | volumes: 7 | - name: task-pv-storage 8 | persistentVolumeClaim: 9 | claimName: persistent-volume-claim-nas 10 | containers: 11 | - name: task-pv-container 12 | image: alpine:3.2 13 | command: 14 | - /bin/sh 15 | - "-c" 16 | - "sleep 60m" 17 | volumeMounts: 18 | - mountPath: "/data" 19 | name: task-pv-storage 20 | nodeName: rhel1 21 | -------------------------------------------------------------------------------- /demo/k8s_files/pv-alpine-nas3.yaml: -------------------------------------------------------------------------------- 1 | kind: Pod 2 | apiVersion: v1 3 | metadata: 4 | name: pvpod-nas3 5 | spec: 6 | volumes: 7 | - name: task-pv-storage 8 | persistentVolumeClaim: 9 | claimName: persistent-volume-claim-nas 10 | containers: 11 | - name: task-pv-container 12 | image: alpine:3.2 13 | command: 14 | - /bin/sh 15 | - "-c" 16 | - "sleep 60m" 17 | volumeMounts: 18 | - mountPath: "/data" 19 | name: task-pv-storage 20 | nodeName: rhel2 21 | -------------------------------------------------------------------------------- /demo/k8s_files/pv-alpine-san1.yaml: -------------------------------------------------------------------------------- 1 | kind: Pod 2 | apiVersion: v1 3 | metadata: 4 | name: pvpod-san1 5 | spec: 6 | volumes: 7 | - name: task-pv-storage 8 | persistentVolumeClaim: 9 | claimName: persistent-volume-claim-san 10 | containers: 11 | - name: task-pv-container 12 | image: alpine:3.2 13 | command: 14 | - /bin/sh 15 | - "-c" 16 | - "sleep 60m" 17 | volumeMounts: 18 | - mountPath: "/data" 19 | name: task-pv-storage 20 | nodeName: rhel1 21 | -------------------------------------------------------------------------------- /demo/k8s_files/pv-alpine-san2.yaml: -------------------------------------------------------------------------------- 1 | kind: Pod 2 | apiVersion: v1 3 | metadata: 4 | name: pvpod-san2 5 | spec: 6 | volumes: 7 | - name: task-pv-storage 8 | persistentVolumeClaim: 9 | claimName: persistent-volume-claim-san 10 | containers: 11 | - name: task-pv-container 12 | image: alpine:3.2 13 | command: 14 | - /bin/sh 15 | - "-c" 16 | - "sleep 60m" 17 | volumeMounts: 18 | - mountPath: "/data" 19 | name: task-pv-storage 20 | nodeName: rhel1 21 | -------------------------------------------------------------------------------- /demo/k8s_files/pv-alpine-san3.yaml: -------------------------------------------------------------------------------- 1 | kind: Pod 2 | apiVersion: v1 3 | metadata: 4 | name: pvpod-san3 5 | spec: 6 | volumes: 7 | - name: task-pv-storage 8 | persistentVolumeClaim: 9 | claimName: persistent-volume-claim-san 10 | containers: 11 | - name: task-pv-container 12 | image: alpine:3.2 13 | command: 14 | - /bin/sh 15 | - "-c" 16 | - "sleep 60m" 17 | volumeMounts: 18 | - mountPath: "/data" 19 | name: task-pv-storage 20 | nodeName: rhel2 21 | -------------------------------------------------------------------------------- /demo/k8s_files/pvcfornas-clone.yaml: -------------------------------------------------------------------------------- 1 | kind: PersistentVolumeClaim 2 | apiVersion: v1 3 | metadata: 4 | name: persistent-volume-claim-nas-clone 5 | annotations: 6 | trident.netapp.io/snapshotPolicy: "default" 7 | trident.netapp.io/snapshotDirectory: "true" 8 | trident.netapp.io/cloneFromPVC: persistent-volume-claim-nas 9 | spec: 10 | accessModes: 11 | - ReadWriteMany 12 | resources: 13 | requests: 14 | storage: 1Gi 15 | storageClassName: nas-silver 16 | -------------------------------------------------------------------------------- /demo/k8s_files/pvcfornas.yaml: -------------------------------------------------------------------------------- 1 | kind: PersistentVolumeClaim 2 | apiVersion: v1 3 | metadata: 4 | name: persistent-volume-claim-nas 5 | annotations: 6 | trident.netapp.io/snapshotPolicy: "default" 7 | trident.netapp.io/snapshotDirectory: "true" 8 | trident.netapp.io/reclaimPolicy: "Retain" 9 | spec: 10 | accessModes: 11 | - ReadWriteMany 12 | storageClassName: storage-class-nas 13 | resources: 14 | requests: 15 | storage: 1Gi 16 | -------------------------------------------------------------------------------- /demo/k8s_files/pvcforsan.yaml: -------------------------------------------------------------------------------- 1 | kind: PersistentVolumeClaim 2 | apiVersion: v1 3 | metadata: 4 | name: persistent-volume-claim-san 5 | annotations: 6 | trident.netapp.io/reclaimPolicy: "Delete" 7 | spec: 8 | accessModes: 9 | - ReadWriteOnce 10 | storageClassName: storage-class-san 11 | resources: 12 | requests: 13 | storage: 1Gi 14 | -------------------------------------------------------------------------------- /demo/k8s_files/sc-nas-gold.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: storage.k8s.io/v1 2 | kind: StorageClass 3 | metadata: 4 | name: nas-gold 5 | provisioner: csi.trident.netapp.io 6 | parameters: 7 | backendType: "ontap-nas" 8 | media: "ssd" 9 | provisioningType: "thick" 10 | encryption: "true" 11 | allowVolumeExpansion: true 12 | -------------------------------------------------------------------------------- /demo/k8s_files/sc-nas-silver.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: storage.k8s.io/v1 2 | kind: StorageClass 3 | metadata: 4 | name: nas-silver 5 | provisioner: csi.trident.netapp.io 6 | parameters: 7 | backendType: "ontap-nas" 8 | provisioningType: "thin" 9 | encryption: "false" 10 | allowVolumeExpansion: true 11 | -------------------------------------------------------------------------------- /demo/k8s_files/sc-san.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: storage.k8s.io/v1 2 | kind: StorageClass 3 | metadata: 4 | name: san 5 | provisioner: csi.trident.netapp.io 6 | parameters: 7 | backendType: "ontap-san" 8 | allowVolumeExpansion: true 9 | -------------------------------------------------------------------------------- /demo/k8s_files/sidecar-pod.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: sidecar-pod 5 | spec: 6 | restartPolicy: Never 7 | volumes: 8 | - name: shared-data 9 | persistentVolumeClaim: 10 | claimName: persistent-volume-claim-nas 11 | containers: 12 | 13 | - name: nginx-container 14 | image: nginx 15 | volumeMounts: 16 | - name: shared-data 17 | mountPath: /usr/share/nginx/html 18 | 19 | - name: debian-container 20 | image: debian 21 | volumeMounts: 22 | - name: shared-data 23 | mountPath: /pod-data 24 | command: ["/bin/sh"] 25 | args: 26 | - "-c" 27 | - > 28 | while true; do 29 | date >> /pod-data/index.html; 30 | echo Hello from the second container >> /pod-data/index.html; 31 | sleep 1; 32 | done 33 | -------------------------------------------------------------------------------- /demo/k8s_files/snap-datalake.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: snapshot.storage.k8s.io/v1beta1 2 | kind: VolumeSnapshot 3 | metadata: 4 | name: snap-datalake 5 | spec: 6 | volumeSnapshotClassName: csi-snapclass 7 | source: 8 | persistentVolumeClaimName: datalake -------------------------------------------------------------------------------- /demo/k8s_files/snap-sc.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: snapshot.storage.k8s.io/v1beta1 2 | kind: VolumeSnapshotClass 3 | metadata: 4 | name: csi-snapclass 5 | driver: csi.trident.netapp.io 6 | deletionPolicy: Delete -------------------------------------------------------------------------------- /demo/k8s_files/web-content-clone.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: PersistentVolumeClaim 3 | metadata: 4 | name: web-content-clone 5 | namespace: web 6 | spec: 7 | accessModes: 8 | - ReadWriteMany 9 | storageClassName: nas-silver 10 | -------------------------------------------------------------------------------- /demo/k8s_files/web-content-prod.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: PersistentVolumeClaim 3 | metadata: 4 | name: web-content-prod 5 | namespace: web 6 | spec: 7 | accessModes: 8 | - ReadWriteMany 9 | storageClassName: nas-silver 10 | -------------------------------------------------------------------------------- /demo/k8s_files/web-dev.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: web-dev 5 | spec: 6 | ports: 7 | - port: 80 8 | name: web 9 | protocol: TCP 10 | targetPort: 80 11 | type: LoadBalancer 12 | selector: 13 | app: web-dev 14 | --- 15 | apiVersion: apps/v1 16 | metadata: 17 | name: web-dev 18 | labels: 19 | app: web-dev 20 | kind: StatefulSet 21 | spec: 22 | serviceName: web-service-dev 23 | replicas: 1 24 | selector: 25 | matchLabels: 26 | app: web-dev 27 | template: 28 | metadata: 29 | labels: 30 | app: web-dev 31 | spec: 32 | containers: 33 | - name: nginx 34 | image: nginx:1.8 35 | volumeMounts: 36 | - name: my-pvc-nfs 37 | mountPath: /usr/share/nginx/html 38 | ports: 39 | - containerPort: 80 40 | name: web-dev 41 | volumes: 42 | - name: my-pvc-nfs 43 | persistentVolumeClaim: 44 | claimName: web-content-clone 45 | -------------------------------------------------------------------------------- /demo/k8s_files/web-prod.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: web-prod 5 | spec: 6 | ports: 7 | - port: 80 8 | name: web 9 | protocol: TCP 10 | targetPort: 80 11 | type: LoadBalancer 12 | selector: 13 | app: web-prod 14 | --- 15 | apiVersion: apps/v1 16 | metadata: 17 | name: web-prod 18 | labels: 19 | app: web-prod 20 | kind: StatefulSet 21 | spec: 22 | serviceName: web-service-prod 23 | replicas: 1 24 | selector: 25 | matchLabels: 26 | app: web-prod 27 | template: 28 | metadata: 29 | labels: 30 | app: web-prod 31 | spec: 32 | containers: 33 | - name: nginx 34 | image: nginx:1.8 35 | volumeMounts: 36 | - name: my-pvc-nfs 37 | mountPath: /usr/share/nginx/html 38 | ports: 39 | - containerPort: 80 40 | name: web-prod 41 | volumes: 42 | - name: my-pvc-nfs 43 | persistentVolumeClaim: 44 | claimName: web-content-prod 45 | -------------------------------------------------------------------------------- /making/01_prepare_k8s_servers.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "#######################################################################################################" 4 | echo "Download the last Trident package and GitHub Demo Trident repository" 5 | echo "#######################################################################################################" 6 | 7 | wget https://github.com/NetApp/trident/releases/download/v20.04.0/trident-installer-20.04.0.tar.gz 8 | tar -xf trident-installer-20.04.0.tar.gz 9 | git clone https://github.com/pablogarciaarevalo/demo-trident 10 | chmod 744 * demo-trident/demo/*.sh 11 | 12 | echo "#######################################################################################################" 13 | echo "Setting net.bridge.bridge-nf-call-iptables to 1" 14 | echo "#######################################################################################################" 15 | 16 | cat < /etc/sysctl.d/k8s.conf 17 | net.bridge.bridge-nf-call-ip6tables = 1 18 | net.bridge.bridge-nf-call-iptables = 1 19 | EOF 20 | sysctl -p 21 | echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables 22 | 23 | echo "#######################################################################################################" 24 | echo "Disabling swap" 25 | echo "#######################################################################################################" 26 | 27 | swapoff -a 28 | cat < /etc/fstab 29 | # 30 | # /etc/fstab 31 | # Created by anaconda on Tue Jun 16 18:54:04 2015 32 | # 33 | # Accessible filesystems, by reference, are maintained under '/dev/disk' 34 | # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 35 | # 36 | /dev/mapper/rhel-root / xfs defaults 0 0 37 | UUID=69278624-810b-4c7a-97e4-9d236b939b2a /boot xfs defaults 0 0 38 | #/dev/mapper/rhel-swap swap swap defaults 0 0 39 | /dev/sdb1 /var/lib/docker xfs defaults 0 0 40 | 192.168.0.132:/web_content /mnt/web_content nfs defaults 0 0 41 | EOF 42 | 43 | echo "#######################################################################################################" 44 | echo "Enabling the Kubernetes repository" 45 | echo "#######################################################################################################" 46 | 47 | cat < /etc/yum.repos.d/kubernetes.repo 48 | [kubernetes] 49 | name=Kubernetes 50 | baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 51 | enabled=1 52 | gpgcheck=1 53 | repo_gpgcheck=1 54 | gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg 55 | EOF 56 | 57 | echo "#######################################################################################################" 58 | echo "Setting the Trident path" 59 | echo "#######################################################################################################" 60 | 61 | cat < ~/.bash_profile 62 | # .bash_profile 63 | 64 | # Get the aliases and functions 65 | if [ -f ~/.bashrc ]; then 66 | . ~/.bashrc 67 | fi 68 | 69 | # User specific environment and startup programs 70 | 71 | PATH=$PATH:$HOME/bin 72 | PATH="/root/trident-installer:$PATH" 73 | 74 | export PATH 75 | EOF 76 | 77 | echo "#######################################################################################################" 78 | echo "Installing kubelet, kubeadm and kubectl" 79 | echo "#######################################################################################################" 80 | 81 | yum -y install kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 --nogpgcheck 82 | -------------------------------------------------------------------------------- /making/02_init_k8s_master.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "#######################################################################################################" 3 | echo "kubeadm init in the k8s master node" 4 | echo "#######################################################################################################" 5 | 6 | systemctl enable kubelet && systemctl start kubelet 7 | kubeadm init --token abcdef.0123456789abcdef 8 | mkdir -p $HOME/.kube 9 | sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 10 | sudo chown $(id -u):$(id -g) $HOME/.kube/config 11 | -------------------------------------------------------------------------------- /making/03_join_k8s_workers.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "#######################################################################################################" 3 | echo "kubeadm join in the k8s worker node" 4 | echo "#######################################################################################################" 5 | 6 | systemctl daemon-reload && systemctl start kubelet 7 | kubeadm reset -f 8 | kubeadm join 192.168.0.64:6443 --token abcdef.0123456789abcdef --discovery-token-unsafe-skip-ca-verification 9 | 10 | -------------------------------------------------------------------------------- /making/04_configure_k8s_cluster.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "#######################################################################################################" 3 | echo "Installing weave for the kubernetes network" 4 | echo "#######################################################################################################" 5 | 6 | export kubever=$(kubectl version | base64 | tr -d '\n') 7 | kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever" 8 | 9 | echo "#######################################################################################################" 10 | echo "Waiting 30 seconds to allow the weave pods start properly" 11 | echo "#######################################################################################################" 12 | 13 | sleep 30s 14 | 15 | echo "#######################################################################################################" 16 | echo "Install and create a metallb configuration" 17 | echo "#######################################################################################################" 18 | 19 | kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.8.3/manifests/metallb.yaml 20 | kubectl apply -f demo-trident/making/k8s_files/metailb-configmap-k8s-dev.yaml 21 | 22 | echo "#######################################################################################################" 23 | echo "Installing Trident" 24 | echo "#######################################################################################################" 25 | 26 | kubectl create ns trident 27 | tridentctl install -n trident 28 | 29 | echo "#######################################################################################################" 30 | echo "Create K8S backend y Storage class" 31 | echo "#######################################################################################################" 32 | 33 | tridentctl create backend --filename demo-trident/demo/k8s_files/backend-nas.json -n trident 34 | kubectl apply -f demo-trident/demo/k8s_files/sc-nas-silver.yaml 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /making/ansible_files/datalake.yaml: -------------------------------------------------------------------------------- 1 | # Create a volume for the website 2 | 3 | - name: Create a volume for the website 4 | hosts: localhost 5 | gather_facts: no 6 | connection: local 7 | 8 | vars: 9 | netapp_hostname: 192.168.0.101 10 | netapp_username: admin 11 | netapp_password: Netapp1! 12 | source_volume_to_protect: 13 | tasks: 14 | - name: Create FlexVol 15 | na_ontap_volume: 16 | state: present 17 | name: datalake 18 | is_infinite: False 19 | aggregate_name: aggr2 20 | space_guarantee: none 21 | size: 1 22 | size_unit: tb 23 | vserver: svm1 24 | junction_path: /data_lake 25 | snapshot_policy: none 26 | hostname: "{{ netapp_hostname }}" 27 | username: "{{ netapp_username }}" 28 | password: "{{ netapp_password }}" 29 | https: true 30 | validate_certs: false 31 | -------------------------------------------------------------------------------- /making/ansible_files/legacy-website.yaml: -------------------------------------------------------------------------------- 1 | # Create a volume for the website 2 | 3 | - name: Create a volume for the website 4 | hosts: localhost 5 | gather_facts: no 6 | connection: local 7 | 8 | vars: 9 | netapp_hostname: 192.168.0.101 10 | netapp_username: admin 11 | netapp_password: Netapp1! 12 | source_volume_to_protect: 13 | tasks: 14 | - name: Create FlexVol 15 | na_ontap_volume: 16 | state: present 17 | name: web_content 18 | is_infinite: False 19 | aggregate_name: aggr2 20 | space_guarantee: none 21 | size: 1 22 | size_unit: tb 23 | vserver: svm1 24 | junction_path: /web_content 25 | snapshot_policy: none 26 | hostname: "{{ netapp_hostname }}" 27 | username: "{{ netapp_username }}" 28 | password: "{{ netapp_password }}" 29 | https: true 30 | validate_certs: false 31 | 32 | # Mount the website volume 33 | - name: Mount the website volume 34 | hosts: 35 | rhel6 36 | tasks: 37 | - name: Update fstab file 38 | lineinfile: 39 | path: /etc/fstab 40 | line: "192.168.0.132:/web_content /mnt/web_content nfs defaults 0 0" 41 | - name: Verify mount directory exists 42 | file: 43 | path: /mnt/web_content 44 | state: directory 45 | - name: Mount nfs export 46 | mount: 47 | state: mounted 48 | path: /mnt/web_content 49 | src: 192.168.0.132:/web_content 50 | fstype: nfs 51 | -------------------------------------------------------------------------------- /making/k8s_files/metailb-configmap-k8s-dev.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | namespace: metallb-system 5 | name: config 6 | data: 7 | config: | 8 | address-pools: 9 | - name: default 10 | protocol: layer2 11 | addresses: 12 | - 192.168.0.150-192.168.0.159 13 | -------------------------------------------------------------------------------- /making/k8s_files/metailb-configmap-k8s-prod.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | namespace: metallb-system 5 | name: config 6 | data: 7 | config: | 8 | address-pools: 9 | - name: default 10 | protocol: layer2 11 | addresses: 12 | - 192.168.0.140-192.168.0.149 13 | -------------------------------------------------------------------------------- /making/monitoring/grafana/cm-grafana-datasources.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: cm-grafana-datasources 5 | namespace: monitoring 6 | data: 7 | datasource.yaml: | 8 | apiVersion: 1 9 | datasources: 10 | - name: Prometheus 11 | type: prometheus 12 | url: http://192.168.0.140/ 13 | access: proxy 14 | isDefault: true -------------------------------------------------------------------------------- /making/monitoring/grafana/dashboards/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/monitoring/grafana/dashboards/.DS_Store -------------------------------------------------------------------------------- /making/monitoring/grafana/deployment-prom-operator-grafana.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | annotations: 5 | deployment.kubernetes.io/revision: "3" 6 | creationTimestamp: "2020-03-24T14:31:13Z" 7 | generation: 3 8 | labels: 9 | app.kubernetes.io/instance: prom-operator 10 | app.kubernetes.io/managed-by: Helm 11 | app.kubernetes.io/name: grafana 12 | app.kubernetes.io/version: 6.6.2 13 | helm.sh/chart: grafana-5.0.5 14 | name: prom-operator-grafana 15 | namespace: monitoring 16 | resourceVersion: "707599" 17 | selfLink: /apis/apps/v1/namespaces/monitoring/deployments/prom-operator-grafana 18 | uid: 1265e5cf-423b-4a3d-aef8-b27ccb1fad2f 19 | spec: 20 | progressDeadlineSeconds: 600 21 | replicas: 1 22 | revisionHistoryLimit: 10 23 | selector: 24 | matchLabels: 25 | app.kubernetes.io/instance: prom-operator 26 | app.kubernetes.io/name: grafana 27 | strategy: 28 | rollingUpdate: 29 | maxSurge: 25% 30 | maxUnavailable: 25% 31 | type: RollingUpdate 32 | template: 33 | metadata: 34 | annotations: 35 | checksum/config: dc3d35996a531f35239e457bd5ff1f924af21c79d62545e92ed44a2863eb6506 36 | checksum/dashboards-json-config: 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b 37 | checksum/sc-dashboard-provider-config: bfbde80c1d42145d7ca8e6222ac26dd3c0d388c7cb9b22ea57773a2d5f30895e 38 | checksum/secret: fb4644c8fc57451f545934bed5f96ab0d67bf34a1685b9c01acb1b0b9ab38859 39 | creationTimestamp: null 40 | labels: 41 | app.kubernetes.io/instance: prom-operator 42 | app.kubernetes.io/name: grafana 43 | spec: 44 | containers: 45 | - env: 46 | - name: METHOD 47 | value: WATCH 48 | - name: LABEL 49 | value: grafana_dashboard 50 | - name: FOLDER 51 | value: /tmp/dashboards 52 | - name: RESOURCE 53 | value: both 54 | image: kiwigrid/k8s-sidecar:0.1.99 55 | imagePullPolicy: IfNotPresent 56 | name: grafana-sc-dashboard 57 | resources: {} 58 | terminationMessagePath: /dev/termination-log 59 | terminationMessagePolicy: File 60 | volumeMounts: 61 | - mountPath: /tmp/dashboards 62 | name: sc-dashboard-volume 63 | - env: 64 | - name: METHOD 65 | value: WATCH 66 | - name: LABEL 67 | value: grafana_datasource 68 | - name: FOLDER 69 | value: /etc/grafana/provisioning/datasources 70 | - name: RESOURCE 71 | value: both 72 | image: kiwigrid/k8s-sidecar:0.1.99 73 | imagePullPolicy: IfNotPresent 74 | name: grafana-sc-datasources 75 | resources: {} 76 | terminationMessagePath: /dev/termination-log 77 | terminationMessagePolicy: File 78 | volumeMounts: 79 | - mountPath: /etc/grafana/provisioning/datasources 80 | name: sc-datasources-volume 81 | - env: 82 | - name: GF_SECURITY_ADMIN_USER 83 | valueFrom: 84 | secretKeyRef: 85 | key: admin-user 86 | name: prom-operator-grafana 87 | - name: GF_SECURITY_ADMIN_PASSWORD 88 | valueFrom: 89 | secretKeyRef: 90 | key: admin-password 91 | name: prom-operator-grafana 92 | image: grafana/grafana:6.6.2 93 | imagePullPolicy: IfNotPresent 94 | livenessProbe: 95 | failureThreshold: 10 96 | httpGet: 97 | path: /api/health 98 | port: 3000 99 | scheme: HTTP 100 | initialDelaySeconds: 60 101 | periodSeconds: 10 102 | successThreshold: 1 103 | timeoutSeconds: 30 104 | name: grafana 105 | ports: 106 | - containerPort: 80 107 | name: service 108 | protocol: TCP 109 | - containerPort: 3000 110 | name: grafana 111 | protocol: TCP 112 | readinessProbe: 113 | failureThreshold: 3 114 | httpGet: 115 | path: /api/health 116 | port: 3000 117 | scheme: HTTP 118 | periodSeconds: 10 119 | successThreshold: 1 120 | timeoutSeconds: 1 121 | resources: {} 122 | terminationMessagePath: /dev/termination-log 123 | terminationMessagePolicy: File 124 | volumeMounts: 125 | - mountPath: /etc/grafana/grafana.ini 126 | name: config 127 | subPath: grafana.ini 128 | - mountPath: /var/lib/grafana 129 | name: storage 130 | - mountPath: /tmp/dashboards 131 | name: sc-dashboard-volume 132 | - mountPath: /etc/grafana/provisioning/dashboards/sc-dashboardproviders.yaml 133 | name: sc-dashboard-provider 134 | subPath: provider.yaml 135 | - mountPath: /etc/grafana/provisioning/datasources 136 | name: sc-datasources-volume 137 | dnsPolicy: ClusterFirst 138 | restartPolicy: Always 139 | schedulerName: default-scheduler 140 | securityContext: 141 | fsGroup: 472 142 | runAsUser: 472 143 | serviceAccount: prom-operator-grafana 144 | serviceAccountName: prom-operator-grafana 145 | terminationGracePeriodSeconds: 30 146 | volumes: 147 | - configMap: 148 | defaultMode: 420 149 | name: prom-operator-grafana 150 | name: config 151 | - emptyDir: {} 152 | name: storage 153 | - configMap: 154 | defaultMode: 420 155 | name: cm-grafana-dashboard 156 | name: sc-dashboard-volume 157 | - configMap: 158 | defaultMode: 420 159 | name: prom-operator-grafana-config-dashboards 160 | name: sc-dashboard-provider 161 | - configMap: 162 | defaultMode: 420 163 | name: cm-grafana-datasources 164 | name: sc-datasources-volume -------------------------------------------------------------------------------- /making/monitoring/grafana/service-prom-operator-grafana.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | labels: 5 | app.kubernetes.io/instance: prom-operator 6 | app.kubernetes.io/managed-by: Helm 7 | app.kubernetes.io/name: grafana 8 | app.kubernetes.io/version: 6.6.2 9 | helm.sh/chart: grafana-5.0.5 10 | name: prom-operator-grafana 11 | namespace: monitoring 12 | spec: 13 | ports: 14 | - name: service 15 | port: 80 16 | protocol: TCP 17 | targetPort: 3000 18 | selector: 19 | app.kubernetes.io/instance: prom-operator 20 | app.kubernetes.io/name: grafana 21 | sessionAffinity: None 22 | type: LoadBalancer -------------------------------------------------------------------------------- /making/monitoring/prometheus/prometheus-datasource.yaml: -------------------------------------------------------------------------------- 1 | { 2 | "apiVersion": 1, 3 | "datasources": [{ 4 | "access": "proxy", 5 | "editable": false, 6 | "name": "prometheus", 7 | "orgId": 1, 8 | "type": "prometheus", 9 | "url": "http://192.168.0.140", 10 | "version": 1 11 | }] 12 | } -------------------------------------------------------------------------------- /making/monitoring/prometheus/service-prom-operator-prometheus.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | labels: 5 | app: prometheus-operator-prometheus 6 | chart: prometheus-operator-8.12.3 7 | heritage: Helm 8 | release: prom-operator 9 | self-monitor: "true" 10 | name: prom-operator-prometheus-o-prometheus 11 | namespace: monitoring 12 | spec: 13 | ports: 14 | - name: web 15 | port: 80 16 | protocol: TCP 17 | targetPort: 9090 18 | selector: 19 | app: prometheus 20 | prometheus: prom-operator-prometheus-o-prometheus 21 | sessionAffinity: None 22 | type: LoadBalancer -------------------------------------------------------------------------------- /making/monitoring/prometheus/servicemonitor.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: monitoring.coreos.com/v1 2 | kind: ServiceMonitor 3 | metadata: 4 | name: trident-sm 5 | namespace: monitoring 6 | labels: 7 | release: prom-operator 8 | spec: 9 | jobLabel: trident 10 | selector: 11 | matchLabels: 12 | app: controller.csi.trident.netapp.io 13 | namespaceSelector: 14 | matchNames: 15 | - trident 16 | endpoints: 17 | - port: metrics 18 | interval: 15s -------------------------------------------------------------------------------- /making/netapp_website/v1/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v1/.DS_Store -------------------------------------------------------------------------------- /making/netapp_website/v1/Network Appliance - The Multiprotocol File Server (Unix, Windows, HTTP)_files/Q2ndmp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v1/Network Appliance - The Multiprotocol File Server (Unix, Windows, HTTP)_files/Q2ndmp.gif -------------------------------------------------------------------------------- /making/netapp_website/v1/Network Appliance - The Multiprotocol File Server (Unix, Windows, HTTP)_files/banner-styles.css: -------------------------------------------------------------------------------- 1 | @import 'record.css'; /* for SPN1 */ 2 | 3 | #wm-ipp-base { 4 | min-height:65px; 5 | padding:0; 6 | margin:0; 7 | border:none; 8 | background:none transparent; 9 | } 10 | #wm-ipp { 11 | z-index: 2147483640; 12 | } 13 | #wm-ipp, #wm-ipp * { 14 | font-family:Lucida Grande, Helvetica, Arial, sans-serif; 15 | font-size:12px; 16 | line-height:1.2; 17 | letter-spacing:0; 18 | width:auto; 19 | height:auto; 20 | max-width:none; 21 | max-height:none; 22 | min-width:0 !important; 23 | min-height:0; 24 | outline:none; 25 | float:none; 26 | text-align:left; 27 | border:none; 28 | color: #000; 29 | text-indent: 0; 30 | position: initial; 31 | background: none; 32 | } 33 | #wm-ipp div, #wm-ipp canvas { 34 | display: block; 35 | } 36 | #wm-ipp div, #wm-ipp tr, #wm-ipp td, #wm-ipp a, #wm-ipp form { 37 | padding:0; 38 | margin:0; 39 | border:none; 40 | border-radius:0; 41 | background-color:transparent; 42 | background-image:none; 43 | /*z-index:2147483640;*/ 44 | height:auto; 45 | } 46 | #wm-ipp table { 47 | border:none; 48 | border-collapse:collapse; 49 | margin:0; 50 | padding:0; 51 | width:auto; 52 | font-size:inherit; 53 | } 54 | #wm-ipp form input { 55 | padding:1px !important; 56 | height:auto; 57 | display:inline; 58 | margin:0; 59 | color: #000; 60 | background: none #fff; 61 | border: 1px solid #666; 62 | } 63 | #wm-ipp form input[type=submit] { 64 | padding:0 8px !important; 65 | margin:1px 0 1px 5px !important; 66 | width:auto !important; 67 | border: 1px solid #000 !important; 68 | background: #fff !important; 69 | color: #000 !important; 70 | } 71 | #wm-ipp a { 72 | display: inline; 73 | } 74 | #wm-ipp a:hover{ 75 | text-decoration:underline; 76 | } 77 | #wm-ipp a.wm-btn:hover { 78 | text-decoration:none; 79 | color:#ff0 !important; 80 | } 81 | #wm-ipp a.wm-btn:hover span { 82 | color:#ff0 !important; 83 | } 84 | #wm-ipp #wm-ipp-inside { 85 | margin: 0 6px; 86 | border:5px solid #000; 87 | border-top:none; 88 | background-color:rgba(255,255,255,0.9); 89 | -moz-box-shadow:1px 1px 4px #333; 90 | -webkit-box-shadow:1px 1px 4px #333; 91 | box-shadow:1px 1px 4px #333; 92 | border-radius:0 0 8px 8px; 93 | } 94 | /* selectors are intentionally verbose to ensure priority */ 95 | #wm-ipp #wm-logo { 96 | padding:0 10px; 97 | vertical-align:middle; 98 | min-width:110px; 99 | width:15%; 100 | } 101 | #wm-ipp table tr::before, #wm-ipp table tr::after { 102 | margin: 0; 103 | height: auto; 104 | } 105 | #wm-ipp table.c { 106 | vertical-align:top; 107 | margin-left: 4px; 108 | } 109 | #wm-ipp table.c td { 110 | border:none !important; 111 | } 112 | #wm-ipp .c td.u { 113 | padding:3px 0 !important; 114 | text-align:center; 115 | } 116 | #wm-ipp .c td.n { 117 | padding:0 0 0 5px !important; 118 | vertical-align: bottom; 119 | } 120 | #wm-ipp .c td.n a { 121 | text-decoration:none; 122 | color:#33f; 123 | font-weight:bold; 124 | } 125 | #wm-ipp .c td.n td.b { 126 | padding:0 6px 0 0 !important; 127 | text-align:right !important; 128 | overflow:visible; 129 | white-space:nowrap; 130 | color:#99a; 131 | vertical-align:middle; 132 | } 133 | #wm-ipp .c td.n tr.y td.b { 134 | padding:0 6px 2px 0 !important; 135 | } 136 | #wm-ipp .c td.n td.c { 137 | background:#000; 138 | color:#ff0; 139 | font-weight:bold; 140 | padding:0 !important; 141 | text-align:center; 142 | } 143 | #wm-ipp.hi .c td.n td.c { 144 | color:#ec008c; 145 | } 146 | #wm-ipp .c td.n td.f { 147 | padding:0 0 0 6px !important; 148 | text-align:left !important; 149 | overflow:visible; 150 | white-space:nowrap; 151 | color:#99a; 152 | vertical-align:middle; 153 | } 154 | #wm-ipp .c td.n tr.m td { 155 | text-transform:uppercase; 156 | white-space:nowrap; 157 | padding:2px 0; 158 | } 159 | #wm-ipp .c td.s { 160 | padding:0 5px 0 0 !important; 161 | text-align:center; 162 | vertical-align:bottom; 163 | } 164 | #wm-ipp #wm-nav-captures { 165 | white-space: nowrap; 166 | } 167 | #wm-ipp .c td.s a.t { 168 | color:#33f; 169 | font-weight:bold; 170 | line-height: 1.8; 171 | } 172 | #wm-ipp .c td.s div.r { 173 | color: #666; 174 | font-size:9px; 175 | white-space:nowrap; 176 | } 177 | #wm-ipp .c td.k { 178 | vertical-align:bottom; 179 | padding-bottom:2px; 180 | } 181 | #wm-ipp .c td.s { 182 | padding:0 5px 2px 0 !important; 183 | } 184 | #wm-ipp td#displayMonthEl { 185 | padding: 2px 0 !important; 186 | } 187 | #wm-ipp td#displayYearEl { 188 | padding: 0 0 2px 0 !important; 189 | } 190 | 191 | div#wm-ipp-sparkline { 192 | position:relative;/* for positioning markers */ 193 | white-space:nowrap; 194 | background-color:#fff; 195 | cursor:pointer; 196 | line-height:0.9; 197 | } 198 | #sparklineImgId, #wm-sparkline-canvas { 199 | position:relative; 200 | z-index:9012; 201 | max-width:none; 202 | } 203 | #wm-ipp-sparkline div.yt { 204 | position:absolute; 205 | z-index:9010 !important; 206 | background-color:#ff0 !important; 207 | top: 0; 208 | } 209 | #wm-ipp-sparkline div.mt { 210 | position:absolute; 211 | z-index:9013 !important; 212 | background-color:#ec008c !important; 213 | top: 0; 214 | } 215 | #wm-ipp .r { 216 | position:relative; 217 | } 218 | #wm-ipp .r a { 219 | color:#33f; 220 | border:none; 221 | position:relative; 222 | background-color:transparent; 223 | background-repeat:no-repeat !important; 224 | background-position:100% 100% !important; 225 | text-decoration: none; 226 | } 227 | #wm-ipp #wm-capinfo .c-logo { 228 | display:block; 229 | float:left; 230 | margin-right:3px; 231 | width:90px; 232 | min-height:90px; 233 | max-height: 290px; 234 | border-radius:45px; 235 | overflow:hidden; 236 | background-position:50%; 237 | background-size:auto 90px; 238 | box-shadow: 0 0 2px 2px rgba(208,208,208,128) inset; 239 | } 240 | #wm-ipp #wm-capinfo .c-logo span { 241 | display:inline-block; 242 | } 243 | #wm-ipp #wm-capinfo .c-logo img { 244 | height:90px; 245 | position:relative; 246 | left:-50%; 247 | } 248 | #wm-ipp #wm-capinfo .wm-title { 249 | font-size:130%; 250 | } 251 | #wm-ipp #wm-capinfo a.wm-selector { 252 | display:inline-block; 253 | color: #aaa; 254 | text-decoration:none !important; 255 | padding: 2px 8px; 256 | } 257 | #wm-ipp #wm-capinfo a.wm-selector.selected { 258 | background-color:#666; 259 | } 260 | #wm-ipp #wm-capinfo a.wm-selector:hover { 261 | color: #fff; 262 | } 263 | #wm-ipp #wm-expand { 264 | right: 1px; 265 | bottom: -1px; 266 | color: #ffffff; 267 | background-color: #666 !important; 268 | padding:0 5px 0 3px !important; 269 | border-radius: 3px 3px 0 0 !important; 270 | } 271 | #wm-ipp #wm-expand span { 272 | color: #ffffff; 273 | } 274 | #wm-ipp #wm-expand #wm-expand-icon { 275 | display: inline-block; 276 | transition: transform 0.5s; 277 | transform-origin: 50% 45%; 278 | } 279 | #wm-ipp #wm-expand.wm-open #wm-expand-icon { 280 | transform: rotate(180deg); 281 | } 282 | #wm-ipp #wmtb { 283 | text-align:right; 284 | } 285 | #wm-ipp #wmtb #wmtbURL { 286 | width: calc(100% - 45px); 287 | } 288 | #wm-ipp #wm-graph-anchor { 289 | border-right:1px solid #ccc; 290 | } 291 | /* time coherence */ 292 | html.wb-highlight { 293 | box-shadow: inset 0 0 0 3px #a50e3a !important; 294 | } 295 | .wb-highlight { 296 | outline: 3px solid #a50e3a !important; 297 | } 298 | 299 | @media (min-width:946px) { 300 | #wm-ipp #wm-graph-anchor { 301 | display:block !important; 302 | } 303 | } 304 | @media (max-width:945px) { 305 | #wm-ipp #wm-graph-anchor { 306 | display:none !important; 307 | } 308 | #wm-ipp table.c { 309 | width: 85%; 310 | width: calc(100% - 131px); 311 | } 312 | } 313 | @media (max-width:1096px) { 314 | #wm-logo { 315 | display:none !important; 316 | } 317 | } 318 | 319 | #wm-btns { 320 | white-space: nowrap; 321 | } 322 | 323 | #wm-btns>#wm-save-snapshot-open { 324 | margin-right: 7px; 325 | top: -6px; 326 | } 327 | 328 | #wm-btns>#wm-sign-in { 329 | box-sizing: content-box; 330 | display: none; 331 | margin-right: 7px; 332 | top: -8px; 333 | 334 | /* 335 | round border around sign in button 336 | */ 337 | border: 2px #000 solid; 338 | border-radius: 14px; 339 | padding-right: 2px; 340 | padding-bottom: 2px; 341 | width: 11px; 342 | height: 11px; 343 | } 344 | 345 | #wm-btns>#wm-sign-in>.iconochive-person { 346 | font-size: 12.5px; 347 | } 348 | 349 | #wm-save-snapshot-open > .iconochive-web { 350 | color:#000; 351 | font-size:160%; 352 | } 353 | 354 | #wm-ipp #wm-share { 355 | display: flex; 356 | align-items: flex-end; 357 | justify-content: space-between; 358 | } 359 | 360 | #wm-share > #wm-screenshot { 361 | display: inline-block; 362 | margin-right: 3px; 363 | visibility: hidden; 364 | } 365 | 366 | #wm-screenshot > .iconochive-image { 367 | color:#000; 368 | font-size:160%; 369 | } 370 | 371 | #wm-btns>#wm-save-snapshot-in-progress { 372 | display: none; 373 | font-size:160%; 374 | opacity: 0.5; 375 | position: relative; 376 | margin-right: 7px; 377 | top: -5px; 378 | } 379 | 380 | #wm-btns>#wm-save-snapshot-success { 381 | display: none; 382 | color: green; 383 | position: relative; 384 | top: -7px; 385 | } 386 | 387 | #wm-btns>#wm-save-snapshot-fail { 388 | display: none; 389 | color: red; 390 | position: relative; 391 | top: -7px; 392 | } 393 | 394 | .wm-icon-screen-shot { 395 | background: url("../images/web-screenshot.svg") no-repeat !important; 396 | background-size: contain !important; 397 | width: 22px !important; 398 | height: 19px !important; 399 | 400 | display: inline-block; 401 | } 402 | -------------------------------------------------------------------------------- /making/netapp_website/v1/Network Appliance - The Multiprotocol File Server (Unix, Windows, HTTP)_files/bluebar2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v1/Network Appliance - The Multiprotocol File Server (Unix, Windows, HTTP)_files/bluebar2.gif -------------------------------------------------------------------------------- /making/netapp_website/v1/Network Appliance - The Multiprotocol File Server (Unix, Windows, HTTP)_files/buttons2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v1/Network Appliance - The Multiprotocol File Server (Unix, Windows, HTTP)_files/buttons2.gif -------------------------------------------------------------------------------- /making/netapp_website/v1/Network Appliance - The Multiprotocol File Server (Unix, Windows, HTTP)_files/graph-calc.js: -------------------------------------------------------------------------------- 1 | function getEventX(event) { 2 | var posx = 0; 3 | if (event.pageX || event.pageY) { 4 | posx = event.pageX; 5 | } 6 | else if (event.clientX || event.clientY) { 7 | posx = event.clientX + document.body.scrollLeft 8 | + document.documentElement.scrollLeft; 9 | } 10 | return posx; 11 | } 12 | function getElementX(obj) { 13 | var x = 0; 14 | if (obj.offsetParent) { 15 | do { 16 | x += obj.offsetLeft; 17 | } while (obj = obj.offsetParent); 18 | } 19 | return x; 20 | } 21 | function zeroPad(v, len) { 22 | v = v.toString(); 23 | return v.length >= len ? v : "00000000".substring(0, len - v.length) + v; 24 | } 25 | 26 | /** 27 | * Check if the difference between the max and the min non zero capture numbers 28 | * is larger than 3 orders of magnitude. If yes, we need to scale. 29 | **/ 30 | function capturegraph_scale_is_required(captures) { 31 | var max = 0; 32 | var min = 1000; 33 | for (var i = 0; i < captures.length; i++) { 34 | var year = captures[i]; 35 | max = Math.max(max, Math.max.apply(null, year[1])); 36 | min = Math.min(min, Math.min.apply(null, 37 | year[1].filter(Boolean))); 38 | } 39 | return (Math.log1p(max) - Math.log1p(min) > 3); 40 | } 41 | 42 | /** 43 | * Scale captugraph counts and max maxcount using log1p if necessary. 44 | */ 45 | function capturegraph_scale(captures) { 46 | var maxcount = 0; 47 | for (var i = 0; i < captures.length; i++) { 48 | maxcount = Math.max(maxcount, Math.max.apply(null, captures[i][1])); 49 | } 50 | if (capturegraph_scale_is_required(captures)) { 51 | var scaled = []; 52 | for (var i = 0; i < captures.length; i++) { 53 | var year = captures[i]; 54 | // XXX map may not be available on all platforms 55 | scaled.push([year[0], year[1].map(Math.log1p)]); 56 | } 57 | captures = scaled; 58 | maxcount = Math.log1p(maxcount); 59 | } 60 | return [captures, maxcount]; 61 | } 62 | 63 | /** 64 | * Draw years, highlight current year, draw capture frequency per month 65 | */ 66 | function sparkline(captures, width, height, canvas, start_year, 67 | cur_year, cur_month) { 68 | var ctx = canvas.getContext("2d"); 69 | if (!ctx) return; 70 | ctx.fillStyle = "#FFF"; 71 | var end_year = new Date().getUTCFullYear(); 72 | var year_width = width / (end_year - start_year + 1); 73 | 74 | var scaled = capturegraph_scale(captures.years); 75 | var years = scaled[0]; 76 | var maxcount = scaled[1]; 77 | 78 | var yscale = height / maxcount; 79 | 80 | function year_left(year) { 81 | return Math.ceil((year - start_year) * year_width) + 0.5; 82 | } 83 | 84 | if (cur_year >= start_year) { 85 | var x = year_left(cur_year); 86 | ctx.fillStyle = "#FFFFA5"; 87 | ctx.fillRect(x, 0, year_width, height); 88 | } 89 | for (var year = start_year; year <= end_year; year++) { 90 | var x = year_left(year); 91 | ctx.beginPath(); 92 | ctx.moveTo(x, 0); 93 | ctx.lineTo(x, height); 94 | ctx.lineWidth = 1; 95 | ctx.strokeStyle = "#CCC"; 96 | ctx.stroke(); 97 | } 98 | cur_month = parseInt(cur_month) - 1; 99 | var month_width = (year_width - 1) / 12; 100 | for (var i = 0; i < years.length; i++) { 101 | var year = years[i][0]; 102 | var months = years[i][1]; 103 | var left = year_left(year) + 1.0; 104 | for (var month = 0; month < 12; month++) { 105 | var count = months[month]; 106 | if (count > 0) { 107 | var h = Math.ceil(count * yscale); 108 | if (year == cur_year && month == cur_month) { 109 | ctx.fillStyle = "#EC008C"; 110 | } else { 111 | ctx.fillStyle = "#000"; 112 | } 113 | // must note that when I use width=Math.round(month_width+1), 114 | // the replay toolbar looks more accurate whereas the 115 | // bubble calendar looks somehow different. 116 | ctx.fillRect(Math.round(left), Math.ceil(height - h), 117 | Math.ceil(month_width), Math.round(h)); 118 | } 119 | left += month_width; 120 | } 121 | } 122 | } 123 | 124 | function clear_canvas(canvas_id) { 125 | var c = document.getElementById(canvas_id); 126 | if (!c || !c.getContext) return; 127 | var ctx = c.getContext("2d"); 128 | if (!ctx) return; 129 | ctx.clearRect(0, 0, c.width, c.height); 130 | } 131 | -------------------------------------------------------------------------------- /making/netapp_website/v1/Network Appliance - The Multiprotocol File Server (Unix, Windows, HTTP)_files/iconochive.css: -------------------------------------------------------------------------------- 1 | @font-face{font-family:'Iconochive-Regular';src:url('https://archive.org/includes/fonts/Iconochive-Regular.eot?-ccsheb');src:url('https://archive.org/includes/fonts/Iconochive-Regular.eot?#iefix-ccsheb') format('embedded-opentype'),url('https://archive.org/includes/fonts/Iconochive-Regular.woff?-ccsheb') format('woff'),url('https://archive.org/includes/fonts/Iconochive-Regular.ttf?-ccsheb') format('truetype'),url('https://archive.org/includes/fonts/Iconochive-Regular.svg?-ccsheb#Iconochive-Regular') format('svg');font-weight:normal;font-style:normal} 2 | [class^="iconochive-"],[class*=" iconochive-"]{font-family:'Iconochive-Regular'!important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale} 3 | .iconochive-Uplevel:before{content:"\21b5"} 4 | .iconochive-exit:before{content:"\1f6a3"} 5 | .iconochive-beta:before{content:"\3b2"} 6 | .iconochive-logo:before{content:"\1f3db"} 7 | .iconochive-audio:before{content:"\1f568"} 8 | .iconochive-movies:before{content:"\1f39e"} 9 | .iconochive-software:before{content:"\1f4be"} 10 | .iconochive-texts:before{content:"\1f56e"} 11 | .iconochive-etree:before{content:"\1f3a4"} 12 | .iconochive-image:before{content:"\1f5bc"} 13 | .iconochive-web:before{content:"\1f5d4"} 14 | .iconochive-collection:before{content:"\2211"} 15 | .iconochive-folder:before{content:"\1f4c2"} 16 | .iconochive-data:before{content:"\1f5c3"} 17 | .iconochive-tv:before{content:"\1f4fa"} 18 | .iconochive-article:before{content:"\1f5cf"} 19 | .iconochive-question:before{content:"\2370"} 20 | .iconochive-question-dark:before{content:"\3f"} 21 | .iconochive-info:before{content:"\69"} 22 | .iconochive-info-small:before{content:"\24d8"} 23 | .iconochive-comment:before{content:"\1f5e9"} 24 | .iconochive-comments:before{content:"\1f5ea"} 25 | .iconochive-person:before{content:"\1f464"} 26 | .iconochive-people:before{content:"\1f465"} 27 | .iconochive-eye:before{content:"\1f441"} 28 | .iconochive-rss:before{content:"\221e"} 29 | .iconochive-time:before{content:"\1f551"} 30 | .iconochive-quote:before{content:"\275d"} 31 | .iconochive-disc:before{content:"\1f4bf"} 32 | .iconochive-tv-commercial:before{content:"\1f4b0"} 33 | .iconochive-search:before{content:"\1f50d"} 34 | .iconochive-search-star:before{content:"\273d"} 35 | .iconochive-tiles:before{content:"\229e"} 36 | .iconochive-list:before{content:"\21f6"} 37 | .iconochive-list-bulleted:before{content:"\2317"} 38 | .iconochive-latest:before{content:"\2208"} 39 | .iconochive-left:before{content:"\2c2"} 40 | .iconochive-right:before{content:"\2c3"} 41 | .iconochive-left-solid:before{content:"\25c2"} 42 | .iconochive-right-solid:before{content:"\25b8"} 43 | .iconochive-up-solid:before{content:"\25b4"} 44 | .iconochive-down-solid:before{content:"\25be"} 45 | .iconochive-dot:before{content:"\23e4"} 46 | .iconochive-dots:before{content:"\25a6"} 47 | .iconochive-columns:before{content:"\25af"} 48 | .iconochive-sort:before{content:"\21d5"} 49 | .iconochive-atoz:before{content:"\1f524"} 50 | .iconochive-ztoa:before{content:"\1f525"} 51 | .iconochive-upload:before{content:"\1f4e4"} 52 | .iconochive-download:before{content:"\1f4e5"} 53 | .iconochive-favorite:before{content:"\2605"} 54 | .iconochive-heart:before{content:"\2665"} 55 | .iconochive-play:before{content:"\25b6"} 56 | .iconochive-play-framed:before{content:"\1f3ac"} 57 | .iconochive-fullscreen:before{content:"\26f6"} 58 | .iconochive-mute:before{content:"\1f507"} 59 | .iconochive-unmute:before{content:"\1f50a"} 60 | .iconochive-share:before{content:"\1f381"} 61 | .iconochive-edit:before{content:"\270e"} 62 | .iconochive-reedit:before{content:"\2710"} 63 | .iconochive-gear:before{content:"\2699"} 64 | .iconochive-remove-circle:before{content:"\274e"} 65 | .iconochive-plus-circle:before{content:"\1f5d6"} 66 | .iconochive-minus-circle:before{content:"\1f5d5"} 67 | .iconochive-x:before{content:"\1f5d9"} 68 | .iconochive-fork:before{content:"\22d4"} 69 | .iconochive-trash:before{content:"\1f5d1"} 70 | .iconochive-warning:before{content:"\26a0"} 71 | .iconochive-flash:before{content:"\1f5f2"} 72 | .iconochive-world:before{content:"\1f5fa"} 73 | .iconochive-lock:before{content:"\1f512"} 74 | .iconochive-unlock:before{content:"\1f513"} 75 | .iconochive-twitter:before{content:"\1f426"} 76 | .iconochive-facebook:before{content:"\66"} 77 | .iconochive-googleplus:before{content:"\67"} 78 | .iconochive-reddit:before{content:"\1f47d"} 79 | .iconochive-tumblr:before{content:"\54"} 80 | .iconochive-pinterest:before{content:"\1d4df"} 81 | .iconochive-popcorn:before{content:"\1f4a5"} 82 | .iconochive-email:before{content:"\1f4e7"} 83 | .iconochive-embed:before{content:"\1f517"} 84 | .iconochive-gamepad:before{content:"\1f579"} 85 | .iconochive-Zoom_In:before{content:"\2b"} 86 | .iconochive-Zoom_Out:before{content:"\2d"} 87 | .iconochive-RSS:before{content:"\1f4e8"} 88 | .iconochive-Light_Bulb:before{content:"\1f4a1"} 89 | .iconochive-Add:before{content:"\2295"} 90 | .iconochive-Tab_Activity:before{content:"\2318"} 91 | .iconochive-Forward:before{content:"\23e9"} 92 | .iconochive-Backward:before{content:"\23ea"} 93 | .iconochive-No_Audio:before{content:"\1f508"} 94 | .iconochive-Pause:before{content:"\23f8"} 95 | .iconochive-No_Favorite:before{content:"\2606"} 96 | .iconochive-Unike:before{content:"\2661"} 97 | .iconochive-Song:before{content:"\266b"} 98 | .iconochive-No_Flag:before{content:"\2690"} 99 | .iconochive-Flag:before{content:"\2691"} 100 | .iconochive-Done:before{content:"\2713"} 101 | .iconochive-Check:before{content:"\2714"} 102 | .iconochive-Refresh:before{content:"\27f3"} 103 | .iconochive-Headphones:before{content:"\1f3a7"} 104 | .iconochive-Chart:before{content:"\1f4c8"} 105 | .iconochive-Bookmark:before{content:"\1f4d1"} 106 | .iconochive-Documents:before{content:"\1f4da"} 107 | .iconochive-Newspaper:before{content:"\1f4f0"} 108 | .iconochive-Podcast:before{content:"\1f4f6"} 109 | .iconochive-Radio:before{content:"\1f4fb"} 110 | .iconochive-Cassette:before{content:"\1f4fc"} 111 | .iconochive-Shuffle:before{content:"\1f500"} 112 | .iconochive-Loop:before{content:"\1f501"} 113 | .iconochive-Low_Audio:before{content:"\1f509"} 114 | .iconochive-First:before{content:"\1f396"} 115 | .iconochive-Invisible:before{content:"\1f576"} 116 | .iconochive-Computer:before{content:"\1f5b3"} 117 | -------------------------------------------------------------------------------- /making/netapp_website/v1/Network Appliance - The Multiprotocol File Server (Unix, Windows, HTTP)_files/info2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v1/Network Appliance - The Multiprotocol File Server (Unix, Windows, HTTP)_files/info2.gif -------------------------------------------------------------------------------- /making/netapp_website/v1/Network Appliance - The Multiprotocol File Server (Unix, Windows, HTTP)_files/mainbanner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v1/Network Appliance - The Multiprotocol File Server (Unix, Windows, HTTP)_files/mainbanner.jpg -------------------------------------------------------------------------------- /making/netapp_website/v1/Network Appliance - The Multiprotocol File Server (Unix, Windows, HTTP)_files/timestamp.js: -------------------------------------------------------------------------------- 1 | /** timestamp namespaced methods **/ 2 | var __wbTs = (function() { 3 | function _split_timestamp(timestamp) { 4 | if(typeof timestamp == "number") { 5 | timestamp = timestamp.toString(); 6 | } 7 | return [ 8 | timestamp.slice(-14, -10), 9 | timestamp.slice(-10, -8), 10 | timestamp.slice(-8, -6), 11 | timestamp.slice(-6, -4), 12 | timestamp.slice(-4, -2), 13 | timestamp.slice(-2) 14 | ]; 15 | } 16 | var MONTHS_LONG = [ 17 | "January", "February", "March", "April", "May", "June", 18 | "July", "August", "September", "October", "November", "December" 19 | ]; 20 | var MONTHS_SHORT = [ 21 | "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", 22 | "Oct", "Nov", "Dec" 23 | ]; 24 | var FIELDS = { 25 | 'Y': function(d) { return d.getUTCFullYear() }, 26 | 'm': function(d) { return d.getUTCMonth() + 1 }, 27 | 'b': function(d) { return MONTHS_SHORT[d.getUTCMonth()] }, 28 | 'B': function(d) { return MONTHS_LONG[d.getUTCMonth()] }, 29 | 'd': function(d) { return d.getUTCDate() }, 30 | 'H': function(d) { return ('0'+d.getUTCHours()).slice(-2) }, 31 | 'M': function(d) { return ('0'+d.getUTCMinutes()).slice(-2) }, 32 | 'S': function(d) { return ('0'+d.getUTCSeconds()).slice(-2) }, 33 | '%': function() { return '%' } 34 | }; 35 | function timestamp2datetime(timestamp) { 36 | var ts_array = _split_timestamp(timestamp); 37 | return new Date(Date.UTC( 38 | ts_array[0], ts_array[1]-1, ts_array[2], 39 | ts_array[3], ts_array[4], ts_array[5] 40 | )); 41 | } 42 | return { 43 | timestamp2datetime: timestamp2datetime, 44 | getMonthName: function(mon) { 45 | return MONTHS_LONG[mon]; 46 | }, 47 | format: function(timestamp, fmt) { 48 | return fmt.replace(/%./g, function(ph) { 49 | var field = FIELDS[ph[1]]; 50 | return field ? field(timestamp2datetime(timestamp)) : ph; 51 | }); 52 | } 53 | } 54 | })(); 55 | -------------------------------------------------------------------------------- /making/netapp_website/v1/Network Appliance - The Multiprotocol File Server (Unix, Windows, HTTP)_files/wbhack.js: -------------------------------------------------------------------------------- 1 | // Wayback Machine hacks 2 | var __wbhack = new function(){ 3 | var prefix; 4 | var orig_document = { 5 | createElementNS: document.createElementNS 6 | }; 7 | this.init = function(_prefix) { 8 | this.checkCookiesNumber(); 9 | prefix = _prefix; 10 | document.createElementNS = function(ns,name) { 11 | if (ns.indexOf(prefix)==0) { 12 | ns = ns.substring(prefix.length).replace(/\/?[0-9]+\//, ''); 13 | } 14 | return orig_document.createElementNS.call(this, ns, name); 15 | }; 16 | }; 17 | this.createCookie = function(name,value,days) { 18 | if (days) { 19 | var date = new Date(); 20 | date.setTime(date.getTime()+(days*24*60*60*1000)); 21 | var expires = "; expires="+date.toGMTString(); 22 | } 23 | else var expires = ""; 24 | document.cookie = name+"="+value+expires+"; path=/"; 25 | }; 26 | this.eraseCookie = function(name) { 27 | this.createCookie(name, "", -1); 28 | }; 29 | this.checkCookiesNumber = function() { 30 | var cookies = document.cookie.split(";"); 31 | if(cookies.length > 40) { 32 | for(var i=0; i 3 | 4 | 5 | 8 | 9 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | Network Appliance - The Multiprotocol File Server (Unix, Windows, HTTP) 24 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 |
49 |
50 | 51 | 52 | 53 | Network Appliance: The Filer Company 54 | 55 |
56 | 57 |

58 | 59 | 60 | 61 | 66 | 71 | 72 |
62 | 63 | Navigational Buttons 64 | 65 | 67 | 68 | New Product Announcement 69 | 70 |
73 | 74 | 75 | 76 |
77 | About NetApp | 78 | News | 79 | Products | 80 | Technology | 81 | Sales | 82 | Support 83 |
84 | 85 | 86 | 87 |
88 | 89 |
90 | 91 |
Information 92 | 93 |
94 |
(C) 1996 Network Appliance, Inc. All rights reserved.
95 |
Please send your comments to webmaster@netapp.com 96 | 97 | 98 | 99 | 100 | 101 | 109 |
-------------------------------------------------------------------------------- /making/netapp_website/v2/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v2/.DS_Store -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/26609-disaster-recovery.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/26609-disaster-recovery.jpg -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/26609-rules-of-application-performance.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/26609-rules-of-application-performance.jpg -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/26609-speed-and-agility.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/26609-speed-and-agility.jpg -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/4sNyFtNi.min.js: -------------------------------------------------------------------------------- 1 | window.Dmdbase_CDC={}; 2 | window.Dmdbase_CDC={cookieName:"dmdbase_cdc",dimensions:{},logging:!1,enableTNT:!0,enableAnalytics:!0,DB_DEFAULT_VALUE:"ISP Visitor",NOT_IN_AWLIST:"Not In List",NOT_ASSIGNED_AWLIST_VALUE:"In List No Value",CompanyProfile:{},targetAttributes:"demandbase_sid company_name industry sub_industry employee_range revenue_range audience audience_segment state country_name marketing_alias b2b b2c, web_site watch_list_account_type watch_list_account_status".split(" "),useStorage:!0,useCookie:!0,init:function(){"true"=== 3 | this.cdc_getParamByName("cdc_debug")&&(this.logging=!0)},setupDimensions:function(){this.dimensions.set1={demandbase_sid:10,company_name:50,industry:40,sub_industry:40,employee_range:40,revenue_range:10,audience:30,audience_segment:30};this.dimensions.set2={watch_list_nagp_name:30,watch_list_nagp_rep_site_geo:30,watch_list_nagp_cmat_id:30,watch_list_dp_account_segmentation:30,watch_list_nagp_penetration_level:30,watch_list_nagp_netapp_vertical:30,watch_list_aff_deals:30,placeholder2:30}},callback:function(a){if(a)try{Dmdbase_CDC.init(), 4 | a=this.flatten(a),window.Dmdbase_CDC.CompanyProfile=a,this.enableAnalytics&&this.setAnalytics(window.Dmdbase_CDC.CompanyProfile),this.enableTNT&&this.setMbox(window.Dmdbase_CDC.CompanyProfile)}catch(b){window.console&&this.logging&&console.log("DB _ "+b.message)}},loadAnalytics:function(){this.setAnalytics(window.Dmdbase_CDC.CompanyProfile)},setAnalytics:function(a){try{this.setupDimensions();if(window.sessionStorage){var b=sessionStorage.getItem("s_dmdbase"),c=sessionStorage.getItem("s_dmdbase_detail"); 5 | c&&"Basic"===c&&this.storeSessionData(a);!b&&this.isCookieSet(this.cookieName)&&this.storeSessionData(a)}this.isCookieSet(this.cookieName)||this.storeSessionData(a)}catch(d){window.console&&this.logging&&console.log("DB _ "+d.message)}},storeSessionData:function(a){var b=this.buildDelimitedStrings(":",a);this.isCookieSet(this.cookieName)||this.saveToCookie(this.cookieName,"DBSET",1);Dmdbase_CDC.contextData=b;if(window.sessionStorage&&this.useStorage)for(sessionStorage.setItem("s_dmdbase",Dmdbase_CDC.contextData[0]), 6 | sessionStorage.setItem("s_dmdbase_detail",a.information_level),a=1;ab&&(a=a.substring(0,b));return a},truthy:function(a,b){return a||(!1=== 10 | a?a:b)},cdc_getParamByName:function(a){a=a.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");a=(new RegExp("[\\?&]"+a+"=([^&#]*)")).exec(location.search);return null===a?"":decodeURIComponent(a[1].replace(/\+/g," "))},set_mbox_variables:function(a){try{var b="",c;for(c in a)a.hasOwnProperty(c)&&-1!=this.targetAttributes.indexOf(c)&&(b+="profile."+c+"="+a[c]+",");b=b.split(",");if("undefined"!==typeof mboxFactoryDefault){var d=mboxFactoryDefault.getUrlBuilder();d.addParameters(b)}}catch(f){console.log(f)}}}; 11 | 12 | /* 13 | FILE ARCHIVED ON 07:04:14 Oct 04, 2019 AND RETRIEVED FROM THE 14 | INTERNET ARCHIVE ON 17:36:46 Nov 27, 2019. 15 | JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. 16 | 17 | ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. 18 | SECTION 108(a)(3)). 19 | */ 20 | /* 21 | playback timings (ms): 22 | RedisCDXSource: 3.458 23 | PetaboxLoader3.resolve: 188.214 (3) 24 | PetaboxLoader3.datanode: 90.822 (4) 25 | exclusion.robots.policy: 0.204 26 | captures_list: 255.931 27 | load_resource: 92.797 28 | esindex: 0.014 29 | exclusion.robots: 0.217 30 | LoadShardBlock: 221.865 (3) 31 | CDXLines.iter: 21.731 (3) 32 | */ -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/DXD192-OG-ExploreNetApp-465x294.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/DXD192-OG-ExploreNetApp-465x294.png -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/DXD192-OG-ExploreNetApp-600x400.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/DXD192-OG-ExploreNetApp-600x400.jpg -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/June18-announcement.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/June18-announcement.jpg -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/T27417-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/T27417-2.jpg -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/T27417-google-partner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/T27417-google-partner.jpg -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/T27559.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/T27559.jpg -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/T27802-video-poster-wsj.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/T27802-video-poster-wsj.jpg -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/aff-series-card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/aff-series-card.png -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/auto-complete.js: -------------------------------------------------------------------------------- 1 | var wbAutoComplete = (function(){ 2 | // "use strict"; 3 | function wbAutoComplete(options){ 4 | if (!document.querySelector) return; 5 | 6 | // helpers 7 | function hasClass(el, className){ return el.classList ? el.classList.contains(className) : new RegExp('\\b'+ className+'\\b').test(el.className); } 8 | 9 | function addEvent(el, type, handler){ 10 | if (el.attachEvent) el.attachEvent('on'+type, handler); else el.addEventListener(type, handler); 11 | } 12 | function removeEvent(el, type, handler){ 13 | // if (el.removeEventListener) not working in IE11 14 | if (el.detachEvent) el.detachEvent('on'+type, handler); else el.removeEventListener(type, handler); 15 | } 16 | function live(elClass, event, cb, context){ 17 | addEvent(context || document, event, function(e){ 18 | var found, el = e.target || e.srcElement; 19 | while (el && !(found = hasClass(el, elClass))) el = el.parentElement; 20 | if (found) cb.call(el, e); 21 | }); 22 | } 23 | 24 | var o = { 25 | selector: 0, 26 | source: 0, 27 | minChars: 3, 28 | delay: 150, 29 | offsetLeft: 0, 30 | offsetTop: 1, 31 | cache: 1, 32 | menuClass: '', 33 | renderItem: function (item, search){ 34 | // escape special characters 35 | search = search.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); 36 | var re = new RegExp("(" + search.split(' ').join('|') + ")", "gi"); 37 | return '
' + item.replace(re, "$1") + '
'; 38 | }, 39 | onSelect: function(e, term, item){} 40 | }; 41 | for (var k in options) { if (options.hasOwnProperty(k)) o[k] = options[k]; } 42 | 43 | // init 44 | var elems = typeof o.selector == 'object' ? [o.selector] : document.querySelectorAll(o.selector); 45 | for (var i=0; i 0) 71 | that.sc.scrollTop = selTop + that.sc.suggestionHeight + scrTop - that.sc.maxHeight; 72 | else if (selTop < 0) 73 | that.sc.scrollTop = selTop + scrTop; 74 | } 75 | } 76 | } 77 | addEvent(window, 'resize', that.updateSC); 78 | document.body.appendChild(that.sc); 79 | 80 | live('wb-autocomplete-suggestion', 'mouseleave', function(e){ 81 | var sel = that.sc.querySelector('.autocomplete-suggestion.selected'); 82 | if (sel) setTimeout(function(){ sel.className = sel.className.replace('selected', ''); }, 20); 83 | }, that.sc); 84 | 85 | live('wb-autocomplete-suggestion', 'mouseover', function(e){ 86 | var sel = that.sc.querySelector('.wb-autocomplete-suggestion.selected'); 87 | if (sel) sel.className = sel.className.replace('selected', ''); 88 | this.className += ' selected'; 89 | }, that.sc); 90 | 91 | live('wb-autocomplete-suggestion', 'mousedown', function(e){ 92 | if (hasClass(this, 'wb-autocomplete-suggestion')) { // else outside click 93 | var v = this.getAttribute('data-val'); 94 | that.value = v; 95 | o.onSelect(e, v, this); 96 | that.sc.style.display = 'none'; 97 | } 98 | }, that.sc); 99 | 100 | that.blurHandler = function(){ 101 | try { var over_sb = document.querySelector('.wb-autocomplete-suggestions:hover'); } catch(e){ var over_sb = 0; } 102 | if (!over_sb) { 103 | that.last_val = that.value; 104 | that.sc.style.display = 'none'; 105 | setTimeout(function(){ that.sc.style.display = 'none'; }, 350); // hide suggestions on fast input 106 | } else if (that !== document.activeElement) setTimeout(function(){ that.focus(); }, 20); 107 | }; 108 | addEvent(that, 'blur', that.blurHandler); 109 | 110 | var suggest = function(data){ 111 | var val = that.value; 112 | that.cache[val] = data; 113 | if (data.length && val.length >= o.minChars) { 114 | var s = ''; 115 | for (var i=0;i 40) && key != 13 && key != 27) { 157 | var val = that.value; 158 | if (val.length >= o.minChars) { 159 | if (val != that.last_val) { 160 | that.last_val = val; 161 | clearTimeout(that.timer); 162 | if (o.cache) { 163 | if (val in that.cache) { suggest(that.cache[val]); return; } 164 | // no requests if previous suggestions were empty 165 | for (var i=1; i#wm-save-snapshot-open { 324 | margin-right: 7px; 325 | top: -6px; 326 | } 327 | 328 | #wm-btns>#wm-sign-in { 329 | box-sizing: content-box; 330 | display: none; 331 | margin-right: 7px; 332 | top: -8px; 333 | 334 | /* 335 | round border around sign in button 336 | */ 337 | border: 2px #000 solid; 338 | border-radius: 14px; 339 | padding-right: 2px; 340 | padding-bottom: 2px; 341 | width: 11px; 342 | height: 11px; 343 | } 344 | 345 | #wm-btns>#wm-sign-in>.iconochive-person { 346 | font-size: 12.5px; 347 | } 348 | 349 | #wm-save-snapshot-open > .iconochive-web { 350 | color:#000; 351 | font-size:160%; 352 | } 353 | 354 | #wm-ipp #wm-share { 355 | display: flex; 356 | align-items: flex-end; 357 | justify-content: space-between; 358 | } 359 | 360 | #wm-share > #wm-screenshot { 361 | display: inline-block; 362 | margin-right: 3px; 363 | visibility: hidden; 364 | } 365 | 366 | #wm-screenshot > .iconochive-image { 367 | color:#000; 368 | font-size:160%; 369 | } 370 | 371 | #wm-btns>#wm-save-snapshot-in-progress { 372 | display: none; 373 | font-size:160%; 374 | opacity: 0.5; 375 | position: relative; 376 | margin-right: 7px; 377 | top: -5px; 378 | } 379 | 380 | #wm-btns>#wm-save-snapshot-success { 381 | display: none; 382 | color: green; 383 | position: relative; 384 | top: -7px; 385 | } 386 | 387 | #wm-btns>#wm-save-snapshot-fail { 388 | display: none; 389 | color: red; 390 | position: relative; 391 | top: -7px; 392 | } 393 | 394 | .wm-icon-screen-shot { 395 | background: url("../images/web-screenshot.svg") no-repeat !important; 396 | background-size: contain !important; 397 | width: 22px !important; 398 | height: 19px !important; 399 | 400 | display: inline-block; 401 | } 402 | -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/customer-dreamworks.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/customer-dreamworks.jpg -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/customer-ducati.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/customer-ducati.jpg -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/customer-wuxinextcode.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/customer-wuxinextcode.jpg -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/elqCfg.min.js: -------------------------------------------------------------------------------- 1 | (function(){var b="",N=new Date(20020101),O=new Date,g=O.getMilliseconds(),r=N.getTimezoneOffset(),l=window,q=document,z=0,m=1,f=2,c="",n="",B="/visitor/v200/svrGP",k="eloqua.com",d="",e="";function a(a){return typeof a==="undefined"||null===a||a===""}function J(a){try{return typeof a==="string"&&decodeURI(a)!==a}catch(b){return false}}function p(b){if(a(b))if(document.referrer)b=document.referrer;else b="elqNone";return encodeURIComponent(b)}function K(j,i){if(!a(d)&&!a(b)){var h=d+"?pps=50&siteid="+b+"&DLKey="+encodeURIComponent(j)+"&DLLookup="+encodeURIComponent(i)+"&ms="+g+e;if(!a(c))h+="&elqGUID="+c;var f=document.createElement("script");f.type="text/javascript";f.src=h;document.getElementsByTagName("head")[0].appendChild(f)}}function H(){if(!a(d)&&!a(b)){var h=d+"?pps=70&siteid="+b+"&ms="+g+e;if(!a(c))h+="&elqGUID="+c;var f=document.createElement("script");f.type="text/javascript";f.src=h;document.getElementsByTagName("head")[0].appendChild(f)}}function j(s,k,l){var i="";if(!a(d)&&!a(b)){if(e!=""){var q=h("OPTIN");if(q!=null)if(q=="0")return;else if(q=="1")i+="&isOptedIn=1"}k=p(k);if(!a(l))if(l===f)i+="&optin=country";else if(l===m)i+="&optin=all";else if(l===z)i+="&optin=disabled";var t=new Image(1,1);if(!a(s)){var j=d+"?pps=3&siteid="+b+"&ref="+encodeURIComponent(s)+"&ref2="+k+"&tzo="+r+"&ms="+g+i+e;if(!a(c))j+="&elqGUID="+c;j+=o(n);t.src=j}else{var j=d+"?pps=3&siteid="+b+"&ref2="+k+"&tzo="+r+"&ms="+g+i+e;if(!a(c))j+="&elqGUID="+c;j+=o(n);t.src=j}}}function I(b,a){j(b,a,z)}function u(b,a){j(b,a,f)}function v(b,a){j(b,a,m)}function i(f){if(!a(d)&&!a(b)&&!a(f)){if(f==40&&e!=""){var i=h("OPTIN");if(i!=null)if(i=="0")return y("function elqGetOptOutStatus(){ return 0; }");else if(i=="1")return y("function elqGetOptOutStatus(){ return 1; }")}if(f!=43&&f!=44||e==""){elqOptActionSrc=d+"?pps="+encodeURIComponent(f)+"&siteid="+b+"&ref="+encodeURIComponent(location.href)+"&ms="+g+e;if(!a(c))elqOptActionSrc+="&elqGUID="+c;var j=document.createElement("script");j.type="text/javascript";j.src=elqOptActionSrc;document.getElementsByTagName("head")[0].appendChild(j)}}}function y(b){var a=document.createElement("script");a.type="text/javascript";a.appendChild(document.createTextNode(b));document.getElementsByTagName("head")[0].appendChild(a)}function t(g,e,c){if(!a(d)&&!a(b))if(x()){A("ELQSITEVISITED","YES");w(g,e,c)}else if(g==f)u(e,c);else v(e,c)}function s(c,g,e){if(!a(d)&&!a(b)){var i=h("OPTIN");if(i!=null)if(i=="0")return;else i=="1"&&j(g,e,c);else if(x()){A("ELQSITEVISITED","YES");if(c==f)w(c,g,e);else elqCreateOptInBanner()}else c==f&&j(g,e,c)}}function w(l,k,i){i=p(i);var h=d+"?pps=45&siteid="+b+e;if(!a(k))h+="&ref="+encodeURIComponent(k);h+="&ref2="+i+"&tzo="+r+"&ms="+g;if(l==f)h+="&optin=country";else h+="&optin=all";if(!a(c))h+="&elqGUID="+c;var j=document.createElement("script");j.type="text/javascript";j.src=h;document.getElementsByTagName("head")[0].appendChild(j)}function E(b,a){if(e!="")s(f,b,a);else t(f,b,a)}function F(b,a){if(e!="")s(m,b,a);else t(m,b,a)}function A(b,a){document.cookie=b+"="+a;document.cookie+=";path=/; secure; HttpOnly; "}function C(a,c){if(a=="")return null;var b=a.indexOf("=");if(b>0){var d=a.substr(0,b);if(d.trim()==c)return a.substr(b+1)}return null}function h(c){for(var b=document.cookie.split(";"),a=0;a";q.body.innerHTML+=e;return}e.height="0";e.width="0";e.style.display="none";e.style.visibility="hidden";q.body.appendChild(e);e.src=f}}}l._elq={trackEvent:function(a,b,c){D(a,b,c)},trackOutboundLink:function(b,f,g){D(b.href,f,g);var d=J(b.href)?b.href:encodeURI(b.href),c,e=b.getAttribute("target");if(a(e))c='document.location = "'+d+'"';else c='window.open("'+d+'", "'+encodeURIComponent(e)+'")';setTimeout(c,1e3)}}})() 2 | /* 3 | FILE ARCHIVED ON 04:38:31 Oct 04, 2019 AND RETRIEVED FROM THE 4 | INTERNET ARCHIVE ON 17:36:58 Nov 27, 2019. 5 | JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. 6 | 7 | ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. 8 | SECTION 108(a)(3)). 9 | */ 10 | /* 11 | playback timings (ms): 12 | exclusion.robots.policy: 0.248 13 | CDXLines.iter: 45.378 (3) 14 | RedisCDXSource: 15.099 15 | PetaboxLoader3.resolve: 161.935 (2) 16 | LoadShardBlock: 543.695 (6) 17 | exclusion.robots: 0.266 18 | load_resource: 103.685 19 | esindex: 0.012 20 | PetaboxLoader3.datanode: 401.714 (7) 21 | */ -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/eu-cookie-legacy-styles.css: -------------------------------------------------------------------------------- 1 | #cboxOverlay { 2 | z-index: 9000; 3 | background: #000; 4 | position: fixed; 5 | width: 100%; 6 | height: 100%; 7 | top: 0; 8 | left: 0; 9 | overflow: hidden; 10 | } 11 | 12 | #colorbox { 13 | z-index: 9000; 14 | -moz-border-radius: 0.5em; 15 | -webkit-border-radius: 0.5em; 16 | border-radius: 0.5em; 17 | -moz-box-shadow: $4b4b4b 0px 0px 15px; 18 | -webkit-box-shadow: #4b4b4b 0px 0px 15px; 19 | box-shadow: #4b4b4b 0px 0px 15px; 20 | box-sizing: content-box; 21 | overflow: hidden; 22 | } 23 | 24 | #cboxWrapper { 25 | z-index: 9000; 26 | position: absolute; 27 | top: 0; 28 | left: 0; 29 | overflow: hidden; 30 | } 31 | 32 | #cboxMiddleLeft { 33 | display: none; 34 | } 35 | 36 | #cboxContent.euCookieModalBG, #cboxContent.gdprCookieModalBG { 37 | box-sizing: content-box; 38 | height: 175px; 39 | overflow: hidden; 40 | position: relative; 41 | moz-border-radius: 0.5em; 42 | -webkit-border-radius: 0.5em; 43 | border-radius: 0.5em; 44 | } 45 | #cboxContent.euCookieModalBG, #cboxContent.gdprCookieModalBG { 46 | background-color:#FAD95B; 47 | } 48 | 49 | #cboxLoadedContent { 50 | margin-bottom: 20px; 51 | -moz-border-radius: 0.5em; 52 | -webkit-border-radius: 0.5em; 53 | border-radius: 0.5em; 54 | box-sizing: content-box; 55 | } 56 | 57 | #cookieNotice, #GDPRNotice { 58 | font-size: 11px; 59 | padding: 2rem 3rem 0 3rem; 60 | margin-top: 1rem; 61 | } 62 | 63 | #cookieNotice h2, #cookieNotice a, #cookieNotice p, #GDPRNotice h2, #GDPRNotice a, #GDPRNotice p { 64 | font-size: 11px; 65 | margin-bottom: 12px; 66 | } 67 | 68 | #cookieNoticeExpandToggle { 69 | display: block; 70 | } 71 | 72 | #GDPRNotice #cookieNoticeExpandToggle { 73 | display: inline; 74 | } 75 | #cookieNotice .linkList, #GDPRNotice .linkList{ 76 | list-style: none; 77 | } 78 | #storeGDPR { 79 | width:auto; 80 | cursor: pointer; 81 | margin-top:12px; 82 | } 83 | 84 | #cboxClose { 85 | position: absolute; 86 | top: 6px; 87 | right: 6px; 88 | display: block; 89 | background: url("https://web.archive.org/web/20191004045427im_/http://media.netapp.com/images/v-form-close.png") 0 0 no-repeat; 90 | height: 20px; 91 | width: 20px; 92 | text-indent: 100%; 93 | white-space: nowrap; 94 | overflow: hidden; 95 | color: transparent; 96 | border: 0; 97 | cursor: pointer; 98 | } 99 | 100 | /* 101 | FILE ARCHIVED ON 04:54:27 Oct 04, 2019 AND RETRIEVED FROM THE 102 | INTERNET ARCHIVE ON 17:36:33 Nov 27, 2019. 103 | JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. 104 | 105 | ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. 106 | SECTION 108(a)(3)). 107 | */ 108 | /* 109 | playback timings (ms): 110 | exclusion.robots: 0.12 111 | captures_list: 44.15 112 | CDXLines.iter: 11.61 (3) 113 | PetaboxLoader3.datanode: 108.32 (5) 114 | exclusion.robots.policy: 0.111 115 | RedisCDXSource: 1.412 116 | LoadShardBlock: 28.512 (3) 117 | PetaboxLoader3.resolve: 93.624 (2) 118 | esindex: 0.007 119 | load_resource: 209.244 120 | */ -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/fontfaceobserver.js: -------------------------------------------------------------------------------- 1 | /* Font Face Observer v2.1.0 - © Bram Stein. License: BSD-3-Clause */(function(){'use strict';var f,g=[];function l(a){g.push(a);1==g.length&&f()}function m(){for(;g.length;)g[0](),g.shift()}f=function(){setTimeout(m)};function n(a){this.a=p;this.b=void 0;this.f=[];var b=this;try{a(function(a){q(b,a)},function(a){r(b,a)})}catch(c){r(b,c)}}var p=2;function t(a){return new n(function(b,c){c(a)})}function u(a){return new n(function(b){b(a)})}function q(a,b){if(a.a==p){if(b==a)throw new TypeError;var c=!1;try{var d=b&&b.then;if(null!=b&&"object"==typeof b&&"function"==typeof d){d.call(b,function(b){c||q(a,b);c=!0},function(b){c||r(a,b);c=!0});return}}catch(e){c||r(a,e);return}a.a=0;a.b=b;v(a)}} 2 | function r(a,b){if(a.a==p){if(b==a)throw new TypeError;a.a=1;a.b=b;v(a)}}function v(a){l(function(){if(a.a!=p)for(;a.f.length;){var b=a.f.shift(),c=b[0],d=b[1],e=b[2],b=b[3];try{0==a.a?"function"==typeof c?e(c.call(void 0,a.b)):e(a.b):1==a.a&&("function"==typeof d?e(d.call(void 0,a.b)):b(a.b))}catch(h){b(h)}}})}n.prototype.g=function(a){return this.c(void 0,a)};n.prototype.c=function(a,b){var c=this;return new n(function(d,e){c.f.push([a,b,d,e]);v(c)})}; 3 | function w(a){return new n(function(b,c){function d(c){return function(d){h[c]=d;e+=1;e==a.length&&b(h)}}var e=0,h=[];0==a.length&&b(h);for(var k=0;kparseInt(a[1],10)}else D=!1;return D}function J(){null===F&&(F=!!document.fonts);return F} 8 | function K(){if(null===E){var a=document.createElement("div");try{a.style.font="condensed 100px sans-serif"}catch(b){}E=""!==a.style.font}return E}function L(a,b){return[a.style,a.weight,K()?a.stretch:"","100px",b].join(" ")} 9 | B.prototype.load=function(a,b){var c=this,k=a||"BESbswy",r=0,n=b||3E3,H=(new Date).getTime();return new Promise(function(a,b){if(J()&&!G()){var M=new Promise(function(a,b){function e(){(new Date).getTime()-H>=n?b(Error(""+n+"ms timeout exceeded")):document.fonts.load(L(c,'"'+c.family+'"'),k).then(function(c){1<=c.length?a():setTimeout(e,25)},b)}e()}),N=new Promise(function(a,c){r=setTimeout(function(){c(Error(""+n+"ms timeout exceeded"))},n)});Promise.race([N,M]).then(function(){clearTimeout(r);a(c)}, 10 | b)}else m(function(){function v(){var b;if(b=-1!=f&&-1!=g||-1!=f&&-1!=h||-1!=g&&-1!=h)(b=f!=g&&f!=h&&g!=h)||(null===C&&(b=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),C=!!b&&(536>parseInt(b[1],10)||536===parseInt(b[1],10)&&11>=parseInt(b[2],10))),b=C&&(f==w&&g==w&&h==w||f==x&&g==x&&h==x||f==y&&g==y&&h==y)),b=!b;b&&(d.parentNode&&d.parentNode.removeChild(d),clearTimeout(r),a(c))}function I(){if((new Date).getTime()-H>=n)d.parentNode&&d.parentNode.removeChild(d),b(Error(""+ 11 | n+"ms timeout exceeded"));else{var a=document.hidden;if(!0===a||void 0===a)f=e.a.offsetWidth,g=p.a.offsetWidth,h=q.a.offsetWidth,v();r=setTimeout(I,50)}}var e=new t(k),p=new t(k),q=new t(k),f=-1,g=-1,h=-1,w=-1,x=-1,y=-1,d=document.createElement("div");d.dir="ltr";u(e,L(c,"sans-serif"));u(p,L(c,"serif"));u(q,L(c,"monospace"));d.appendChild(e.a);d.appendChild(p.a);d.appendChild(q.a);document.body.appendChild(d);w=e.a.offsetWidth;x=p.a.offsetWidth;y=q.a.offsetWidth;I();A(e,function(a){f=a;v()});u(e, 12 | L(c,'"'+c.family+'",sans-serif'));A(p,function(a){g=a;v()});u(p,L(c,'"'+c.family+'",serif'));A(q,function(a){h=a;v()});u(q,L(c,'"'+c.family+'",monospace'))})})};"object"===typeof module?module.exports=B:(window.FontFaceObserver=B,window.FontFaceObserver.prototype.load=B.prototype.load);}()); 13 | 14 | /* 15 | FILE ARCHIVED ON 04:53:02 Oct 04, 2019 AND RETRIEVED FROM THE 16 | INTERNET ARCHIVE ON 17:36:30 Nov 27, 2019. 17 | JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. 18 | 19 | ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. 20 | SECTION 108(a)(3)). 21 | */ 22 | /* 23 | playback timings (ms): 24 | load_resource: 1136.237 25 | exclusion.robots.policy: 0.171 26 | esindex: 0.013 27 | RedisCDXSource: 24.079 28 | PetaboxLoader3.resolve: 261.209 (2) 29 | captures_list: 113.88 30 | CDXLines.iter: 14.504 (3) 31 | PetaboxLoader3.datanode: 933.733 (5) 32 | LoadShardBlock: 67.985 (3) 33 | exclusion.robots: 0.186 34 | */ -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/gmq-2019-hp-660x660.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/gmq-2019-hp-660x660.jpg -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/graph-calc.js: -------------------------------------------------------------------------------- 1 | function getEventX(event) { 2 | var posx = 0; 3 | if (event.pageX || event.pageY) { 4 | posx = event.pageX; 5 | } 6 | else if (event.clientX || event.clientY) { 7 | posx = event.clientX + document.body.scrollLeft 8 | + document.documentElement.scrollLeft; 9 | } 10 | return posx; 11 | } 12 | function getElementX(obj) { 13 | var x = 0; 14 | if (obj.offsetParent) { 15 | do { 16 | x += obj.offsetLeft; 17 | } while (obj = obj.offsetParent); 18 | } 19 | return x; 20 | } 21 | function zeroPad(v, len) { 22 | v = v.toString(); 23 | return v.length >= len ? v : "00000000".substring(0, len - v.length) + v; 24 | } 25 | 26 | /** 27 | * Check if the difference between the max and the min non zero capture numbers 28 | * is larger than 3 orders of magnitude. If yes, we need to scale. 29 | **/ 30 | function capturegraph_scale_is_required(captures) { 31 | var max = 0; 32 | var min = 1000; 33 | for (var i = 0; i < captures.length; i++) { 34 | var year = captures[i]; 35 | max = Math.max(max, Math.max.apply(null, year[1])); 36 | min = Math.min(min, Math.min.apply(null, 37 | year[1].filter(Boolean))); 38 | } 39 | return (Math.log1p(max) - Math.log1p(min) > 3); 40 | } 41 | 42 | /** 43 | * Scale captugraph counts and max maxcount using log1p if necessary. 44 | */ 45 | function capturegraph_scale(captures) { 46 | var maxcount = 0; 47 | for (var i = 0; i < captures.length; i++) { 48 | maxcount = Math.max(maxcount, Math.max.apply(null, captures[i][1])); 49 | } 50 | if (capturegraph_scale_is_required(captures)) { 51 | var scaled = []; 52 | for (var i = 0; i < captures.length; i++) { 53 | var year = captures[i]; 54 | // XXX map may not be available on all platforms 55 | scaled.push([year[0], year[1].map(Math.log1p)]); 56 | } 57 | captures = scaled; 58 | maxcount = Math.log1p(maxcount); 59 | } 60 | return [captures, maxcount]; 61 | } 62 | 63 | /** 64 | * Draw years, highlight current year, draw capture frequency per month 65 | */ 66 | function sparkline(captures, width, height, canvas, start_year, 67 | cur_year, cur_month) { 68 | var ctx = canvas.getContext("2d"); 69 | if (!ctx) return; 70 | ctx.fillStyle = "#FFF"; 71 | var end_year = new Date().getUTCFullYear(); 72 | var year_width = width / (end_year - start_year + 1); 73 | 74 | var scaled = capturegraph_scale(captures.years); 75 | var years = scaled[0]; 76 | var maxcount = scaled[1]; 77 | 78 | var yscale = height / maxcount; 79 | 80 | function year_left(year) { 81 | return Math.ceil((year - start_year) * year_width) + 0.5; 82 | } 83 | 84 | if (cur_year >= start_year) { 85 | var x = year_left(cur_year); 86 | ctx.fillStyle = "#FFFFA5"; 87 | ctx.fillRect(x, 0, year_width, height); 88 | } 89 | for (var year = start_year; year <= end_year; year++) { 90 | var x = year_left(year); 91 | ctx.beginPath(); 92 | ctx.moveTo(x, 0); 93 | ctx.lineTo(x, height); 94 | ctx.lineWidth = 1; 95 | ctx.strokeStyle = "#CCC"; 96 | ctx.stroke(); 97 | } 98 | cur_month = parseInt(cur_month) - 1; 99 | var month_width = (year_width - 1) / 12; 100 | for (var i = 0; i < years.length; i++) { 101 | var year = years[i][0]; 102 | var months = years[i][1]; 103 | var left = year_left(year) + 1.0; 104 | for (var month = 0; month < 12; month++) { 105 | var count = months[month]; 106 | if (count > 0) { 107 | var h = Math.ceil(count * yscale); 108 | if (year == cur_year && month == cur_month) { 109 | ctx.fillStyle = "#EC008C"; 110 | } else { 111 | ctx.fillStyle = "#000"; 112 | } 113 | // must note that when I use width=Math.round(month_width+1), 114 | // the replay toolbar looks more accurate whereas the 115 | // bubble calendar looks somehow different. 116 | ctx.fillRect(Math.round(left), Math.ceil(height - h), 117 | Math.ceil(month_width), Math.round(h)); 118 | } 119 | left += month_width; 120 | } 121 | } 122 | } 123 | 124 | function clear_canvas(canvas_id) { 125 | var c = document.getElementById(canvas_id); 126 | if (!c || !c.getContext) return; 127 | var ctx = c.getContext("2d"); 128 | if (!ctx) return; 129 | ctx.clearRect(0, 0, c.width, c.height); 130 | } 131 | -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/iconochive.css: -------------------------------------------------------------------------------- 1 | @font-face{font-family:'Iconochive-Regular';src:url('https://archive.org/includes/fonts/Iconochive-Regular.eot?-ccsheb');src:url('https://archive.org/includes/fonts/Iconochive-Regular.eot?#iefix-ccsheb') format('embedded-opentype'),url('https://archive.org/includes/fonts/Iconochive-Regular.woff?-ccsheb') format('woff'),url('https://archive.org/includes/fonts/Iconochive-Regular.ttf?-ccsheb') format('truetype'),url('https://archive.org/includes/fonts/Iconochive-Regular.svg?-ccsheb#Iconochive-Regular') format('svg');font-weight:normal;font-style:normal} 2 | [class^="iconochive-"],[class*=" iconochive-"]{font-family:'Iconochive-Regular'!important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale} 3 | .iconochive-Uplevel:before{content:"\21b5"} 4 | .iconochive-exit:before{content:"\1f6a3"} 5 | .iconochive-beta:before{content:"\3b2"} 6 | .iconochive-logo:before{content:"\1f3db"} 7 | .iconochive-audio:before{content:"\1f568"} 8 | .iconochive-movies:before{content:"\1f39e"} 9 | .iconochive-software:before{content:"\1f4be"} 10 | .iconochive-texts:before{content:"\1f56e"} 11 | .iconochive-etree:before{content:"\1f3a4"} 12 | .iconochive-image:before{content:"\1f5bc"} 13 | .iconochive-web:before{content:"\1f5d4"} 14 | .iconochive-collection:before{content:"\2211"} 15 | .iconochive-folder:before{content:"\1f4c2"} 16 | .iconochive-data:before{content:"\1f5c3"} 17 | .iconochive-tv:before{content:"\1f4fa"} 18 | .iconochive-article:before{content:"\1f5cf"} 19 | .iconochive-question:before{content:"\2370"} 20 | .iconochive-question-dark:before{content:"\3f"} 21 | .iconochive-info:before{content:"\69"} 22 | .iconochive-info-small:before{content:"\24d8"} 23 | .iconochive-comment:before{content:"\1f5e9"} 24 | .iconochive-comments:before{content:"\1f5ea"} 25 | .iconochive-person:before{content:"\1f464"} 26 | .iconochive-people:before{content:"\1f465"} 27 | .iconochive-eye:before{content:"\1f441"} 28 | .iconochive-rss:before{content:"\221e"} 29 | .iconochive-time:before{content:"\1f551"} 30 | .iconochive-quote:before{content:"\275d"} 31 | .iconochive-disc:before{content:"\1f4bf"} 32 | .iconochive-tv-commercial:before{content:"\1f4b0"} 33 | .iconochive-search:before{content:"\1f50d"} 34 | .iconochive-search-star:before{content:"\273d"} 35 | .iconochive-tiles:before{content:"\229e"} 36 | .iconochive-list:before{content:"\21f6"} 37 | .iconochive-list-bulleted:before{content:"\2317"} 38 | .iconochive-latest:before{content:"\2208"} 39 | .iconochive-left:before{content:"\2c2"} 40 | .iconochive-right:before{content:"\2c3"} 41 | .iconochive-left-solid:before{content:"\25c2"} 42 | .iconochive-right-solid:before{content:"\25b8"} 43 | .iconochive-up-solid:before{content:"\25b4"} 44 | .iconochive-down-solid:before{content:"\25be"} 45 | .iconochive-dot:before{content:"\23e4"} 46 | .iconochive-dots:before{content:"\25a6"} 47 | .iconochive-columns:before{content:"\25af"} 48 | .iconochive-sort:before{content:"\21d5"} 49 | .iconochive-atoz:before{content:"\1f524"} 50 | .iconochive-ztoa:before{content:"\1f525"} 51 | .iconochive-upload:before{content:"\1f4e4"} 52 | .iconochive-download:before{content:"\1f4e5"} 53 | .iconochive-favorite:before{content:"\2605"} 54 | .iconochive-heart:before{content:"\2665"} 55 | .iconochive-play:before{content:"\25b6"} 56 | .iconochive-play-framed:before{content:"\1f3ac"} 57 | .iconochive-fullscreen:before{content:"\26f6"} 58 | .iconochive-mute:before{content:"\1f507"} 59 | .iconochive-unmute:before{content:"\1f50a"} 60 | .iconochive-share:before{content:"\1f381"} 61 | .iconochive-edit:before{content:"\270e"} 62 | .iconochive-reedit:before{content:"\2710"} 63 | .iconochive-gear:before{content:"\2699"} 64 | .iconochive-remove-circle:before{content:"\274e"} 65 | .iconochive-plus-circle:before{content:"\1f5d6"} 66 | .iconochive-minus-circle:before{content:"\1f5d5"} 67 | .iconochive-x:before{content:"\1f5d9"} 68 | .iconochive-fork:before{content:"\22d4"} 69 | .iconochive-trash:before{content:"\1f5d1"} 70 | .iconochive-warning:before{content:"\26a0"} 71 | .iconochive-flash:before{content:"\1f5f2"} 72 | .iconochive-world:before{content:"\1f5fa"} 73 | .iconochive-lock:before{content:"\1f512"} 74 | .iconochive-unlock:before{content:"\1f513"} 75 | .iconochive-twitter:before{content:"\1f426"} 76 | .iconochive-facebook:before{content:"\66"} 77 | .iconochive-googleplus:before{content:"\67"} 78 | .iconochive-reddit:before{content:"\1f47d"} 79 | .iconochive-tumblr:before{content:"\54"} 80 | .iconochive-pinterest:before{content:"\1d4df"} 81 | .iconochive-popcorn:before{content:"\1f4a5"} 82 | .iconochive-email:before{content:"\1f4e7"} 83 | .iconochive-embed:before{content:"\1f517"} 84 | .iconochive-gamepad:before{content:"\1f579"} 85 | .iconochive-Zoom_In:before{content:"\2b"} 86 | .iconochive-Zoom_Out:before{content:"\2d"} 87 | .iconochive-RSS:before{content:"\1f4e8"} 88 | .iconochive-Light_Bulb:before{content:"\1f4a1"} 89 | .iconochive-Add:before{content:"\2295"} 90 | .iconochive-Tab_Activity:before{content:"\2318"} 91 | .iconochive-Forward:before{content:"\23e9"} 92 | .iconochive-Backward:before{content:"\23ea"} 93 | .iconochive-No_Audio:before{content:"\1f508"} 94 | .iconochive-Pause:before{content:"\23f8"} 95 | .iconochive-No_Favorite:before{content:"\2606"} 96 | .iconochive-Unike:before{content:"\2661"} 97 | .iconochive-Song:before{content:"\266b"} 98 | .iconochive-No_Flag:before{content:"\2690"} 99 | .iconochive-Flag:before{content:"\2691"} 100 | .iconochive-Done:before{content:"\2713"} 101 | .iconochive-Check:before{content:"\2714"} 102 | .iconochive-Refresh:before{content:"\27f3"} 103 | .iconochive-Headphones:before{content:"\1f3a7"} 104 | .iconochive-Chart:before{content:"\1f4c8"} 105 | .iconochive-Bookmark:before{content:"\1f4d1"} 106 | .iconochive-Documents:before{content:"\1f4da"} 107 | .iconochive-Newspaper:before{content:"\1f4f0"} 108 | .iconochive-Podcast:before{content:"\1f4f6"} 109 | .iconochive-Radio:before{content:"\1f4fb"} 110 | .iconochive-Cassette:before{content:"\1f4fc"} 111 | .iconochive-Shuffle:before{content:"\1f500"} 112 | .iconochive-Loop:before{content:"\1f501"} 113 | .iconochive-Low_Audio:before{content:"\1f509"} 114 | .iconochive-First:before{content:"\1f396"} 115 | .iconochive-Invisible:before{content:"\1f576"} 116 | .iconochive-Computer:before{content:"\1f5b3"} 117 | -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/ip.js: -------------------------------------------------------------------------------- 1 | var __ntap_dmdbase={"registry_company_name":"Internet Archive","registry_city":null,"registry_state":null,"registry_zip_code":null,"registry_area_code":null,"registry_dma_code":null,"registry_country":"United States","registry_country_code":"US","registry_country_code3":null,"registry_latitude":37.75,"registry_longitude":-97.82,"company_name":"Internet Archive","demandbase_sid":18258689,"marketing_alias":"Internet Archive","industry":"Software & Technology","sub_industry":"Data & Technical Services","employee_count":152,"isp":false,"primary_sic":"7374","primary_naics":"518210","street_address":"116 Sheridan Ave","city":"San Francisco","state":"CA","zip":"94129","country":"US","country_name":"United States","phone":"415-561-6767","stock_ticker":null,"web_site":"archive.org","annual_sales":32680000,"revenue_range":"$11M-$50M","employee_range":"101-250","b2b":true,"b2c":false,"traffic":"Very High","latitude":37.8,"longitude":-122.47,"fortune_1000":false,"forbes_2000":false,"information_level":"Detailed","audience":"SMB","audience_segment":"Software & Technology","ip":"207.241.232.93","region_name":null} 2 | /* 3 | FILE ARCHIVED ON 04:53:06 Oct 04, 2019 AND RETRIEVED FROM THE 4 | INTERNET ARCHIVE ON 17:36:35 Nov 27, 2019. 5 | JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. 6 | 7 | ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. 8 | SECTION 108(a)(3)). 9 | */ 10 | /* 11 | playback timings (ms): 12 | load_resource: 365.514 13 | exclusion.robots.policy: 0.201 14 | esindex: 0.016 15 | RedisCDXSource: 0.603 16 | PetaboxLoader3.resolve: 223.386 (2) 17 | captures_list: 72.102 18 | CDXLines.iter: 18.572 (3) 19 | PetaboxLoader3.datanode: 87.788 (5) 20 | LoadShardBlock: 35.697 (3) 21 | exclusion.robots: 0.217 22 | */ -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/ip.json: -------------------------------------------------------------------------------- 1 | Dmdbase_CDC.callback({"registry_company_name":"Internet Archive","registry_city":null,"registry_state":null,"registry_zip_code":null,"registry_area_code":null,"registry_dma_code":null,"registry_country":"United States","registry_country_code":"US","registry_country_code3":null,"registry_latitude":37.75,"registry_longitude":-97.82,"company_name":"Internet Archive","demandbase_sid":18258689,"marketing_alias":"Internet Archive","industry":"Software & Technology","sub_industry":"Data & Technical Services","employee_count":152,"isp":false,"primary_sic":"7374","primary_naics":"518210","street_address":"116 Sheridan Ave","city":"San Francisco","state":"CA","zip":"94129","country":"US","country_name":"United States","phone":"415-561-6767","stock_ticker":null,"web_site":"archive.org","annual_sales":32680000,"revenue_range":"$11M-$50M","employee_range":"101-250","b2b":true,"b2c":false,"traffic":"Very High","latitude":37.8,"longitude":-122.47,"fortune_1000":false,"forbes_2000":false,"information_level":"Detailed","audience":"SMB","audience_segment":"Software & Technology","ip":"207.241.225.158","region_name":null}) 2 | /* 3 | FILE ARCHIVED ON 05:05:10 Oct 17, 2019 AND RETRIEVED FROM THE 4 | INTERNET ARCHIVE ON 17:36:00 Nov 27, 2019. 5 | JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. 6 | 7 | ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. 8 | SECTION 108(a)(3)). 9 | */ 10 | /* 11 | playback timings (ms): 12 | exclusion.robots.policy: 0.168 13 | captures_list: 135.07 14 | RedisCDXSource: 33.1 15 | PetaboxLoader3.resolve: 58.009 16 | LoadShardBlock: 79.86 (3) 17 | exclusion.robots: 0.181 18 | load_resource: 119.423 19 | CDXLines.iter: 17.856 (3) 20 | esindex: 0.015 21 | PetaboxLoader3.datanode: 97.376 (4) 22 | */ -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/netapp-insight-2019-card.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pablogarciaarevalo/demo-trident/ed005b89d1961906a6f674e80b2b9f3859bdd557/making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/netapp-insight-2019-card.jpg -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/pio.min.js: -------------------------------------------------------------------------------- 1 | !function(t){function e(i){if(n[i])return n[i].exports;var o=n[i]={i:i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var n={};e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,i){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:i})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=211)}({211:function(t,e,n){"use strict";function i(t){if(!$(t).data("pio-pdf-completed")||"true"!=$(t).data("pio-pdf-completed")){$(t).data("pio-pdf-completed","true");var e=$(t).attr("href"),n=new Date,i=new Date;i.setMonth(n.getMonth()+1);var o={expireDate:i.toISOString(),availableDate:n.toISOString(),www_content_cat:"reference"},a={event:"www_link_click",entityType:"user",entityId:S,targetEntityType:"item",targetEntityId:e,properties:null,eventTime:n.toISOString()},r={event:"$set",entityType:"item",entityId:e,properties:o,eventTime:n.toISOString()},d={},s=[],u={};u.url=e,u.domain=location.origin,s=p(h)?{ClickEvent:a,ClickCategory:r,DMBCompany:_,DMBIndustry:v,DMBCity:w}:{ClickEvent:a,ClickCategory:r,DMBCompany:_,DMBIndustry:v,DMBCity:w,ELQJobRole:h,ELQLanguagePref:b,ELQRelationship:T},d.pioModel=s,d.pioToTridion=u,window.disallowPdfSubmission||l(d)}}function o(t){for(var e=t+"=",n=decodeURIComponent(document.cookie),i=n.split(";"),o=0;o=10?("www.netapp.com"!=window.location.hostname&&(console.log(u),l(c)),n=!0,clearTimeout(t)):1!=videojs.getPlayer(e).paused()&&0==n&&("www.netapp.com"!=window.location.hostname&&(console.log(u),l(c)),n=!0,clearTimeout(t))},11e3)})}function d(){var t=new Date,e=new Date;e.setMonth(t.getMonth()+1),t.toISOString();var n=$(location).attr("href");window.pioLinkProps.expireDate=e.toISOString(),window.pioLinkProps.availableDate=t.toISOString();var i,o={event:"www_link_click",entityType:"user",entityId:S,targetEntityType:"item",targetEntityId:n,properties:null,eventTime:t.toISOString()},a={event:"$set",entityType:"item",entityId:n,properties:window.pioLinkProps,eventTime:t.toISOString()},r=[];i=p(h)?{ClickEvent:o,ClickCategory:a,DMBCompany:_,DMBIndustry:v,DMBCity:w}:{ClickEvent:o,ClickCategory:a,DMBCompany:_,DMBIndustry:v,DMBCity:w,ELQJobRole:h,ELQLanguagePref:b,ELQRelationship:T},r.pioModel=i,l(r)}function s(){(p(_)||p(v)||p(w))&&"undefined"!=typeof __ntap_dmdbase&&(void 0!==__ntap_dmdbase.registry_company_name&&""!=__ntap_dmdbase.registry_company_name&&(_={event:"dmdbase_company_name",entityType:"user",entityId:S,targetEntityType:"item",targetEntityId:__ntap_dmdbase.registry_company_name}),void 0!==__ntap_dmdbase.industry&&""!=__ntap_dmdbase.industry&&(v={event:"dmdbase_industry",entityType:"user",entityId:S,targetEntityType:"item",targetEntityId:__ntap_dmdbase.industry}),void 0!==__ntap_dmdbase.registry_city&&""!=__ntap_dmdbase.registry_city&&(w={event:"dmdbase_city",entityType:"user",entityId:S,targetEntityType:"item",targetEntityId:__ntap_dmdbase.registry_city}));var t=new Date;Object.keys(_).length&&(_.eventTime=t.toISOString()),Object.keys(v).length&&(v.eventTime=t.toISOString()),Object.keys(w).length&&(w.eventTime=t.toISOString())}function l(t){var e={PioModel:t.pioModel,PioToBrightcove:t.pioToBrightcove,PioToTridion:t.pioToTridion};$.ajax({url:"/api/netapppiocollection/submitgenericeventtoqueue",type:"POST",contentType:"application/json; charset=utf-8",dataType:"json",data:JSON.stringify(e),success:function(t){}})}function p(t){return Object.getOwnPropertyNames(t).length<2}function u(t){if(t)return t;var e=I.shift();return I.push(e),e}function c(t){var e,n,i;for(i=t.length-1;i>0;i--)e=Math.floor(Math.random()*(i+1)),n=t[i],t[i]=t[e],t[e]=n;return t}function f(t){var e=t.split("/"),n=function(t){var e;return function(t){return e||(e=document.createElement("a")),e.href=t,e.href}}();if("https:"==e[0]||"http:"==e[0]){var i=e.splice(0,3).join("/");t=t.replace(i,"")}return t=-1==["dev.www.netapp.com","qa.www.netapp.com","review.netapp.com","www.netapp.com"].indexOf(window.location.host)?"https://web.archive.org/web/20191004045431/https://www.netapp.com/"+t:n(t)}function m(t){return-1!=t.indexOf(".pdf")||-1!=t.indexOf("/pio-redirect/")?"_blank":"_self"}function y(t){var e=$(".personalization-band"),n="",i="Learn More";console.log(t[0].adobeAttribute);for(var o in t[0].adobeAttribute)t[0].adobeAttribute.hasOwnProperty(o)&&"$id"!==o&&(n+=t[0].adobeAttribute[o]+"|");n=n.slice(0,-1),e.find("a.button").attr("data-ntap-analytics-pio",n),e.find(".n-band__image").attr("src",u(t[0].imageUrl)),e.find("a.button").attr("href",f(t[0].pageUrl)),e.find("a.button").attr("target",m(t[0].pageUrl)),e.find(".n-band__heading").html(t[0].pageTitle),e.find(".n-text-longform").find("p").html(t[0].description),null!=t[0].callToAction&&(i=t[0].callToAction),e.find(".button__text-pio").text(i),e.removeClass("hidden")}function g(t){var e=$(".personalization-band__modules");e.find(".n-layout-flex").attr("data-ntap-layout",t.length),e.find(".n-personalization-module").each(function(e){var n="Learn More";if(e1&&g(t),$('a[href*=".pdf"],a[href*="pdf?"]').on("click contextmenu",function(){i(this)})}})}})}}); 2 | /* 3 | FILE ARCHIVED ON 04:54:31 Oct 04, 2019 AND RETRIEVED FROM THE 4 | INTERNET ARCHIVE ON 17:36:32 Nov 27, 2019. 5 | JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. 6 | 7 | ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. 8 | SECTION 108(a)(3)). 9 | */ 10 | /* 11 | playback timings (ms): 12 | exclusion.robots.policy: 0.124 13 | LoadShardBlock: 92.643 (3) 14 | esindex: 0.016 15 | RedisCDXSource: 63.505 16 | exclusion.robots: 0.135 17 | PetaboxLoader3.resolve: 99.029 (2) 18 | captures_list: 176.063 19 | PetaboxLoader3.datanode: 140.231 (5) 20 | load_resource: 151.216 21 | CDXLines.iter: 15.924 (3) 22 | */ -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/prehide-target.min.js: -------------------------------------------------------------------------------- 1 | !function(t){function e(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return t[n].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var r={};e.m=t,e.c=r,e.i=function(t){return t},e.d=function(t,r,n){e.o(t,r)||Object.defineProperty(t,r,{configurable:!1,enumerable:!0,get:n})},e.n=function(t){var r=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(r,"a",r),r},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=212)}({212:function(t,e,r){"use strict";function n(t){var e=window.location.href.split("?")[0];if(flicker_data)var r=flicker_data.find(function(t){return t.page==e});if(r){if(!$("#target-hide").length){var o=document.createElement("style");o.id="target-hide",o.innerHTML="main {opacity: 0;}";var i=document.getElementsByTagName("head")[0];i.insertBefore(o,i.firstChild)}"number"!=typeof t&&(t=0);var a=!1;window.parent.adobe&&window.parent.adobe.hasOwnProperty("target")&&(a=!0),t<100&&!a?window.setTimeout(function(){n(t+1)},100):a?setTimeout(function(){$("main").attr("style","opacity: 1 !important")},2e3):t>=100&&!a&&($("main").attr("style","opacity: 1 !important"),console.log("target isnt loaded yet, so show page"))}}Array.prototype.find||Object.defineProperty(Array.prototype,"find",{value:function(t){if(null==this)throw new TypeError('"this" is null or not defined');var e=Object(this),r=e.length>>>0;if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var n=arguments[1],o=0;o -1){ 5 | source = "https://s.amazon-adsystem.com/iui3?d=forester-did&ex-fargs=%3Fid%3D8e9c7445-0e43-08f3-ad19-b53dac60024a%26type%3D55%26m%3D1&ex-fch=416613&ex-src=www.netapp.com&ex-hargs=v%3D1.0%3Bc%3D1243631920601%3Bp%3D8E9C7445-0E43-08F3-AD19-B53DAC60024A"; 6 | }else if(url.indexOf("secure-office-365-environment-awsebook.aspx") > -1) { 7 | source = "https://s.amazon-adsystem.com/iui3?d=forester-did&ex-fargs=%3Fid%3D3a83f0ec-36e8-b6a4-f13f-83043cb797dc%26type%3D6%26m%3D1&ex-fch=416613&ex-src=www.netapp.com&ex-hargs=v%3D1.0%3Bc%3D1243631920601%3Bp%3D3A83F0EC-36E8-B6A4-F13F-83043CB797DC"; 8 | }else if(url.indexOf("protect-your-saas-data-webcast.aspx") > -1) { 9 | source = "https://s.amazon-adsystem.com/iui3?d=forester-did&ex-fargs=%3Fid%3Df1694b2e-ad96-9314-c18f-2270553069c8%26type%3D15%26m%3D1&ex-fch=416613&ex-src=www.netapp.com&ex-hargs=v%3D1.0%3Bc%3D1243631920601%3Bp%3DF1694B2E-AD96-9314-C18F-2270553069C8"; 10 | }else if(url.indexOf("aws-gestalt-lp-netapp.aspx") > -1) { 11 | source = "https://s.amazon-adsystem.com/iui3?d=forester-did&ex-fargs=%3Fid%3Df3e57da2-86f3-d684-3731-42d6f38c3a29%26type%3D31%26m%3D1&ex-fch=416613&ex-src=www.netapp.com&ex-hargs=v%3D1.0%3Bc%3D1243631920601%3Bp%3DF3E57DA2-86F3-D684-3731-42D6F38C3A29"; 12 | } 13 | 14 | var dcIMG = document.createElement('img'); 15 | dcIMG.setAttribute('src', source); 16 | 17 | dcIMG.setAttribute('height','1'); 18 | dcIMG.setAttribute('width','1'); 19 | dcIMG.setAttribute('border','0'); 20 | dcIMG.setAttribute('style','display:none'); 21 | document.body.appendChild(dcIMG); 22 | }); 23 | -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/satellite-5a56b21a64746d13a20000b7.js: -------------------------------------------------------------------------------- 1 | _satellite.pushAsyncScript(function(event, target, $variables){ 2 | /** 3 | Start of DoubleClick Floodlight Tag: Please do not remove 4 | Activity name of this tag: US | FY18 | Homepage | Land 5 | URLs of the webpages where the tag is expected to be placed: 6 | http://www.netapp.com/us 7 | 8 | This tag must be placed between the and tags, as close as possible to the opening tag. 9 | Creation Date: 01/10/2018 10 | **/ 11 | var axel = Math.random() + ""; 12 | var a = axel * 10000000000000; 13 | var dcIMG = document.createElement('iframe'); 14 | 15 | dcIMG.setAttribute('src', 'https://4355326.fls.doubleclick.net/activityi;src=4355326;type=fy17q0;cat=ushom0;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;ord=' + a + '?'); 16 | dcIMG.setAttribute('height','1'); 17 | dcIMG.setAttribute('width','1'); 18 | dcIMG.setAttribute('border','0'); 19 | dcIMG.setAttribute('style','display:none'); 20 | document.body.appendChild(dcIMG); 21 | 22 | /*** End of DoubleClick Floodlight Tag: Please do not remove ***/ 23 | }); 24 | -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/satellite-5a66639c64746d7cf10009e4.js: -------------------------------------------------------------------------------- 1 | _satellite.pushAsyncScript(function(event, target, $variables){ 2 | adroll_adv_id = "F7QV6PFHB5AB5E4TDSVNVO"; 3 | adroll_pix_id = "F3SQYB2XFBEHHNR4XIV7PN"; 4 | 5 | /* OPTIONAL: provide email to improve user identification */ 6 | 7 | /* adroll_email = "username@example.com"; */ 8 | 9 | (function () { 10 | var _onload = function(){ 11 | 12 | if (document.readyState && !/loaded|complete/.test(document.readyState)){setTimeout(_onload, 10);return} 13 | 14 | if (!window.__adroll_loaded){__adroll_loaded=true;setTimeout(_onload, 50);return} 15 | 16 | var scr = document.createElement("script"); 17 | 18 | var host = (("https:" == document.location.protocol) ? "https://s.adroll.com" : "http://a.adroll.com"); 19 | 20 | scr.setAttribute('async', 'true'); 21 | 22 | scr.type = "text/javascript"; 23 | 24 | scr.src = host + "/j/roundtrip.js"; 25 | 26 | ((document.getElementsByTagName('head') || [null])[0] || 27 | 28 | document.getElementsByTagName('script')[0].parentNode).appendChild(scr); 29 | 30 | }; 31 | 32 | if (window.addEventListener) {window.addEventListener('load', _onload, false);} 33 | 34 | else {window.attachEvent('onload', _onload)} 35 | }()); 36 | 37 | }); 38 | -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/satellite-5b8869ee64746d450c008bea.js: -------------------------------------------------------------------------------- 1 | _satellite.pushAsyncScript(function(event, target, $variables){ 2 | var s = document.createElement('script'); 3 | s.setAttribute('src', 'https://www.googletagmanager.com/gtag/js?id=AW-934211264'); 4 | document.head.appendChild(s); 5 | 6 | var gtagscript = "window.dataLayer = window.dataLayer || [];"+ 7 | "function gtag(){dataLayer.push(arguments);};"+ 8 | "gtag('js', new Date());"+ 9 | "gtag('config', 'AW-934211264');"+ 10 | "gtag('config', 'AW-815664557');"+ 11 | "gtag('config', 'AW-730483330');"+ 12 | "gtag('config', 'AW-1056430553');"; 13 | 14 | var scr = document.createElement('script'); 15 | scr.text = gtagscript; 16 | document.head.appendChild(scr); 17 | 18 | 19 | 20 | }); 21 | -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/satellite-5c081fc764746d461600dcd3.js: -------------------------------------------------------------------------------- 1 | _satellite.pushAsyncScript(function(event, target, $variables){ 2 | (function(w,d,t,r,u){var f,n,i;w[u]=w[u]||[],f=function(){var o={ti:"5636935"};o.q=w[u],w[u]=new UET(o),w[u].push("pageLoad")},n=d.createElement(t),n.src=r,n.async=1,n.onload=n.onreadystatechange=function(){var s=this.readyState;s&&s!=="loaded"&&s!=="complete"||(f(),n.onload=n.onreadystatechange=null)},i=d.getElementsByTagName(t)[0],i.parentNode.insertBefore(n,i)})(window,document,"script","//bat.bing.com/bat.js","uetq"); 3 | }); 4 | -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/satellite-5c10271664746d19e60108b0.js: -------------------------------------------------------------------------------- 1 | _satellite.pushAsyncScript(function(event, target, $variables){ 2 | !function(e,t,n,s,u,a){e.twq||(s=e.twq=function(){s.exe?s.exe.apply(s,arguments):s.queue.push(arguments); 3 | },s.version='1.1',s.queue=[],u=t.createElement(n),u.async=!0,u.src='//static.ads-twitter.com/uwt.js', 4 | a=t.getElementsByTagName(n)[0],a.parentNode.insertBefore(u,a))}(window,document,'script'); 5 | // Insert Twitter Pixel ID and Standard Event data below 6 | twq('init','nv8r7'); 7 | twq('track','PageView'); 8 | }); 9 | -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/satellite-5c180c4764746d101a00e3dd.js: -------------------------------------------------------------------------------- 1 | _satellite.pushAsyncScript(function(event, target, $variables){ 2 | $(window).load(function() { 3 | if(window.GetElqContentPersonalizationValue !== undefined){ 4 | var user_nextgen_affinity_stage = window.GetElqContentPersonalizationValue('C_Affinity_2_Stage1'); 5 | if(!_satellite.readCookie("buyer_journey_stage") || _satellite.readCookie("buyer_journey_stage") !== user_nextgen_affinity_stage){ 6 | //_satellite.setCookie("buyer_journey_stage", user_nextgen_affinity_stage, 365); 7 | document.cookie="buyer_journey_stage="+user_nextgen_affinity_stage+"; path=/; domain=netapp.com"; 8 | } 9 | } 10 | }); 11 | 12 | }); 13 | -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/satellite-5c8301c664746d10100059f6.js: -------------------------------------------------------------------------------- 1 | _satellite.pushAsyncScript(function(event, target, $variables){ 2 | (function(w, d, c) { 3 | w['techtargetic'] = w['techtargetic'] || {};w['techtargetic'].client = c;var s = d.createElement("script");s.type = "text/javascript";s.async = !0;s.crossorigin = "anonymous";var rd = new Date();rd=rd.getFullYear()+''+rd.getMonth()+rd.getDate();s.src = "https://trk.techtarget.com/tracking.js";var n = d.getElementsByTagName("script")[0];n.parentNode.insertBefore(s, n); 4 | })(window, document, '1263370'); 5 | }); 6 | -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/satellite-5cf18ccf64746d440100177f.js: -------------------------------------------------------------------------------- 1 | _satellite.pushAsyncScript(function(event, target, $variables){ 2 | var s = document.createElement('script'); 3 | s.setAttribute('src', 'https://www.googletagmanager.com/gtag/js?id=DC-4355326'); 4 | document.head.appendChild(s); 5 | 6 | var gtagscript = "window.dataLayer = window.dataLayer || [];"+ 7 | "function gtag(){dataLayer.push(arguments);};"+ 8 | "gtag('js', new Date());"+ 9 | "gtag('config', 'DC-4355326');"; 10 | 11 | var scr = document.createElement('script'); 12 | scr.text = gtagscript; 13 | document.head.appendChild(scr); 14 | 15 | 16 | 17 | }); 18 | -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/satellite-5d1e25cb64746d08e8003756.js: -------------------------------------------------------------------------------- 1 | _satellite.pushAsyncScript(function(event, target, $variables){ 2 | /** 3 | Start of Floodlight Tag: Please do not remove 4 | Activity name of this tag: GB | FY20 | SSS | 3 Benefits eBook | Land 5 | URL of the webpage where the tag is expected to be placed: https://www.netapp.com/us/forms/campaign/3-benefits-ebook-sap-lp.aspx 6 | This tag must be placed between the and tags, as close as possible to the opening tag. 7 | Creation Date: 04/07/2019 8 | **/ 9 | var axel = Math.random() + ""; 10 | var a = axel * 10000000000000; 11 | var dcIMG = document.createElement('iframe'); 12 | var url = document.location.href; 13 | var category, group, type; 14 | var geo = _satellite.getVar('dl.geo'); 15 | 16 | if (geo === "us" && url.indexOf('/forms/campaign/3-benefits-ebook-sap-lp.aspx') > -1) { 17 | type = "sapm70"; 18 | category = "usfy200"; 19 | } 20 | 21 | 22 | if(category && category !== undefined){ 23 | dcIMG.setAttribute('src', 'https://4355326.fls.doubleclick.net/activityi;src=4355326;type=' + type + ';cat=' + category + ';dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=;npa=;ord=1;num=' + a + '?'); 24 | 25 | dcIMG.setAttribute('height','1'); 26 | dcIMG.setAttribute('width','1'); 27 | dcIMG.setAttribute('border','0'); 28 | dcIMG.setAttribute('style','display:none'); 29 | document.body.appendChild(dcIMG); 30 | } 31 | /*** End of DoubleClick Floodlight Tag: Please do not remove ***/ 32 | }); 33 | -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/satellite-5d4c56ee64746d092a00026f.js: -------------------------------------------------------------------------------- 1 | _satellite.pushAsyncScript(function(event, target, $variables){ 2 | $.ajax({ 3 | url: '//munchkin.marketo.net/munchkin.js', 4 | dataType: 'script', 5 | cache: true, 6 | success: function() { 7 | Munchkin.init('011-TWK-636'); 8 | } 9 | }); 10 | 11 | }); 12 | -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/satellite-5d89583164746d1615000dd5.js: -------------------------------------------------------------------------------- 1 | _satellite.pushAsyncScript(function(event, target, $variables){ 2 | var s = document.createElement('script'); 3 | s.src = 'https://js.adsrvr.org/up_loader.1.1.0.js'; 4 | s.onload = initttdApi; 5 | document.head.appendChild(s); 6 | 7 | function initttdApi() { 8 | ttd_dom_ready( function() { 9 | if (typeof TTDUniversalPixelApi === 'function') { 10 | var universalPixelApi = new TTDUniversalPixelApi(); 11 | universalPixelApi.init("31zomng", ["01kuvds"], "https://insight.adsrvr.org/track/up"); 12 | } 13 | }); 14 | } 15 | 16 | 17 | 18 | 19 | }); 20 | -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/saved_resource.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/setcacookie.min.js: -------------------------------------------------------------------------------- 1 | !function(t){function n(e){if(r[e])return r[e].exports;var o=r[e]={i:e,l:!1,exports:{}};return t[e].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r={};n.m=t,n.c=r,n.i=function(t){return t},n.d=function(t,r,e){n.o(t,r)||Object.defineProperty(t,r,{configurable:!1,enumerable:!0,get:e})},n.n=function(t){var r=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(r,"a",r),r},n.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},n.p="",n(n.s=213)}({213:function(t,n,r){"use strict"}}); 2 | /* 3 | FILE ARCHIVED ON 04:54:29 Oct 04, 2019 AND RETRIEVED FROM THE 4 | INTERNET ARCHIVE ON 17:36:33 Nov 27, 2019. 5 | JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. 6 | 7 | ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. 8 | SECTION 108(a)(3)). 9 | */ 10 | /* 11 | playback timings (ms): 12 | exclusion.robots.policy: 0.131 13 | LoadShardBlock: 203.329 (3) 14 | esindex: 0.012 15 | RedisCDXSource: 17.109 16 | exclusion.robots: 0.142 17 | PetaboxLoader3.resolve: 1059.986 (2) 18 | captures_list: 234.227 19 | PetaboxLoader3.datanode: 440.082 (5) 20 | load_resource: 1317.497 21 | CDXLines.iter: 11.225 (3) 22 | */ -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/svg4everybody.min.js: -------------------------------------------------------------------------------- 1 | !function(a,b){"function"==typeof define&&define.amd?define([],function(){return a.svg4everybody=b()}):"object"==typeof exports?module.exports=b():a.svg4everybody=b()}(this,function(){/*! svg4everybody v2.0.0 | github.com/jonathantneal/svg4everybody */ 2 | function a(a,b){if(b){var c=!a.getAttribute("viewBox")&&b.getAttribute("viewBox"),d=document.createDocumentFragment(),e=b.cloneNode(!0);for(c&&a.setAttribute("viewBox",c);e.childNodes.length;)d.appendChild(e.firstChild);a.appendChild(d)}}function b(b){b.onreadystatechange=function(){if(4===b.readyState){var c=document.createElement("x");c.innerHTML=b.responseText,b.s.splice(0).map(function(b){a(b[0],c.querySelector("#"+b[1].replace(/(\W)/g,"\\$1")))})}},b.onreadystatechange()}function c(c){function d(){for(var c;c=e[0];){var j=c.parentNode;if(j&&/svg/i.test(j.nodeName)){var k=c.getAttribute("xlink:href");if(f&&(!g||g(k,j,c))){var l=k.split("#"),m=l[0],n=l[1];if(j.removeChild(c),m.length){var o=i[m]=i[m]||new XMLHttpRequest;o.s||(o.s=[],o.open("GET",m),o.send()),o.s.push([j,n]),b(o)}else a(j,document.getElementById(n))}}}h(d,17)}c=c||{};var e=document.getElementsByTagName("use"),f="polyfill"in c?c.polyfill:/\bEdge\/12\b|\bTrident\/[567]\b|\bVersion\/7.0 Safari\b/.test(navigator.userAgent)||(navigator.userAgent.match(/AppleWebKit\/(\d+)/)||[])[1]<537,g=c.validate,h=window.requestAnimationFrame||setTimeout,i={};f&&d()}return c}); 3 | /* 4 | FILE ARCHIVED ON 04:54:35 Oct 04, 2019 AND RETRIEVED FROM THE 5 | INTERNET ARCHIVE ON 17:36:34 Nov 27, 2019. 6 | JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. 7 | 8 | ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. 9 | SECTION 108(a)(3)). 10 | */ 11 | /* 12 | playback timings (ms): 13 | PetaboxLoader3.datanode: 150.254 (5) 14 | exclusion.robots.policy: 0.11 15 | RedisCDXSource: 38.182 16 | exclusion.robots: 0.119 17 | LoadShardBlock: 127.852 (3) 18 | captures_list: 193.483 19 | load_resource: 268.602 20 | PetaboxLoader3.resolve: 207.996 (2) 21 | esindex: 0.012 22 | CDXLines.iter: 14.456 (3) 23 | */ -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/timestamp.js: -------------------------------------------------------------------------------- 1 | /** timestamp namespaced methods **/ 2 | var __wbTs = (function() { 3 | function _split_timestamp(timestamp) { 4 | if(typeof timestamp == "number") { 5 | timestamp = timestamp.toString(); 6 | } 7 | return [ 8 | timestamp.slice(-14, -10), 9 | timestamp.slice(-10, -8), 10 | timestamp.slice(-8, -6), 11 | timestamp.slice(-6, -4), 12 | timestamp.slice(-4, -2), 13 | timestamp.slice(-2) 14 | ]; 15 | } 16 | var MONTHS_LONG = [ 17 | "January", "February", "March", "April", "May", "June", 18 | "July", "August", "September", "October", "November", "December" 19 | ]; 20 | var MONTHS_SHORT = [ 21 | "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", 22 | "Oct", "Nov", "Dec" 23 | ]; 24 | var FIELDS = { 25 | 'Y': function(d) { return d.getUTCFullYear() }, 26 | 'm': function(d) { return d.getUTCMonth() + 1 }, 27 | 'b': function(d) { return MONTHS_SHORT[d.getUTCMonth()] }, 28 | 'B': function(d) { return MONTHS_LONG[d.getUTCMonth()] }, 29 | 'd': function(d) { return d.getUTCDate() }, 30 | 'H': function(d) { return ('0'+d.getUTCHours()).slice(-2) }, 31 | 'M': function(d) { return ('0'+d.getUTCMinutes()).slice(-2) }, 32 | 'S': function(d) { return ('0'+d.getUTCSeconds()).slice(-2) }, 33 | '%': function() { return '%' } 34 | }; 35 | function timestamp2datetime(timestamp) { 36 | var ts_array = _split_timestamp(timestamp); 37 | return new Date(Date.UTC( 38 | ts_array[0], ts_array[1]-1, ts_array[2], 39 | ts_array[3], ts_array[4], ts_array[5] 40 | )); 41 | } 42 | return { 43 | timestamp2datetime: timestamp2datetime, 44 | getMonthName: function(mon) { 45 | return MONTHS_LONG[mon]; 46 | }, 47 | format: function(timestamp, fmt) { 48 | return fmt.replace(/%./g, function(ph) { 49 | var field = FIELDS[ph[1]]; 50 | return field ? field(timestamp2datetime(timestamp)) : ph; 51 | }); 52 | } 53 | } 54 | })(); 55 | -------------------------------------------------------------------------------- /making/netapp_website/v2/NetApp_ Data Services for Hybrid Cloud_files/wbhack.js: -------------------------------------------------------------------------------- 1 | // Wayback Machine hacks 2 | var __wbhack = new function(){ 3 | var prefix; 4 | var orig_document = { 5 | createElementNS: document.createElementNS 6 | }; 7 | this.init = function(_prefix) { 8 | this.checkCookiesNumber(); 9 | prefix = _prefix; 10 | document.createElementNS = function(ns,name) { 11 | if (ns.indexOf(prefix)==0) { 12 | ns = ns.substring(prefix.length).replace(/\/?[0-9]+\//, ''); 13 | } 14 | return orig_document.createElementNS.call(this, ns, name); 15 | }; 16 | }; 17 | this.createCookie = function(name,value,days) { 18 | if (days) { 19 | var date = new Date(); 20 | date.setTime(date.getTime()+(days*24*60*60*1000)); 21 | var expires = "; expires="+date.toGMTString(); 22 | } 23 | else var expires = ""; 24 | document.cookie = name+"="+value+expires+"; path=/"; 25 | }; 26 | this.eraseCookie = function(name) { 27 | this.createCookie(name, "", -1); 28 | }; 29 | this.checkCookiesNumber = function() { 30 | var cookies = document.cookie.split(";"); 31 | if(cookies.length > 40) { 32 | for(var i=0; i