From 6f59b8a7b94ae56ec03bce1b3cc24f651b2819b0 Mon Sep 17 00:00:00 2001 From: David Oppenheimer Date: Tue, 8 Mar 2016 14:02:31 -0800 Subject: [PATCH 01/51] Add to cluster-large.md CPU and memory consumption for master components at various cluster sizes --- docs/admin/cluster-large.md | 106 ++++++++++++++++++++++-------------- 1 file changed, 64 insertions(+), 42 deletions(-) diff --git a/docs/admin/cluster-large.md b/docs/admin/cluster-large.md index d2a208cf84..aa743bb29c 100644 --- a/docs/admin/cluster-large.md +++ b/docs/admin/cluster-large.md @@ -1,18 +1,18 @@ ---- ---- +--- +--- ## Support At {{page.version}}, Kubernetes supports clusters with up to 1000 nodes. More specifically, we support configurations that meet *all* of the following criteria: -* No more than 1000 nodes +* No more than 1000 nodes * No more than 30000 total pods -* No more than 60000 total containers -* No more than 100 pods per node - -* TOC -{:toc} +* No more than 60000 total containers +* No more than 100 pods per node + +* TOC +{:toc} ## Setup @@ -26,8 +26,8 @@ When setting up a large Kubernetes cluster, the following issues must be conside ### Quota Issues -To avoid running into cloud provider quota issues, when creating a cluster with many nodes, consider: - +To avoid running into cloud provider quota issues, when creating a cluster with many nodes, consider: + * Increase the quota for things like CPU, IPs, etc. * In [GCE, for example,](https://cloud.google.com/compute/docs/resource-quotas) you'll want to increase the quota for: * CPUs @@ -40,35 +40,57 @@ To avoid running into cloud provider quota issues, when creating a cluster with * Target pools * Gating the setup script so that it brings up new node VMs in smaller batches with waits in between, because some cloud providers rate limit the creation of VMs. -### Etcd storage - -To improve performance of large clusters, we store events in a separate dedicated etcd instance. - -When creating a cluster, existing salt scripts: - -* start and configure additional etcd instance -* configure api-server to use it for storing events - +### Etcd storage + +To improve performance of large clusters, we store events in a separate dedicated etcd instance. + +When creating a cluster, existing salt scripts: + +* start and configure additional etcd instance +* configure api-server to use it for storing events + +### Size of master and master components + +On GCE/GKE, `kube-up` automatically configures the proper VM size for your master depending on the number of nodes +in your cluster. On other providers, you will need to configure it manually. For reference, the sizes we use on GCE are +* 1-5 nodes: n1-standard-1 +* 6-10 nodes: n1-standard-2 +* 11-100 nodes: n1-standard-4 +* 101-250 nodes: n1-standard-8 +* 251-500 nodes: n1-standard-16 +* more than 500 nodes: n1-standard-32 + +We have measured the following 99th percentile resource consumption for the various master components at +(100 nodes/500 nodes/1000 nodes) cluster size: +* main etcd instance: CPU (0.135/0.241/0.312) RAM MB (242/706/1792) +* events etcd instance: CPU (0.082/0.099/0.095) RAM MB (237/746/1846) +* API server: CPU (1.233/3.0/5.9) RAM MB (895/2439/4285) +* controller manager: CPU (0.345/0.633/3.57) RAM MB (320/1624/4507) +* scheduler: CPU (0.232/1.576/1.758) RAM MB (48/167/5541) + +In a future Kubernetes release, we will set container limits based on these values, but for now these +containers do not have limits set. + ### Addon Resources To prevent memory leaks or other resource issues in [cluster addons](https://releases.k8s.io/{{page.githubbranch}}/cluster/addons) from consuming all the resources available on a node, Kubernetes sets resource limits on addon containers to limit the CPU and Memory resources they can consume (See PR [#10653](http://pr.k8s.io/10653/files) and [#10778](http://pr.k8s.io/10778/files)). For [example](https://github.com/kubernetes/kubernetes/tree/{{page.githubbranch}}/cluster/saltbase/salt/fluentd-gcp/fluentd-gcp.yaml): -```yaml +```yaml containers: - - name: fluentd-cloud-logging + - name: fluentd-cloud-logging image: gcr.io/google_containers/fluentd-gcp:1.16 resources: limits: cpu: 100m memory: 200Mi -``` - +``` + Except for Heapster, these limits are static and are based on data we collected from addons running on 4-node clusters (see [#10335](http://issue.k8s.io/10335#issuecomment-117861225)). The addons consume a lot more resources when running on large deployment clusters (see [#5880](http://issue.k8s.io/5880#issuecomment-113984085)). So, if a large cluster is deployed without adjusting these values, the addons may continuously get killed because they keep hitting the limits. -To avoid running into cluster addon resource issues, when creating a cluster with many nodes, consider the following: - +To avoid running into cluster addon resource issues, when creating a cluster with many nodes, consider the following: + * Scale memory and CPU limits for each of the following addons, if used, as you scale up the size of cluster (there is one replica of each handling the entire cluster so memory and CPU usage tends to grow proportionally with size/load on cluster): * [InfluxDB and Grafana](http://releases.k8s.io/{{page.githubbranch}}/cluster/addons/cluster-monitoring/influxdb/influxdb-grafana-controller.yaml) * [skydns, kube2sky, and dns etcd](http://releases.k8s.io/{{page.githubbranch}}/cluster/addons/dns/skydns-rc.yaml.in) @@ -79,20 +101,20 @@ To avoid running into cluster addon resource issues, when creating a cluster wit * [FluentD with ElasticSearch Plugin](http://releases.k8s.io/{{page.githubbranch}}/cluster/saltbase/salt/fluentd-es/fluentd-es.yaml) * [FluentD with GCP Plugin](http://releases.k8s.io/{{page.githubbranch}}/cluster/saltbase/salt/fluentd-gcp/fluentd-gcp.yaml) -Heapster's resource limits are set dynamically based on the initial size of your cluster (see [#16185](http://issue.k8s.io/16185) and [#21258](http://issue.k8s.io/21258)). If you find that Heapster is running -out of resources, you should adjust the formulas that compute heapster memory request (see those PRs for details). - -For directions on how to detect if addon containers are hitting resource limits, see the [Troubleshooting section of Compute Resources](/docs/user-guide/compute-resources/#troubleshooting). - -In the [future](http://issue.k8s.io/13048), we anticipate to set all cluster addon resource limits based on cluster size, and to dynamically adjust them if you grow or shrink your cluster. -We welcome PRs that implement those features. - -### Allowing minor node failure at startup - -For various reasons (see [#18969](https://github.com/kubernetes/kubernetes/issues/18969) for more details) running -`kube-up.sh` with a very large `NUM_NODES` may fail due to a very small number of nodes not coming up properly. -Currently you have two choices: restart the cluster (`kube-down.sh` and then `kube-up.sh` again), or before -running `kube-up.sh` set the environment variable `ALLOWED_NOTREADY_NODES` to whatever value you feel comfortable -with. This will allow `kube-up.sh` to succeed with fewer than `NUM_NODES` coming up. Depending on the -reason for the failure, those additional nodes may join later or the cluster may remain at a size of -`NUM_NODES - ALLOWED_NOTREADY_NODES`. +Heapster's resource limits are set dynamically based on the initial size of your cluster (see [#16185](http://issue.k8s.io/16185) and [#21258](http://issue.k8s.io/21258)). If you find that Heapster is running +out of resources, you should adjust the formulas that compute heapster memory request (see those PRs for details). + +For directions on how to detect if addon containers are hitting resource limits, see the [Troubleshooting section of Compute Resources](/docs/user-guide/compute-resources/#troubleshooting). + +In the [future](http://issue.k8s.io/13048), we anticipate to set all cluster addon resource limits based on cluster size, and to dynamically adjust them if you grow or shrink your cluster. +We welcome PRs that implement those features. + +### Allowing minor node failure at startup + +For various reasons (see [#18969](https://github.com/kubernetes/kubernetes/issues/18969) for more details) running +`kube-up.sh` with a very large `NUM_NODES` may fail due to a very small number of nodes not coming up properly. +Currently you have two choices: restart the cluster (`kube-down.sh` and then `kube-up.sh` again), or before +running `kube-up.sh` set the environment variable `ALLOWED_NOTREADY_NODES` to whatever value you feel comfortable +with. This will allow `kube-up.sh` to succeed with fewer than `NUM_NODES` coming up. Depending on the +reason for the failure, those additional nodes may join later or the cluster may remain at a size of +`NUM_NODES - ALLOWED_NOTREADY_NODES`. From df19b45ff90fdf6a50ddd0a99dd76c958f7ffec1 Mon Sep 17 00:00:00 2001 From: David Oppenheimer Date: Wed, 9 Mar 2016 00:00:51 -0800 Subject: [PATCH 02/51] Update cluster-large.md --- docs/admin/cluster-large.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/admin/cluster-large.md b/docs/admin/cluster-large.md index aa743bb29c..148bc94b34 100644 --- a/docs/admin/cluster-large.md +++ b/docs/admin/cluster-large.md @@ -51,7 +51,7 @@ When creating a cluster, existing salt scripts: ### Size of master and master components -On GCE/GKE, `kube-up` automatically configures the proper VM size for your master depending on the number of nodes +On GCE/GKE and AWS, `kube-up` automatically configures the proper VM size for your master depending on the number of nodes in your cluster. On other providers, you will need to configure it manually. For reference, the sizes we use on GCE are * 1-5 nodes: n1-standard-1 * 6-10 nodes: n1-standard-2 @@ -60,7 +60,13 @@ in your cluster. On other providers, you will need to configure it manually. For * 251-500 nodes: n1-standard-16 * more than 500 nodes: n1-standard-32 -We have measured the following 99th percentile resource consumption for the various master components at +And the sizes we use on AWS are +* 1-149 nodes: m3.medium +* more than 150 nodes: m3.large + +Note that these master node sizes are currently only set at cluster startup time, and are not adjusted if you later scale your cluster up or down. + +We have measured the following 99th percentile resource consumption for the various master components on GCE at (100 nodes/500 nodes/1000 nodes) cluster size: * main etcd instance: CPU (0.135/0.241/0.312) RAM MB (242/706/1792) * events etcd instance: CPU (0.082/0.099/0.095) RAM MB (237/746/1846) @@ -68,7 +74,7 @@ We have measured the following 99th percentile resource consumption for the vari * controller manager: CPU (0.345/0.633/3.57) RAM MB (320/1624/4507) * scheduler: CPU (0.232/1.576/1.758) RAM MB (48/167/5541) -In a future Kubernetes release, we will set container limits based on these values, but for now these +In a future Kubernetes release, we will set container resource limits based on these values, but for now these containers do not have limits set. ### Addon Resources From fd8584ce88f2d233e8601920194af6af98189664 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ragnar=20Dahl=C3=A9n?= Date: Sun, 13 Mar 2016 08:14:14 +0000 Subject: [PATCH 03/51] Fix broken link to ingress contrib tree --- docs/user-guide/ingress.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/user-guide/ingress.md b/docs/user-guide/ingress.md index 851c5ab712..c8cb42b5bc 100644 --- a/docs/user-guide/ingress.md +++ b/docs/user-guide/ingress.md @@ -43,7 +43,7 @@ Before you start using the Ingress resource, there are a few things you should u * The Ingress is a beta resource, not available in any Kubernetes release prior to 1.1. * You need an Ingress controller to satisfy an Ingress. Simply creating the resource will have no effect. -* On GCE/GKE there should be a [L7 cluster addon](https://releases.k8s.io/{{page.githubbranch}}/cluster/addons/cluster-loadbalancing/glbc/README.md#prerequisites), on other platforms you either need to write your own or [deploy an existing controller](https://github.com/kubernetes/contrib/tree/master/Ingress) as a pod. +* On GCE/GKE there should be a [L7 cluster addon](https://releases.k8s.io/{{page.githubbranch}}/cluster/addons/cluster-loadbalancing/glbc/README.md#prerequisites), on other platforms you either need to write your own or [deploy an existing controller](https://github.com/kubernetes/contrib/tree/master/ingress) as a pod. * The resource currently does not support HTTPS, but will do so before it leaves beta. ## The Ingress Resource @@ -239,7 +239,7 @@ You can achieve the same by invoking `kubectl replace -f` on a modified Ingress * Combining L4 and L7 Ingress * More Ingress controllers -Please track the [L7 and Ingress proposal](https://github.com/kubernetes/kubernetes/pull/12827) for more details on the evolution of the resource, and the [Ingress sub-repository](https://github.com/kubernetes/contrib/tree/master/Ingress) for more details on the evolution of various Ingress controllers. +Please track the [L7 and Ingress proposal](https://github.com/kubernetes/kubernetes/pull/12827) for more details on the evolution of the resource, and the [Ingress sub-repository](https://github.com/kubernetes/contrib/tree/master/ingress) for more details on the evolution of various Ingress controllers. ## Alternatives @@ -248,4 +248,4 @@ You can expose a Service in multiple ways that don't directly involve the Ingres * Use [Service.Type=LoadBalancer](/docs/user-guide/services/#type-loadbalancer) * Use [Service.Type=NodePort](/docs/user-guide/services/#type-nodeport) * Use a [Port Proxy](https://github.com/kubernetes/contrib/tree/master/for-demos/proxy-to-service) -* Deploy the [Service loadbalancer](https://github.com/kubernetes/contrib/tree/master/service-loadbalancer). This allows you to share a single IP among multiple Services and achieve more advanced loadbalancing through Service Annotations. \ No newline at end of file +* Deploy the [Service loadbalancer](https://github.com/kubernetes/contrib/tree/master/service-loadbalancer). This allows you to share a single IP among multiple Services and achieve more advanced loadbalancing through Service Annotations. From 7c81b53161b59f0f29153610834e128bb8b1fca1 Mon Sep 17 00:00:00 2001 From: David Oppenheimer Date: Sun, 13 Mar 2016 14:23:45 -0700 Subject: [PATCH 04/51] Update cluster-large.md --- docs/admin/cluster-large.md | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/docs/admin/cluster-large.md b/docs/admin/cluster-large.md index 148bc94b34..e6434cf2c3 100644 --- a/docs/admin/cluster-large.md +++ b/docs/admin/cluster-large.md @@ -53,6 +53,7 @@ When creating a cluster, existing salt scripts: On GCE/GKE and AWS, `kube-up` automatically configures the proper VM size for your master depending on the number of nodes in your cluster. On other providers, you will need to configure it manually. For reference, the sizes we use on GCE are + * 1-5 nodes: n1-standard-1 * 6-10 nodes: n1-standard-2 * 11-100 nodes: n1-standard-4 @@ -61,21 +62,15 @@ in your cluster. On other providers, you will need to configure it manually. For * more than 500 nodes: n1-standard-32 And the sizes we use on AWS are -* 1-149 nodes: m3.medium -* more than 150 nodes: m3.large -Note that these master node sizes are currently only set at cluster startup time, and are not adjusted if you later scale your cluster up or down. +* 1-5 nodes: m3.medium +* 6-10 nodes: m3.large +* 11-100 nodes: m3.xlarge +* 101-250 nodes: m3.2xlarge +* 251-500 nodes: c4.4xlarge +* more than 500 nodes: c4.8xlarge -We have measured the following 99th percentile resource consumption for the various master components on GCE at -(100 nodes/500 nodes/1000 nodes) cluster size: -* main etcd instance: CPU (0.135/0.241/0.312) RAM MB (242/706/1792) -* events etcd instance: CPU (0.082/0.099/0.095) RAM MB (237/746/1846) -* API server: CPU (1.233/3.0/5.9) RAM MB (895/2439/4285) -* controller manager: CPU (0.345/0.633/3.57) RAM MB (320/1624/4507) -* scheduler: CPU (0.232/1.576/1.758) RAM MB (48/167/5541) - -In a future Kubernetes release, we will set container resource limits based on these values, but for now these -containers do not have limits set. +Note that these master node sizes are currently only set at cluster startup time, and are not adjusted if you later scale your cluster up or down (e.g. manually removing or adding nodes, or using a cluster autoscaler). ### Addon Resources From 9df5b9ea564473c669b4974ea73be7d983791d3a Mon Sep 17 00:00:00 2001 From: Rodrigo Campos Date: Mon, 14 Mar 2016 12:20:27 -0300 Subject: [PATCH 05/51] Fix kube-controller-manager description The item and their description was shown as different items at the same indentation level. This just moves de description so it's clear it is not a new item and is just the description of the previous item. --- docs/admin/cluster-components.md | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/docs/admin/cluster-components.md b/docs/admin/cluster-components.md index bde4d5334f..5c7c4c2699 100644 --- a/docs/admin/cluster-components.md +++ b/docs/admin/cluster-components.md @@ -44,15 +44,11 @@ process. These controllers include: -* Node Controller - * Responsible for noticing & responding when nodes go down. -* Replication Controller - * Responsible for maintaining the correct number of pods for every replication - controller object in the system. -* Endpoints Controller - * Populates the Endpoints object (i.e., join Services & Pods). -* Service Account & Token Controllers - * Create default accounts and API access tokens for new namespaces. +* Node Controller: Responsible for noticing & responding when nodes go down. +* Replication Controller: Responsible for maintaining the correct number of pods for every replication + controller object in the system. +* Endpoints Controller: Populates the Endpoints object (i.e., join Services & Pods). +* Service Account & Token Controllers: Create default accounts and API access tokens for new namespaces. * ... and others. ### kube-scheduler From 57f75e5e2b0ec73e87ac6869e89415d9b75e5b66 Mon Sep 17 00:00:00 2001 From: Rodrigo Campos Date: Mon, 14 Mar 2016 12:35:24 -0300 Subject: [PATCH 06/51] Fix listing kubelet responsabilities --- docs/admin/cluster-components.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/admin/cluster-components.md b/docs/admin/cluster-components.md index bde4d5334f..31520e7f93 100644 --- a/docs/admin/cluster-components.md +++ b/docs/admin/cluster-components.md @@ -110,14 +110,15 @@ the Kubernetes runtime environment. ### kubelet [kubelet](/docs/admin/kubelet) is the primary node agent. It: + * Watches for pods that have been assigned to its node (either by apiserver or via local configuration file) and: - * Mounts the pod's required volumes - * Downloads the pod's secrets - * Run the pod's containers via docker (or, experimentally, rkt). - * Periodically executes any requested container liveness probes. - * Reports the status of the pod back to the rest of the system, by creating a - "mirror pod" if necessary. +* Mounts the pod's required volumes +* Downloads the pod's secrets +* Run the pod's containers via docker (or, experimentally, rkt). +* Periodically executes any requested container liveness probes. +* Reports the status of the pod back to the rest of the system, by creating a + "mirror pod" if necessary. * Reports the status of the node back to the rest of the system. ### kube-proxy From 7a2327ec8c0205880858b717f62f03ee7b554965 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20L=C3=BCbken?= Date: Mon, 14 Mar 2016 16:49:14 +0100 Subject: [PATCH 07/51] Update binary_release.md Added instructions to use the homebrew package manager on OS X. There is an official formula which is also relatively uptodate: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/kubernetes-cli.rb --- docs/getting-started-guides/binary_release.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/getting-started-guides/binary_release.md b/docs/getting-started-guides/binary_release.md index 1df329d620..667b5f025d 100644 --- a/docs/getting-started-guides/binary_release.md +++ b/docs/getting-started-guides/binary_release.md @@ -12,6 +12,8 @@ The list of binary releases is available for download from the [GitHub Kubernete Download the latest release and unpack this tar file on Linux or OS X, cd to the created `kubernetes/` directory, and then follow the getting started guide for your cloud. +On OS X you can also use the [homebrew](http://brew.sh/) package manager: `brew install kubernetes-cli` + ### Building from source Get the Kubernetes source. If you are simply building a release from source there is no need to set up a full golang environment as all building happens in a Docker container. From 3671bebbeddba318cbff48cade34afc8d00d3177 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20L=C3=BCbken?= Date: Mon, 14 Mar 2016 17:08:38 +0100 Subject: [PATCH 08/51] Spelling in guides.yml Spelling acheive => achieve --- _data/guides.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_data/guides.yml b/_data/guides.yml index 9599485100..59f44d7123 100644 --- a/_data/guides.yml +++ b/_data/guides.yml @@ -1,5 +1,5 @@ bigheader: "Guides" -abstract: "How to get started, and acheive tasks, using Kubernetes" +abstract: "How to get started, and achieve tasks, using Kubernetes" toc: - title: Guides path: /docs/ From a112e4ae7effac82d37b62b889ad2bbc9359782d Mon Sep 17 00:00:00 2001 From: Vladimir Rutsky Date: Mon, 14 Mar 2016 20:11:30 +0300 Subject: [PATCH 09/51] remove trailing commas from JSON Fixes JSON highlighting. --- docs/admin/node.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/admin/node.md b/docs/admin/node.md index b3a346b4bb..13332012b8 100644 --- a/docs/admin/node.md +++ b/docs/admin/node.md @@ -61,8 +61,8 @@ the following conditions mean the node is in sane state: "conditions": [ { "kind": "Ready", - "status": "True", - }, + "status": "True" + } ] ``` From 85034e809072ccd5b0e5e9e356567e8159697329 Mon Sep 17 00:00:00 2001 From: chrismarino Date: Mon, 14 Mar 2016 11:28:30 -0700 Subject: [PATCH 10/51] Added Romana to the list of networking alternatives. --- docs/admin/networking.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/admin/networking.md b/docs/admin/networking.md index 12b65e2be6..814d90b7ec 100644 --- a/docs/admin/networking.md +++ b/docs/admin/networking.md @@ -177,8 +177,12 @@ network, primarily aiming at Docker integration. [Calico](https://github.com/projectcalico/calico-containers) uses BGP to enable real container IPs. +### Romana + +[Romana](https://romana.io) is an open source software defined networking (SDN) solution that lets you deploy Kubernetes without an overlay network. + ## Other reading The early design of the networking model and its rationale, and some future plans are described in more detail in the [networking design -document](https://github.com/kubernetes/kubernetes/blob/{{page.githubbranch}}/docs/design/networking.md). \ No newline at end of file +document](https://github.com/kubernetes/kubernetes/blob/{{page.githubbranch}}/docs/design/networking.md). From bb54f78e2a31456756fc9c6f774e59e863975f07 Mon Sep 17 00:00:00 2001 From: chrismarino Date: Mon, 14 Mar 2016 11:50:23 -0700 Subject: [PATCH 11/51] Removed. Breaks Github Pages... --- CNAME | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CNAME b/CNAME index ed60cf1824..8b13789179 100644 --- a/CNAME +++ b/CNAME @@ -1,2 +1 @@ -kubernetes.io -kubernet.es + From b9faac2e09e8be799d1c1e0663195745d12e488d Mon Sep 17 00:00:00 2001 From: chrismarino Date: Mon, 14 Mar 2016 11:55:41 -0700 Subject: [PATCH 12/51] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1583e70c0a..2eecb4c8ab 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,8 @@ Welcome! We are very pleased you want to contribute to the documentation and/or You can click the "Fork" button in the upper-right area of the screen to create a copy of our site on your GitHub account called a "fork." Make any changes you want in your fork, and when you are ready to send those changes to us, go to the index page for your fork and click "New Pull Request" to let us know about it. -If you want to see your changes staged without having to install anything locally, -change your fork of our repo to be named: +If you want to see your changes staged without having to install anything locally, remove the CNAME file in this directory and +change the name of the fork of our repo to be named: YOUR_GITHUB_USERNAME.github.io From 3c814a9629f0e040abc426cc6459333b2a96a223 Mon Sep 17 00:00:00 2001 From: chrismarino Date: Mon, 14 Mar 2016 11:59:54 -0700 Subject: [PATCH 13/51] Misc.. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2eecb4c8ab..73e88cb3b4 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Welcome! We are very pleased you want to contribute to the documentation and/or You can click the "Fork" button in the upper-right area of the screen to create a copy of our site on your GitHub account called a "fork." Make any changes you want in your fork, and when you are ready to send those changes to us, go to the index page for your fork and click "New Pull Request" to let us know about it. If you want to see your changes staged without having to install anything locally, remove the CNAME file in this directory and -change the name of the fork of our repo to be named: +change the name of the fork to be: YOUR_GITHUB_USERNAME.github.io From e67856d224982219c17862270ea088ecc094d724 Mon Sep 17 00:00:00 2001 From: Eric Chiang Date: Mon, 14 Mar 2016 13:57:08 -0700 Subject: [PATCH 14/51] docs/admin: add context to authz webhook example kubeconfig --- docs/admin/authorization.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/admin/authorization.md b/docs/admin/authorization.md index 5442aeb726..2571fb94a8 100644 --- a/docs/admin/authorization.md +++ b/docs/admin/authorization.md @@ -161,6 +161,14 @@ users: user: client-certificate: /path/to/cert.pem # cert for the webhook plugin to use client-key: /path/to/key.pem # key matching the cert + +# kubeconfig files require a context. Provide one for the API Server. +current-context: webhook +contexts: +- context: + cluster: name-of-remote-authz-service + user: name-of-api-sever + name: webhook ``` ### Request Payloads From 8f52948ca63ce3dec50e8785ebf0be8565a23667 Mon Sep 17 00:00:00 2001 From: johndmulhausen Date: Tue, 15 Mar 2016 12:20:19 -0700 Subject: [PATCH 15/51] Update troubleshooting.md --- docs/troubleshooting.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index bf0c90e007..08735e20f5 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -10,11 +10,11 @@ Sometimes things go wrong. This guide is aimed at making them right. It has tw You should also check the [known issues](/docs/user-guide/known-issues) for the release you're using. -# Getting help +### Getting help If your problem isn't answered by any of the guides above, there are variety of ways for you to get help from the Kubernetes team. -## Questions +### Questions If you aren't familiar with it, many of your questions may be answered by the [user guide](/docs/user-guide/). @@ -29,21 +29,21 @@ You may also find the Stack Overflow topics relevant: * [Kubernetes](http://stackoverflow.com/questions/tagged/kubernetes) * [Google Container Engine - GKE](http://stackoverflow.com/questions/tagged/google-container-engine) -# Help! My question isn't covered! I need help now! +## Help! My question isn't covered! I need help now! -## Stack Overflow +### Stack Overflow Someone else from the community may have already asked a similar question or may be able to help with your problem. The Kubernetes team will also monitor [posts tagged kubernetes](http://stackoverflow.com/questions/tagged/kubernetes). If there aren't any existing questions that help, please [ask a new one](http://stackoverflow.com/questions/ask?tags=kubernetes)! -## Slack +### Slack The Kubernetes team hangs out on Slack in the `#kubernetes-users` channel. You can participate in the Kubernetes team [here](https://kubernetes.slack.com). Slack requires registration, but the Kubernetes team is open invitation to anyone to register [here](http://slack.kubernetes.io). Feel free to come and ask any and all questions. -## Mailing List +### Mailing List The Google Container Engine mailing list is [google-containers@googlegroups.com](https://groups.google.com/forum/#!forum/google-containers) -## Bugs and Feature requests +### Bugs and Feature requests If you have what looks like a bug, or you would like to make a feature request, please use the [Github issue tracking system](https://github.com/kubernetes/kubernetes/issues). From 08c0f1025fa71d942ae3575996a9b14e3594860c Mon Sep 17 00:00:00 2001 From: Janet Kuo Date: Mon, 14 Mar 2016 17:20:00 -0700 Subject: [PATCH 16/51] Update deployment document to fit what's in beta release --- docs/user-guide/bad-nginx-deployment.yaml | 16 + docs/user-guide/deployments.md | 414 ++++++++++++++++------ 2 files changed, 320 insertions(+), 110 deletions(-) create mode 100644 docs/user-guide/bad-nginx-deployment.yaml diff --git a/docs/user-guide/bad-nginx-deployment.yaml b/docs/user-guide/bad-nginx-deployment.yaml new file mode 100644 index 0000000000..70afeaf2ee --- /dev/null +++ b/docs/user-guide/bad-nginx-deployment.yaml @@ -0,0 +1,16 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: nginx-deployment +spec: + replicas: 3 + template: + metadata: + labels: + app: nginx + spec: + containers: + - name: nginx + image: nginx:1.91 + ports: + - containerPort: 80 diff --git a/docs/user-guide/deployments.md b/docs/user-guide/deployments.md index e5e0b33c88..a1a45fa507 100644 --- a/docs/user-guide/deployments.md +++ b/docs/user-guide/deployments.md @@ -6,7 +6,7 @@ ## What is a _Deployment_? -A _Deployment_ provides declarative updates for Pods and ReplicationControllers. +A _Deployment_ provides declarative updates for Pods and ReplicaSets. Users describe the desired state in a Deployment object, and the deployment controller changes the actual state to the desired state at a controlled rate. Users can define Deployments to create new resources, or replace existing ones @@ -14,66 +14,64 @@ by new ones. A typical use case is: -* Create a Deployment to bring up a replication controller and pods. +* Create a Deployment to bring up a replica set and pods. * Later, update that Deployment to recreate the pods (for example, to use a new image). +* Rollback to an earlier Deployment revision if the current Deployment isn't stable. +* Pause and resume a Deployment. ## Creating a Deployment -Here is an example Deployment. It creates a replication controller to +Here is an example Deployment. It creates a replica set to bring up 3 nginx pods. {% include code.html language="yaml" file="nginx-deployment.yaml" ghlink="/docs/user-guide/nginx-deployment.yaml" %} Run the example by downloading the example file and then running this command: -```shell -$ kubectl create -f docs/user-guide/nginx-deployment.yaml +```console +$ kubectl create -f docs/user-guide/nginx-deployment.yaml --record deployment "nginx-deployment" created ``` -Running +Setting the kubectl flag `--record` to `true` allows you to record current command in the annotations of the resources being created or updated. It will be useful for future introspection; for example, to see the commands executed in each Deployment revision. -```shell +Then running `get` immediately will give: + +```console $ kubectl get deployments +NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE +nginx-deployment 3 0 0 0 1s ``` -immediately will give: +This indicates that the Deployment's number of desired replicas is 3 (according to deployment's `.spec.replicas`), the number of current replicas (`.status.replicas`) is 0, the number of up-to-date replicas (`.status.updatedReplicas`) is 0, and the number of available replicas (`.status.availableReplicas`) is also 0. -```shell +Running the `get` again a few seconds later, should give: + +```console $ kubectl get deployments -NAME UPDATEDREPLICAS AGE -nginx-deployment 0/3 8s +NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE +nginx-deployment 3 3 3 3 18s ``` -This indicates that the Deployment is trying to update 3 replicas, and has not updated any of them yet. +This indicates that the Deployment has created all three replicas, and all replicas are up-to-date (contains the latest pod template) and available (pod status is ready for at least deployment's `.spec.minReadySeconds`). Running `kubectl get rs` and `kubectl get pods` will show the replica set (RS) and pods created. -Running the `get` again after a minute, should give: - -```shell -$ kubectl get deployments -NAME UPDATEDREPLICAS AGE -nginx-deployment 3/3 1m +```console +$ kubectl get rs +NAME DESIRED CURRENT AGE +nginx-deployment-2035384211 3 3 18s ``` -This indicates that the Deployment has created all three replicas. -Running `kubectl get rc` and `kubectl get pods` will show the replication controller (RC) and pods created. +You may notice that the name of the replica set is always `-`. -```shell -$ kubectl get rc -CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS AGE -REPLICAS AGE -deploymentrc-1975012602 nginx nginx:1.7.9 pod-template-hash=1975012602,app=nginx 3 2m +```console +$ kubectl get pods --show-labels +NAME READY STATUS RESTARTS AGE LABELS +nginx-deployment-2035384211-7ci7o 1/1 Running 0 18s app=nginx,pod-template-hash=2035384211 +nginx-deployment-2035384211-kzszj 1/1 Running 0 18s app=nginx,pod-template-hash=2035384211 +nginx-deployment-2035384211-qqcnn 1/1 Running 0 18s app=nginx,pod-template-hash=2035384211 ``` -```shell -$ kubectl get pods -NAME READY STATUS RESTARTS AGE -deploymentrc-1975012602-4f2tb 1/1 Running 0 1m -deploymentrc-1975012602-j975u 1/1 Running 0 1m -deploymentrc-1975012602-uashb 1/1 Running 0 1m -``` - -The created RC will ensure that there are three nginx pods at all times. +The created replica set will ensure that there are three nginx pods at all times. ## Updating a Deployment @@ -83,120 +81,301 @@ For this, we update our deployment file as follows: {% include code.html language="yaml" file="new-nginx-deployment.yaml" ghlink="/docs/user-guide/new-nginx-deployment.yaml" %} -We can then `apply` the Deployment: +We can then `apply` the new Deployment: -```shell +```console $ kubectl apply -f docs/user-guide/new-nginx-deployment.yaml deployment "nginx-deployment" configured ``` -Running a `get` immediately will still give: +Alternatively, we can `edit` the Deployment and change `.spec.template.spec.containers[0].image` from `nginx:1.7.9` to `nginx:1.9.1`: -```shell -$ kubectl get deployments -NAME UPDATEDREPLICAS AGE -nginx-deployment 3/3 8s +```console +$ kubectl edit deployment/nginx-deployment +deployment "nginx-deployment" edited ``` -This indicates that deployment status has not been updated yet (it is still -showing old status). -Running a `get` again after a minute, should show: +Running a `get` immediately will give: -```shell +```console $ kubectl get deployments -NAME UPDATEDREPLICAS AGE -nginx-deployment 1/3 1m +NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE +nginx-deployment 3 3 0 3 20s ``` -This indicates that the Deployment has updated one of the three pods that it needs -to update. -Eventually, it will update all the pods. +The 0 number of up-to-date replicas indicates that the deployment hasn't updated the replicas to the latest configuration. The current replicas indicates the total replicas (3 with old configuration and 0 with new configuration) this Deployment manages, and the available replicas indicates the number of current replicas that are available. -```shell +The Deployment will update all the pods in a few seconds. + +```console $ kubectl get deployments -NAME UPDATEDREPLICAS AGE -nginx-deployment 3/3 3m +NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE +nginx-deployment 3 3 3 3 36s ``` -We can run `kubectl get rc` to see that the Deployment updated the pods by creating a new RC, -which it scaled up to 3 replicas, and has scaled down the old RC to 0 replicas. +We can run `kubectl get rs` to see that the Deployment updated the pods by creating a new replica set and scaling it up to 3 replicas, as well as scaling down the old replica set to 0 replicas. -```shell -kubectl get rc -CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS AGE -deploymentrc-1562004724 nginx nginx:1.9.1 pod-template-hash=1562004724,app=nginx 3 5m -deploymentrc-1975012602 nginx nginx:1.7.9 pod-template-hash=1975012602,app=nginx 0 7m +```console +$ kubectl get rs +NAME DESIRED CURRENT AGE +nginx-deployment-1564180365 3 3 6s +nginx-deployment-2035384211 0 0 36s ``` Running `get pods` should now show only the new pods: -```shell -kubectl get pods -NAME READY STATUS RESTARTS AGE -deploymentrc-1562004724-0tgk5 1/1 Running 0 9m -deploymentrc-1562004724-1rkfl 1/1 Running 0 8m -deploymentrc-1562004724-6v702 1/1 Running 0 8m +```console +$ kubectl get pods +NAME READY STATUS RESTARTS AGE +nginx-deployment-1564180365-khku8 1/1 Running 0 14s +nginx-deployment-1564180365-nacti 1/1 Running 0 14s +nginx-deployment-1564180365-z9gth 1/1 Running 0 14s ``` -Next time we want to update these pods, we can just update and re-apply the Deployment again. +Next time we want to update these pods, we only need to update and re-apply the Deployment again. -Deployment ensures that not all pods are down while they are being updated. By -default, it ensures that minimum of 1 less than the desired number of pods are -up. For example, if you look at the above deployment closely, you will see that +Deployment can ensure that only a certain number of pods may be down while they are being updated. By +default, it ensures that at least 1 less than the desired number of pods are +up (1 max unavailable). + +Deployment can also ensure that only a certain number of pods may be created above the desired number of pods. By default, it ensures that at most 1 more than the desired number of pods are up (1 max surge). + +For example, if you look at the above deployment closely, you will see that it first created a new pod, then deleted some old pods and created new ones. It -does not kill old pods until a sufficient number of new pods have come up. +does not kill old pods until a sufficient number of new pods have come up, and does not create new pods until a sufficient number of old pods have been killed. It makes sure that number of available pods is at least 2 and the number of total pods is at most 4. -```shell +```console $ kubectl describe deployments -Name: nginx-deployment -Namespace: default -CreationTimestamp: Thu, 22 Oct 2015 17:58:49 -0700 -Labels: app=nginx-deployment -Selector: app=nginx -Replicas: 3 updated / 3 total -StrategyType: RollingUpdate -RollingUpdateStrategy: 1 max unavailable, 1 max surge, 0 min ready seconds -OldReplicationControllers: deploymentrc-1562004724 (3/3 replicas created) -NewReplicationController: +Name: nginx-deployment +Namespace: default +CreationTimestamp: Tue, 15 Mar 2016 12:01:06 -0700 +Labels: app=nginx +Selector: app=nginx +Replicas: 3 updated | 3 total | 3 available | 0 unavailable +StrategyType: RollingUpdate +MinReadySeconds: 0 +RollingUpdateStrategy: 1 max unavailable, 1 max surge +OldReplicaSets: +NewReplicaSet: nginx-deployment-1564180365 (3/3 replicas created) Events: - FirstSeen LastSeen Count From SubobjectPath Reason Message - 10m 10m 1 {deployment-controller } ScalingRC Scaled up rc deploymentrc-1975012602 to 3 - 2m 2m 1 {deployment-controller } ScalingRC Scaled up rc deploymentrc-1562004724 to 1 - 2m 2m 1 {deployment-controller } ScalingRC Scaled down rc deploymentrc-1975012602 to 1 - 1m 1m 1 {deployment-controller } ScalingRC Scaled up rc deploymentrc-1562004724 to 3 - 1m 1m 1 {deployment-controller } ScalingRC Scaled down rc deploymentrc-1975012602 to 0 + FirstSeen LastSeen Count From SubobjectPath Type Reason Message + --------- -------- ----- ---- ------------- -------- ------ ------- + 36s 36s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-2035384211 to 3 + 23s 23s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 1 + 23s 23s 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-2035384211 to 2 + 23s 23s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 2 + 21s 21s 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-2035384211 to 0 + 21s 21s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 3 ``` -Here we see that when we first created the Deployment, it created an RC and scaled it up to 3 replicas directly. -When we updated the Deployment, it created a new RC and scaled it up to 1 and then scaled down the old RC by 1, so that at least 2 pods were available at all times. -It then scaled up the new RC to 3 and when those pods were ready, it scaled down the old RC to 0. +Here we see that when we first created the Deployment, it created a replica set (nginx-deployment-2035384211) and scaled it up to 3 replicas directly. +When we updated the Deployment, it created a new replica set (nginx-deployment-1564180365) and scaled it up to 1 and then scaled down the old replica set to 2, so that at least 2 pods were available and at most 4 pods were created at all times. +It then continued scaling up and down the new and the old replica set, with the same rolling update strategy. Finally, we'll have 3 available replicas in the new replica set, and the old replica set is scaled down to 0. ### Multiple Updates -Each time a new deployment object is observed, a replication controller is -created to bring up the desired pods if there is no existing RC doing so. -Existing RCs controlling pods whose labels match `.spec.selector` but whose +Each time a new deployment object is observed by the deployment controller, a replica set is +created to bring up the desired pods if there is no existing replica set doing so. +Existing replica set controlling pods whose labels match `.spec.selector` but whose template does not match `.spec.template` are scaled down. -Eventually, the new RC will be scaled to `.spec.replicas` and all old RCs will +Eventually, the new replica set will be scaled to `.spec.replicas` and all old replica sets will be scaled to 0. If the user updates a Deployment while an existing deployment is in progress, -the Deployment will create a new RC as per the update and start scaling that up, and -will roll the RC that it was scaling up previously-- it will add it to its list of old RCs and will +the Deployment will create a new replica set as per the update and start scaling that up, and +will roll the replica set that it was scaling up previously -- it will add it to its list of old replica sets and will start scaling it down. -For example, suppose the user creates a deployment to create 5 replicas of `nginx:1.7.9`, -but then updates the deployment to create 5 replicas of `nginx:1.9.1`, when only 3 -replicas of `nginx:1.7.9` had been created. In that case, deployment will immediately start +For example, suppose the user creates a Deployment to create 5 replicas of `nginx:1.7.9`, +but then updates the Deployment to create 5 replicas of `nginx:1.9.1`, when only 3 +replicas of `nginx:1.7.9` had been created. In that case, Deployment will immediately start killing the 3 `nginx:1.7.9` pods that it had created, and will start creating `nginx:1.9.1` pods. It will not wait for 5 replicas of `nginx:1.7.9` to be created before changing course. +## Rolling Back a Deployment + +Sometimes we may want to rollback a Deployment; for example, when the previous Deployment is crash looping. + +Suppose that we made a typo while updating the Deployment, by putting the image name as `nginx:1.91` instead of `nginx:1.9.1`: + +```console +$ kubectl apply -f docs/user-guide/bad-nginx-deployment.yaml +deployment "nginx-deployment" configured +``` + +You will see that both the number of old replicas (nginx-deployment-1564180365 and nginx-deployment-2035384211) and new replicas (nginx-deployment-3066724191) are 2. + +```console +$ kubectl get rs +NAME DESIRED CURRENT AGE +nginx-deployment-1564180365 2 2 25s +nginx-deployment-2035384211 0 0 36s +nginx-deployment-3066724191 2 2 6s +``` + +Looking at the pods created, you will see that the 2 pods created by new replica set are crash looping. + +```console +$ kubectl get pods +NAME READY STATUS RESTARTS AGE +nginx-deployment-1564180365-70iae 1/1 Running 0 25s +nginx-deployment-1564180365-jbqqo 1/1 Running 0 25s +nginx-deployment-3066724191-08mng 0/1 ImagePullBackOff 0 6s +nginx-deployment-3066724191-eocby 0/1 ImagePullBackOff 0 6s +``` + +Note that the Deployment controller will stop the bad rollout automatically, and will stop scaling up the new replica set. + +```console +$ kubectl describe deployment +Name: nginx-deployment +Namespace: default +CreationTimestamp: Tue, 15 Mar 2016 14:48:04 -0700 +Labels: app=nginx +Selector: app=nginx +Replicas: 2 updated | 3 total | 2 available | 2 unavailable +StrategyType: RollingUpdate +MinReadySeconds: 0 +RollingUpdateStrategy: 1 max unavailable, 1 max surge +OldReplicaSets: nginx-deployment-1564180365 (2/2 replicas created) +NewReplicaSet: nginx-deployment-3066724191 (2/2 replicas created) +Events: + FirstSeen LastSeen Count From SubobjectPath Type Reason Message + --------- -------- ----- ---- ------------- -------- ------ ------- + 1m 1m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-2035384211 to 3 + 22s 22s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 1 + 22s 22s 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-2035384211 to 2 + 22s 22s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 2 + 21s 21s 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-2035384211 to 0 + 21s 21s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 3 + 13s 13s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-3066724191 to 1 + 13s 13s 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-1564180365 to 2 + 13s 13s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-3066724191 to 2 +``` + +To fix this, we need to rollback to a previous revision of Deployment that is stable. + +First, check the revisions of this deployment: + +```console +$ kubectl rollout history deployment/nginx-deployment +deployments "nginx-deployment": +REVISION CHANGE-CAUSE +1 kubectl create -f docs/user-guide/nginx-deployment.yaml --record +2 kubectl apply -f docs/user-guide/new-nginx-deployment.yaml +3 kubectl apply -f docs/user-guide/bad-nginx-deployment.yaml +``` + +Because we recorded the command while creating this Deployment using `--record`, we can easily see the changes we made in each revision. + +To further see the details of each revision, run: + +```console +$ kubectl rollout history deployment/nginx-deployment --revision=2 +deployments "nginx-deployment" revision 2 +Labels: app=nginx,pod-template-hash=1564180365 +Annotations: kubernetes.io/change-cause=kubectl apply -f docs/user-guide/new-nginx-deployment.yaml +Image(s): nginx:1.9.1 +No volumes. +``` + +Now we've decided to undo the current rollout and rollback to the previous revision: + +```console +$ kubectl rollout undo deployment/nginx-deployment +deployment "nginx-deployment" rolled back +``` + +Alternatively, you can rollback to a specific revision by specify that in `--to-revision`: + +```console +$ kubectl rollout undo deployment/nginx-deployment --to-revision=2 +deployment "nginx-deployment" rolled back +``` + +The Deployment is now rolled back to a previous stable revision. As you can see, a `DeploymentRollback` event for rolling back to revision 2 is generated from Deployment controller. + +```console +$ kubectl get deployment +NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE +nginx-deployment 3 3 3 3 30m +$ kubectl describe deployment +Name: nginx-deployment +Namespace: default +CreationTimestamp: Tue, 15 Mar 2016 14:48:04 -0700 +Labels: app=nginx +Selector: app=nginx +Replicas: 3 updated | 3 total | 3 available | 0 unavailable +StrategyType: RollingUpdate +MinReadySeconds: 0 +RollingUpdateStrategy: 1 max unavailable, 1 max surge +OldReplicaSets: +NewReplicaSet: nginx-deployment-1564180365 (3/3 replicas created) +Events: + FirstSeen LastSeen Count From SubobjectPath Type Reason Message + --------- -------- ----- ---- ------------- -------- ------ ------- + 30m 30m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-2035384211 to 3 + 29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 1 + 29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-2035384211 to 2 + 29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 2 + 29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-2035384211 to 0 + 29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-3066724191 to 2 + 29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-3066724191 to 1 + 29m 29m 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-1564180365 to 2 + 2m 2m 1 {deployment-controller } Normal ScalingReplicaSet Scaled down replica set nginx-deployment-3066724191 to 0 + 2m 2m 1 {deployment-controller } Normal DeploymentRollback Rolled back deployment "nginx-deployment" to revision 2 + 29m 2m 2 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set nginx-deployment-1564180365 to 3 +``` + +## Pausing and Resuming a Deployment + +You can also pause a Deployment mid-way and then resume it. A use case is to support canary deployment. + +Update the Deployment again and then pause the Deployment with `kubectl rollout pause`: + +```console +$ kubectl apply -f docs/user-guide/new-nginx-deployment; kubectl rollout pause deployment/nginx-deployment +deployment "nginx-deployment" configured +deployment "nginx-deployment" paused +``` + +Note that any current state of the Deployment will continue its function, but new updates to the Deployment will not have an effect as long as the Deployment is paused. + +The Deployment was still in progress when we paused it, so the actions of scaling up and down replica sets are paused too. + +```console +$ kubectl get rs +NAME DESIRED CURRENT AGE +nginx-deployment-1564180365 2 2 1h +nginx-deployment-2035384211 2 2 1h +nginx-deployment-3066724191 0 0 1h +``` + +To resume the Deployment, simply do `kubectl rollout resume`: + +```console +$ kubectl rollout resume deployment/nginx-deployment +deployment "nginx-deployment" resumed +``` + +Then the Deployment will continue and finish the rollout: + +```console +$ kubectl get rs +NAME DESIRED CURRENT AGE +nginx-deployment-1564180365 3 3 1h +nginx-deployment-2035384211 0 0 1h +nginx-deployment-3066724191 0 0 1h +``` + +Note: A paused Deployment cannot be scaled at this moment, and we will add this feature in 1.3 release, see [issue #20853](https://github.com/kubernetes/kubernetes/issues/20853). You cannot rollback a paused Deployment either, and you should resume a Deployment first before doing a rollback. + ## Writing a Deployment Spec As with all other Kubernetes configs, a Deployment needs `apiVersion`, `kind`, and `metadata` fields. For general information about working with config files, -see [here](/docs/user-guide/deploying-applications), [here](/docs/user-guide/configuring-containers), and [here](/docs/user-guide/working-with-resources). +see [deploying applications](/docs/user-guide/deploying-applications), [configuring containers](/docs/user-guide/configuring-containers), and [using kubectl to manage resources](/docs/user-guide/working-with-resources) documents. A Deployment also needs a [`.spec` section](https://github.com/kubernetes/kubernetes/tree/{{page.githubbranch}}/docs/devel/api-conventions.md#spec-and-status). @@ -231,13 +410,12 @@ the default value. All existing pods are killed before new ones are created when `.spec.strategy.type==Recreate`. -__Note: This is not implemented yet__. #### Rolling Update Deployment The Deployment updates pods in a [rolling update](/docs/user-guide/update-demo/) fashion when `.spec.strategy.type==RollingUpdate`. -Users can specify `maxUnavailable`, `maxSurge` and `minReadySeconds` to control +Users can specify `maxUnavailable` and `maxSurge` to control the rolling update process. ##### Max Unavailable @@ -250,9 +428,9 @@ The absolute number is calculated from percentage by rounding up. This can not be 0 if `.spec.strategy.rollingUpdate.maxSurge` is 0. By default, a fixed value of 1 is used. -For example, when this value is set to 30%, the old RC can be scaled down to +For example, when this value is set to 30%, the old replica set can be scaled down to 70% of desired pods immediately when the rolling update starts. Once new pods are -ready, old RC can be scaled down further, followed by scaling up the new RC, +ready, old replica set can be scaled down further, followed by scaling up the new replica set, ensuring that the total number of pods available at all times during the update is at least 70% of the desired pods. @@ -266,13 +444,13 @@ This can not be 0 if `MaxUnavailable` is 0. The absolute number is calculated from percentage by rounding up. By default, a value of 1 is used. -For example, when this value is set to 30%, the new RC can be scaled up immediately when +For example, when this value is set to 30%, the new replica set can be scaled up immediately when the rolling update starts, such that the total number of old and new pods do not exceed 130% of desired pods. Once old pods have been killed, -the new RC can be scaled up further, ensuring that the total number of pods running +the new replica set can be scaled up further, ensuring that the total number of pods running at any time during the update is at most 130% of desired pods. -##### Min Ready Seconds +### Min Ready Seconds `.spec.minReadySeconds` is an optional field that specifies the minimum number of seconds for which a newly created pod should be ready @@ -280,9 +458,25 @@ without any of its containers crashing, for it to be considered available. This defaults to 0 (the pod will be considered available as soon as it is ready). To learn more about when a pod is considered ready, see [Container Probes](/docs/user-guide/pod-states/#container-probes). +### Rollback To + +`.spec.rollbackTo` is an optional field with the configuration the Deployment is rolling back to. Setting this field will trigger a rollback, and this field will be cleared every time a rollback is done. + +#### Revision + +`.spec.rollbackTo.revision` is an optional field specifying the revision to rollback to. This defaults to 0, meaning rollback to the last revision in history. + +### Revision History Limit + +`.spec.revisionHistoryLimit` is an optional field that specifies the number of old replica sets to retain to allow rollback. All old replica sets will be kept by default, if this field is not set. The configuration of each Deployment revision is stored in its replica sets; therefore, once an old replica set is deleted, you lose the ability to rollback to that revision of Deployment. + +### Paused + +`.spec.paused` is an optional boolean field for pausing and resuming a Deployment. It defaults to false (a Deployment is not paused). + ## Alternative to Deployments ### kubectl rolling update -[Kubectl rolling update](/docs/user-guide/kubectl/kubectl_rolling-update) also updates pods and replication controllers in a similar fashion. -But deployments is declarative and is server side. \ No newline at end of file +[Kubectl rolling update](/docs/user-guide/kubectl/kubectl_rolling-update) updates pods and replication controllers in a similar fashion. +But deployments is recommended, since it's declarative and is server side, and has more features, such as rolling back to any previous revision even after the rolling update is done. Also, replica sets supersede replication controllers. From 091138f6fea1d24ed4d281f2766d5089966c3bac Mon Sep 17 00:00:00 2001 From: Justin Santa Barbara Date: Tue, 15 Mar 2016 23:07:47 -0400 Subject: [PATCH 17/51] Use ${HOME} for homedir This allows for copying and pasting, and avoids an OS X specific path. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1583e70c0a..84a4e6fcd8 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ First install rvm Then load it into your environment - source /Users/(USERNAME)/.rvm/scripts/rvm (or whatever is prompted by the installer) + source ${HOME}/.rvm/scripts/rvm (or whatever is prompted by the installer) Then install Ruby 2.2 or higher From ae1c3349a1cc74f39bc077f488dee96b2ba2fe4d Mon Sep 17 00:00:00 2001 From: Alex Robinson Date: Wed, 16 Mar 2016 00:22:52 -0700 Subject: [PATCH 18/51] Fix typo in table of contents for the reference docs. --- _data/reference.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_data/reference.yml b/_data/reference.yml index fa675d0a82..94557a1cfe 100644 --- a/_data/reference.yml +++ b/_data/reference.yml @@ -155,7 +155,7 @@ toc: - title: kube-proxy CLI path: /docs/admin/kube-proxy/ -- title: kub-scheduler CLI +- title: kube-scheduler CLI path: /docs/admin/kube-scheduler/ - title: kubelet CLI From e0fd5c5cc0c4821eae82ce9e8b849026b144afc5 Mon Sep 17 00:00:00 2001 From: "Madhusudan.C.S" Date: Wed, 16 Mar 2016 00:32:03 -0700 Subject: [PATCH 19/51] Fix kube-scheduler typo in the menu. --- _data/reference.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_data/reference.yml b/_data/reference.yml index fa675d0a82..94557a1cfe 100644 --- a/_data/reference.yml +++ b/_data/reference.yml @@ -155,7 +155,7 @@ toc: - title: kube-proxy CLI path: /docs/admin/kube-proxy/ -- title: kub-scheduler CLI +- title: kube-scheduler CLI path: /docs/admin/kube-scheduler/ - title: kubelet CLI From 0753c5191a876e1cca6642db10d28a5a6bf1406a Mon Sep 17 00:00:00 2001 From: Beni Cherniavsky-Paskin Date: Wed, 16 Mar 2016 15:05:33 +0200 Subject: [PATCH 20/51] Fix broken labels -> node-selection link http://kubernetes.io/docs/user-guide/labels/node-selection// doesn't exist; http://kubernetes.io/docs/user-guide/node-selection/ does. --- docs/user-guide/labels.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user-guide/labels.md b/docs/user-guide/labels.md index 6e6f0bd1a4..86df0df9af 100644 --- a/docs/user-guide/labels.md +++ b/docs/user-guide/labels.md @@ -165,4 +165,4 @@ selector: #### Selecting sets of nodes One use case for selecting over labels is to constrain the set of nodes onto which a pod can schedule. -See the documentation on [node selection](node-selection/README.md) for more information. +See the documentation on [node selection](/docs/user-guide/node-selection) for more information. From 8cc7f9831971ab71f6c1da820c64fc513e3a599a Mon Sep 17 00:00:00 2001 From: johndmulhausen Date: Wed, 16 Mar 2016 14:52:06 -0700 Subject: [PATCH 21/51] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 88cea0f2be..9905f71795 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ .jekyll-metadata _site/** .sass-cache/** +CNAME From 55315a39afda2581543c1435f8df1c7e2590ac7a Mon Sep 17 00:00:00 2001 From: Chris Marino Date: Wed, 16 Mar 2016 15:02:41 -0700 Subject: [PATCH 22/51] Revert "Removed. Breaks Github Pages..." This reverts commit bb54f78e2a31456756fc9c6f774e59e863975f07. --- CNAME | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CNAME b/CNAME index 8b13789179..ed60cf1824 100644 --- a/CNAME +++ b/CNAME @@ -1 +1,2 @@ - +kubernetes.io +kubernet.es From 0e301395503709df12579f9f684cce6ef923c77e Mon Sep 17 00:00:00 2001 From: Janet Kuo Date: Wed, 16 Mar 2016 15:12:30 -0700 Subject: [PATCH 23/51] Update deployment user guide --- docs/user-guide/deployments.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/user-guide/deployments.md b/docs/user-guide/deployments.md index a1a45fa507..6b7f0e6221 100644 --- a/docs/user-guide/deployments.md +++ b/docs/user-guide/deployments.md @@ -7,9 +7,9 @@ ## What is a _Deployment_? A _Deployment_ provides declarative updates for Pods and ReplicaSets. -Users describe the desired state in a Deployment object, and the deployment -controller changes the actual state to the desired state at a controlled rate. -Users can define Deployments to create new resources, or replace existing ones +You only need to describe the desired state in a Deployment object, and the deployment +controller will change the actual state to the desired state at a controlled rate for you. +You can define Deployments to create new resources, or replace existing ones by new ones. A typical use case is: @@ -181,12 +181,12 @@ template does not match `.spec.template` are scaled down. Eventually, the new replica set will be scaled to `.spec.replicas` and all old replica sets will be scaled to 0. -If the user updates a Deployment while an existing deployment is in progress, +If you update a Deployment while an existing deployment is in progress, the Deployment will create a new replica set as per the update and start scaling that up, and will roll the replica set that it was scaling up previously -- it will add it to its list of old replica sets and will start scaling it down. -For example, suppose the user creates a Deployment to create 5 replicas of `nginx:1.7.9`, +For example, suppose you create a Deployment to create 5 replicas of `nginx:1.7.9`, but then updates the Deployment to create 5 replicas of `nginx:1.9.1`, when only 3 replicas of `nginx:1.7.9` had been created. In that case, Deployment will immediately start killing the 3 `nginx:1.7.9` pods that it had created, and will start creating @@ -195,7 +195,7 @@ before changing course. ## Rolling Back a Deployment -Sometimes we may want to rollback a Deployment; for example, when the previous Deployment is crash looping. +Sometimes we may want to rollback a Deployment; for example, when the Deployment is not stable, such as crash looping. Suppose that we made a typo while updating the Deployment, by putting the image name as `nginx:1.91` instead of `nginx:1.9.1`: @@ -214,7 +214,7 @@ nginx-deployment-2035384211 0 0 36s nginx-deployment-3066724191 2 2 6s ``` -Looking at the pods created, you will see that the 2 pods created by new replica set are crash looping. +Looking at the pods created, you will see that the 2 pods created by new replica set are stuck in an image pull loop. ```console $ kubectl get pods @@ -415,7 +415,7 @@ All existing pods are killed before new ones are created when The Deployment updates pods in a [rolling update](/docs/user-guide/update-demo/) fashion when `.spec.strategy.type==RollingUpdate`. -Users can specify `maxUnavailable` and `maxSurge` to control +You can specify `maxUnavailable` and `maxSurge` to control the rolling update process. ##### Max Unavailable From a2654c126a0fd44bfbf52ed0e18ae3f68ba67e7d Mon Sep 17 00:00:00 2001 From: Eric Tune Date: Wed, 16 Mar 2016 15:32:54 -0700 Subject: [PATCH 24/51] spell a numeral --- docs/user-guide/jobs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/user-guide/jobs.md b/docs/user-guide/jobs.md index e2fd8a8a2c..494caf91d8 100644 --- a/docs/user-guide/jobs.md +++ b/docs/user-guide/jobs.md @@ -11,7 +11,7 @@ As pods successfully complete, the _job_ tracks the successful completions. Whe of successful completions is reached, the job itself is complete. Deleting a Job will cleanup the pods it created. -A simple case is to create 1 Job object in order to reliably run one Pod to completion. +A simple case is to create one Job object in order to reliably run one Pod to completion. The Job object will start a new Pod if the first pod fails or is deleted (for example due to a node hardware failure or a node reboot). @@ -342,4 +342,4 @@ similar functionality will be supported. ## Future work Support for creating Jobs at specified times/dates (i.e. cron) is expected in the next minor -release. \ No newline at end of file +release. From c8dd8b8831db5cd7c862ac5631c4414a53ac021c Mon Sep 17 00:00:00 2001 From: johndmulhausen Date: Wed, 16 Mar 2016 15:54:34 -0700 Subject: [PATCH 25/51] Import from Container Engine docs, addition of Tabs functionality, various link fixes --- README.md | 16 + _data/guides.yml | 14 + _data/support.yml | 2 + _includes/head-header.html | 4 +- _includes/tabs.html | 17 + _sass/_base.sass | 62 ++- css/jquery-ui.min.css | 7 + css/jquery-ui.structure.min.css | 5 + css/jquery-ui.theme.min.css | 5 + docs/admin/networking.md | 8 +- docs/getting-started-guides/scratch.md | 14 +- ...ugging-pods-and-replication-controllers.md | 105 ++++ docs/user-guide/debugging-services.md | 61 ++- docs/user-guide/load-balancer.md | 73 +++ docs/user-guide/pods/_viewing-a-pod.md | 58 ++ docs/user-guide/{pods.md => pods/index.md} | 0 docs/user-guide/pods/multi-container.md | 175 ++++++ docs/user-guide/pods/pod-config.json | 18 + docs/user-guide/pods/pod-config.yaml | 12 + docs/user-guide/pods/pod-sample.json | 32 ++ docs/user-guide/pods/pod-sample.yaml | 16 + docs/user-guide/pods/pod-spec-common.json | 44 ++ docs/user-guide/pods/pod-spec-common.yaml | 31 ++ docs/user-guide/pods/single-container.md | 88 +++ .../index.md} | 8 +- .../replication-controller/operations.md | 226 ++++++++ .../replication.yaml | 0 .../resizing-a-replication-controller.md | 33 ++ docs/user-guide/rolling-updates.md | 127 +++++ .../{services.md => services/index.md} | 4 + .../services/load-balancer-sample.json | 17 + .../services/load-balancer-sample.yaml | 12 + docs/user-guide/services/operations.md | 161 ++++++ docs/user-guide/services/service-sample.json | 16 + docs/user-guide/services/service-sample.yaml | 11 + .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin 0 -> 418 bytes .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin 0 -> 312 bytes .../jquery-ui/ui-bg_flat_10_000000_40x100.png | Bin 0 -> 205 bytes .../ui-bg_glass_100_f6f6f6_1x400.png | Bin 0 -> 262 bytes .../ui-bg_glass_100_fdf5ce_1x400.png | Bin 0 -> 348 bytes .../jquery-ui/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 207 bytes .../ui-bg_gloss-wave_35_f6a828_500x100.png | Bin 0 -> 5815 bytes .../ui-bg_highlight-soft_100_eeeeee_1x100.png | Bin 0 -> 278 bytes .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin 0 -> 328 bytes images/jquery-ui/ui-icons_222222_256x240.png | Bin 0 -> 6922 bytes images/jquery-ui/ui-icons_228ef1_256x240.png | Bin 0 -> 4549 bytes images/jquery-ui/ui-icons_444444_256x240.png | Bin 0 -> 6992 bytes images/jquery-ui/ui-icons_555555_256x240.png | Bin 0 -> 6988 bytes images/jquery-ui/ui-icons_777620_256x240.png | Bin 0 -> 4549 bytes images/jquery-ui/ui-icons_777777_256x240.png | Bin 0 -> 6999 bytes images/jquery-ui/ui-icons_cc0000_256x240.png | Bin 0 -> 4549 bytes images/jquery-ui/ui-icons_ef8c08_256x240.png | Bin 0 -> 4549 bytes images/jquery-ui/ui-icons_ffd27a_256x240.png | Bin 0 -> 4549 bytes images/jquery-ui/ui-icons_ffffff_256x240.png | Bin 0 -> 6299 bytes jquery-ui.html | 513 ++++++++++++++++++ js/jquery-ui.min.js | 13 + 56 files changed, 1974 insertions(+), 34 deletions(-) create mode 100644 _includes/tabs.html create mode 100644 css/jquery-ui.min.css create mode 100644 css/jquery-ui.structure.min.css create mode 100644 css/jquery-ui.theme.min.css create mode 100644 docs/user-guide/debugging-pods-and-replication-controllers.md create mode 100644 docs/user-guide/load-balancer.md create mode 100644 docs/user-guide/pods/_viewing-a-pod.md rename docs/user-guide/{pods.md => pods/index.md} (100%) create mode 100644 docs/user-guide/pods/multi-container.md create mode 100644 docs/user-guide/pods/pod-config.json create mode 100644 docs/user-guide/pods/pod-config.yaml create mode 100644 docs/user-guide/pods/pod-sample.json create mode 100644 docs/user-guide/pods/pod-sample.yaml create mode 100644 docs/user-guide/pods/pod-spec-common.json create mode 100644 docs/user-guide/pods/pod-spec-common.yaml create mode 100644 docs/user-guide/pods/single-container.md rename docs/user-guide/{replication-controller.md => replication-controller/index.md} (98%) create mode 100644 docs/user-guide/replication-controller/operations.md rename docs/user-guide/{ => replication-controller}/replication.yaml (100%) create mode 100644 docs/user-guide/resizing-a-replication-controller.md create mode 100644 docs/user-guide/rolling-updates.md rename docs/user-guide/{services.md => services/index.md} (99%) create mode 100644 docs/user-guide/services/load-balancer-sample.json create mode 100644 docs/user-guide/services/load-balancer-sample.yaml create mode 100644 docs/user-guide/services/operations.md create mode 100644 docs/user-guide/services/service-sample.json create mode 100644 docs/user-guide/services/service-sample.yaml create mode 100755 images/jquery-ui/ui-bg_diagonals-thick_18_b81900_40x40.png create mode 100755 images/jquery-ui/ui-bg_diagonals-thick_20_666666_40x40.png create mode 100755 images/jquery-ui/ui-bg_flat_10_000000_40x100.png create mode 100755 images/jquery-ui/ui-bg_glass_100_f6f6f6_1x400.png create mode 100755 images/jquery-ui/ui-bg_glass_100_fdf5ce_1x400.png create mode 100755 images/jquery-ui/ui-bg_glass_65_ffffff_1x400.png create mode 100755 images/jquery-ui/ui-bg_gloss-wave_35_f6a828_500x100.png create mode 100755 images/jquery-ui/ui-bg_highlight-soft_100_eeeeee_1x100.png create mode 100755 images/jquery-ui/ui-bg_highlight-soft_75_ffe45c_1x100.png create mode 100755 images/jquery-ui/ui-icons_222222_256x240.png create mode 100755 images/jquery-ui/ui-icons_228ef1_256x240.png create mode 100644 images/jquery-ui/ui-icons_444444_256x240.png create mode 100644 images/jquery-ui/ui-icons_555555_256x240.png create mode 100644 images/jquery-ui/ui-icons_777620_256x240.png create mode 100644 images/jquery-ui/ui-icons_777777_256x240.png create mode 100644 images/jquery-ui/ui-icons_cc0000_256x240.png create mode 100755 images/jquery-ui/ui-icons_ef8c08_256x240.png create mode 100755 images/jquery-ui/ui-icons_ffd27a_256x240.png create mode 100644 images/jquery-ui/ui-icons_ffffff_256x240.png create mode 100755 jquery-ui.html create mode 100755 js/jquery-ui.min.js diff --git a/README.md b/README.md index 1583e70c0a..f502dfa44f 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,22 @@ To include a file that is hosted in the external, main Kubernetes repo, make sur * `PATHFROMK8SROOT`: The path to the file relative to the root of [the Kubernetes repo](https://github.com/kubernetes/kubernetes/tree/release-1.2), e.g. `/examples/rbd/foo.yaml` +## Using tabs for multi-language examples + +By specifying some inline CSV in a varable called `tabspec`, you can include a file +called `tabs.html` that generates tabs showing code examples in multiple langauges. + +
{% capture tabspec %}servicesample
+JSON,json,service-sample.json,/docs/user-guide/services/service-sample.json
+YAML,yaml,service-sample.yaml,/docs/user-guide/services/service-sample.yaml{% endcapture %}
+{% include tabs.html %}
+ +In English, this would read: "Create a set of tabs with the alias `servicesample`, +and have tabs visually labeled "JSON" and "YAML" that use `json` and `yaml` Rouge syntax highlighting, which display the contents of +`service-sample.{extension}` on the page, and link to the file in GitHub at (full path)." + +Example file: [Pods: Multi-Container](/docs/user-guide/pods/multi-container/). + ## Use a global variable The `/_config.yml` file defines some useful variables you can use when editing docs. diff --git a/_data/guides.yml b/_data/guides.yml index 59f44d7123..502c7a8dad 100644 --- a/_data/guides.yml +++ b/_data/guides.yml @@ -132,6 +132,12 @@ toc: path: /docs/getting-started-guides/scratch/ - title: Authenticating Across Clusters with kubeconfig path: /docs/user-guide/kubeconfig-file/ + - title: Replication Controller Operations + path: /docs/user-guide/replication-controller/operations/ + - title: Resizing a Replication Controller + path: /docs/user-guide/resizing-a-replication-controller/ + - title: Service Operations + path: /docs/user-guide/services/operations/ - title: Using Nodes, Pods, and Containers section: @@ -147,6 +153,10 @@ toc: path: /docs/user-guide/getting-into-containers/ - title: The Lifecycle of a Pod path: /docs/user-guide/pod-states/ + - title: Creating Single-Container Pods + path: /docs/user-guide/pods/single-container/ + - title: Creating Multi-Container Pods + path: /docs/user-guide/pods/multi-container/ - title: Pod Templates path: /docs/user-guide/pod-templates/ - title: Assigning Pods to Nodes @@ -166,6 +176,8 @@ toc: section: - title: Networking in Kubernetes path: /docs/admin/networking/ + - title: Creating an External Load Balancer + path: /docs/user-guide/load-balancer/ - title: Using DNS Pods and Services path: /docs/admin/dns/ - title: Setting Up and Configuring DNS @@ -224,6 +236,8 @@ toc: path: /docs/user-guide/managing-deployments/ - title: Deploying Applications path: /docs/user-guide/deploying-applications/ + - title: Updating Applications with Rolling Updates + path: /docs/user-guide/rolling-updates/ - title: Launching, Exposing, and Killing Applications path: /docs/user-guide/quick-start/ diff --git a/_data/support.yml b/_data/support.yml index 6b7daa8e3f..410e24e17c 100644 --- a/_data/support.yml +++ b/_data/support.yml @@ -6,6 +6,8 @@ toc: - title: Troubleshooting section: + - title: Debugging Pods and Replication Controllers + path: /docs/user-guide/debugging-pods-and-replication-controllers/ - title: Web Interface path: /docs/user-guide/ui/ - title: Application Introspection and Debugging diff --git a/_includes/head-header.html b/_includes/head-header.html index 2a1eddb715..f4e81637d5 100644 --- a/_includes/head-header.html +++ b/_includes/head-header.html @@ -4,9 +4,11 @@ - + + + Kubernetes - {{ title }} diff --git a/_includes/tabs.html b/_includes/tabs.html new file mode 100644 index 0000000000..ff672be6ad --- /dev/null +++ b/_includes/tabs.html @@ -0,0 +1,17 @@ +{% assign tabsraw = tabspec | newline_to_br | split: '
' %} +{% assign tabsetname = tabsraw[0] %} + +
+ + {% for tab in tabsraw offset:1 %} + {% assign thisTab = tab | split: ',' %} + {% assign tabLang=thisTab[1] %} + {% assign tabFile=thisTab[2] %} + {% assign tabGHLink=thisTab[3] %} +
+ {% include code.html language=tabLang file=tabFile ghlink=tabGHLink %} +
+ {% endfor %} +
\ No newline at end of file diff --git a/_sass/_base.sass b/_sass/_base.sass index 7f23e8a1fa..4d45a61c83 100644 --- a/_sass/_base.sass +++ b/_sass/_base.sass @@ -120,7 +120,7 @@ header top: 0 left: 0 transform: none - background-image: url(../images/nav_logo.svg) + background-image: url(/images/nav_logo.svg) background-size: contain background-position: center center background-repeat: no-repeat @@ -133,7 +133,7 @@ header left: 20px width: 50px height: 50px - background-image: url(../images/toc_icon.png) + background-image: url(/images/toc_icon.png) background-position: center center background-repeat: no-repeat background-size: auto @@ -152,11 +152,11 @@ header display: block width: 45px height: 44px - background-image: url(../images/favicon.png) + background-image: url(/images/favicon.png) &.flip-nav .flyout-button - background-image: url(../images/toc_icon_grey.png) + background-image: url(/images/toc_icon_grey.png) .nav-buttons @@ -295,7 +295,7 @@ header // HERO #hero - background-image: url(../images/texture.png) + background-image: url(/images/texture.png) background-color: $dark-grey text-align: center padding-left: 0 @@ -321,7 +321,7 @@ header // FOOTER footer width: 100% - background-image: url(../images/texture.png) + background-image: url(/images/texture.png) background-color: $dark-grey main @@ -373,7 +373,7 @@ footer .social a display: inline-block - background-image: url(../images/social_sprite.png) + background-image: url(/images/social_sprite.png) background-repeat: no-repeat background-size: auto width: 50px @@ -845,7 +845,7 @@ dd white-space: nowrap text-indent: 50px overflow: hidden - background: $blue url(../images/pencil.png) no-repeat + background: $blue url(/images/pencil.png) no-repeat background-position: 1px 1px background-size: auto @@ -929,7 +929,7 @@ $feature-box-div-margin-bottom: 40px #home &.flip-nav, &.open-nav .logo - background-image: url(../images/nav_logo2.svg) + background-image: url(/images/nav_logo2.svg) #hero margin-bottom: 0 @@ -979,7 +979,7 @@ $feature-box-div-margin-bottom: 40px #video width: 100% position: relative - background-image: url(../images/kub_video_thm.jpg) + background-image: url(/images/kub_video_thm.jpg) background-position: center center background-size: cover @@ -1084,7 +1084,7 @@ $feature-box-div-margin-bottom: 40px #features padding-top: 140px background-color: $light-grey - background-image: url(../images/wheel.png) + background-image: url(/images/wheel.png) background-position: center 60px background-repeat: no-repeat background-size: auto @@ -1124,7 +1124,7 @@ $feature-box-div-margin-bottom: 40px #community &.open-nav, &.flip-nav .logo - background-image: url(../images/nav_logo2.svg) + background-image: url(/images/nav_logo2.svg) #hero padding-bottom: 20px @@ -1175,6 +1175,30 @@ $feature-box-div-margin-bottom: 40px width: 100% height: 100% +// Tabs +.ui-widget-header + background: transparent !important + background-color: transparent !important + border: 0px !important + +.ui-tabs + ul, ol, li + padding: 0px !important + list-style: none !important + margin-bottom: 0px !important + margin-left: 1px !important + +.ui-widget-content + border: 0px !important + +.ui-widget-content + table + margin: 0px !important + +.ui-tabs .ui-tabs-panel + padding: 0px !important + border: 1px solid #ccc !important + // Talk to us #talkToUs h3, h4 @@ -1203,16 +1227,16 @@ $feature-box-div-margin-bottom: 40px background-repeat: no-repeat div:nth-child(1) - background-image: url(../images/twitter_icon.png) + background-image: url(/images/twitter_icon.png) div:nth-child(2) - background-image: url(../images/github_icon.png) + background-image: url(/images/github_icon.png) div:nth-child(3) - background-image: url(../images/slack_icon.png) + background-image: url(/images/slack_icon.png) div:nth-child(4) - background-image: url(../images/stackoverflow_icon.png) + background-image: url(/images/stackoverflow_icon.png) div + div margin-top: 20px @@ -1240,10 +1264,10 @@ $feature-box-div-margin-bottom: 40px padding-top: 125px div:nth-child(1) - background-image: url(../images/community_logos/viacom_logo.png) + background-image: url(/images/community_logos/viacom_logo.png) div:nth-child(2) - background-image: url(../images/community_logos/ebay_logo.png) + background-image: url(/images/community_logos/ebay_logo.png) div:nth-child(3) - background-image: url(../images/community_logos/wikimedia_foundation_logo.png) + background-image: url(/images/community_logos/wikimedia_foundation_logo.png) \ No newline at end of file diff --git a/css/jquery-ui.min.css b/css/jquery-ui.min.css new file mode 100644 index 0000000000..f13bef32a4 --- /dev/null +++ b/css/jquery-ui.min.css @@ -0,0 +1,7 @@ +/*! jQuery UI - v1.11.4 - 2016-03-15 +* http://jqueryui.com +* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgColorHover=ededed&bgTextureHover=flat&borderColorHover=cccccc&fcHover=2b2b2b&iconColorHover=555555&bgColorActive=007fff&bgTextureActive=flat&borderColorActive=003eff&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fffa90&bgTextureHighlight=flat&borderColorHighlight=dad55e&fcHighlight=777620&iconColorHighlight=777620&bgColorError=fddfdf&bgTextureError=flat&borderColorError=f1a899&fcError=5f3f3f&iconColorError=cc0000&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=666666&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=5px&offsetTopShadow=0px&offsetLeftShadow=0px&cornerRadiusShadow=8px +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,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");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#2b2b2b;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("/images/jquery-ui/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("/images/jquery-ui/ui-icons_444444_256x240.png")}.ui-state-default .ui-icon{background-image:url("/images/jquery-ui/ui-icons_777777_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("/images/jquery-ui/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon{background-image:url("/images/jquery-ui/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("/images/jquery-ui/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("/images/jquery-ui/ui-icons_cc0000_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:0 0 0 0;padding:5px;background:#666;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px} \ No newline at end of file diff --git a/css/jquery-ui.structure.min.css b/css/jquery-ui.structure.min.css new file mode 100644 index 0000000000..92f0049af2 --- /dev/null +++ b/css/jquery-ui.structure.min.css @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.11.4 - 2016-03-13 +* http://jqueryui.com +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px} \ No newline at end of file diff --git a/css/jquery-ui.theme.min.css b/css/jquery-ui.theme.min.css new file mode 100644 index 0000000000..a7e0b94f99 --- /dev/null +++ b/css/jquery-ui.theme.min.css @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.11.4 - 2016-03-15 +* http://jqueryui.com +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#2b2b2b;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("/images/jquery-ui/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("/images/jquery-ui/ui-icons_444444_256x240.png")}.ui-state-default .ui-icon{background-image:url("/images/jquery-ui/ui-icons_777777_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("/images/jquery-ui/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon{background-image:url("/images/jquery-ui/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("/images/jquery-ui/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("/images/jquery-ui/ui-icons_cc0000_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:0 0 0 0;padding:5px;background:#666;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px} \ No newline at end of file diff --git a/docs/admin/networking.md b/docs/admin/networking.md index 12b65e2be6..1bede3d87c 100644 --- a/docs/admin/networking.md +++ b/docs/admin/networking.md @@ -5,10 +5,10 @@ Kubernetes approaches networking somewhat differently than Docker does by default. There are 4 distinct networking problems to solve: 1. Highly-coupled container-to-container communications: this is solved by - [pods](/docs/user-guide/pods) and `localhost` communications. + [pods](/docs/user-guide/pods/) and `localhost` communications. 2. Pod-to-Pod communications: this is the primary focus of this document. -3. Pod-to-Service communications: this is covered by [services](/docs/user-guide/services). -4. External-to-Service communications: this is covered by [services](/docs/user-guide/services). +3. Pod-to-Service communications: this is covered by [services](/docs/user-guide/services/). +4. External-to-Service communications: this is covered by [services](/docs/user-guide/services/). * TOC {:toc} @@ -102,7 +102,7 @@ here. ### Google Compute Engine (GCE) For the Google Compute Engine cluster configuration scripts, we use [advanced -routing](https://developers.google.com/compute/docs/networking#routing) to +routing](https://cloud.google.com/compute/docs/networking#routing) to assign each VM a subnet (default is `/24` - 254 IPs). Any traffic bound for that subnet will be routed directly to the VM by the GCE network fabric. This is in addition to the "main" IP address assigned to the VM, which is NAT'ed for diff --git a/docs/getting-started-guides/scratch.md b/docs/getting-started-guides/scratch.md index 98945817f2..8271ab278a 100644 --- a/docs/getting-started-guides/scratch.md +++ b/docs/getting-started-guides/scratch.md @@ -795,18 +795,18 @@ Notes for setting up each cluster service are given below: * Cluster DNS: * required for many kubernetes examples - * [Setup instructions](http://releases.k8s.io/release-1.2/cluster/addons/dns/) - * [Admin Guide](../admin/dns.md) + * [Setup instructions](http://releases.k8s.io/{{page.githubbranch}}/cluster/addons/dns/) + * [Admin Guide](/admin/dns/) * Cluster-level Logging * Multiple implementations with different storage backends and UIs. - * [Elasticsearch Backend Setup Instructions](http://releases.k8s.io/release-1.2/cluster/addons/fluentd-elasticsearch/) - * [Google Cloud Logging Backend Setup Instructions](http://releases.k8s.io/release-1.2/cluster/addons/fluentd-gcp/). + * [Elasticsearch Backend Setup Instructions](http://releases.k8s.io/{{page.githubbranch}}/cluster/addons/fluentd-elasticsearch/) + * [Google Cloud Logging Backend Setup Instructions](http://releases.k8s.io/{{page.githubbranch}}/cluster/addons/fluentd-gcp/). * Both require running fluentd on each node. - * [User Guide](../user-guide/logging.md) + * [User Guide](/user-guide/logging/) * Container Resource Monitoring - * [Setup instructions](http://releases.k8s.io/release-1.2/cluster/addons/cluster-monitoring/) + * [Setup instructions](http://releases.k8s.io/{{page.githubbranch}}/cluster/addons/cluster-monitoring/) * GUI - * [Setup instructions](http://releases.k8s.io/release-1.2/cluster/addons/kube-ui/) + * [Setup instructions](http://releases.k8s.io/{{page.githubbranch}}/cluster/addons/kube-ui/) cluster. ## Troubleshooting diff --git a/docs/user-guide/debugging-pods-and-replication-controllers.md b/docs/user-guide/debugging-pods-and-replication-controllers.md new file mode 100644 index 0000000000..bee382d0ea --- /dev/null +++ b/docs/user-guide/debugging-pods-and-replication-controllers.md @@ -0,0 +1,105 @@ +--- +--- + +* TOC +{:toc} + +## Debugging pods + +The first step in debugging a pod is taking a look at it. Check the current +state of the pod and recent events with the following command: + + $ kubectl describe pods ${POD_NAME} + +Look at the state of the containers in the pod. Are they all `Running`? Have +there been recent restarts? + +Continue debugging depending on the state of the pods. + +### My pod stays pending + +If a pod is stuck in `Pending` it means that it can not be scheduled onto a +node. Generally this is because there are insufficient resources of one type or +another that prevent scheduling. Look at the output of the `kubectl describe +...` command above. There should be messages from the scheduler about why it +can not schedule your pod. Reasons include: + +#### Insufficient resources + +You may have exhausted the supply of CPU or Memory in your cluster. In this +case you can try several things: + +* [Add more nodes](/docs/admin/cluster-management/#resizing-a-cluster) to the cluster. + +* [Terminate unneeded pods](/docs/user-guide/pods/single-container/#deleting_a_pod) + to make room for pending pods. + +* Check that the pod is not larger than your nodes. For example, if all + nodes have a capacity of `cpu:1`, then a pod with a limit of `cpu: 1.1` + will never be scheduled. + + You can check node capacities with the `kubectl get nodes -o ` + command. Here are some example command lines that extract just the necessary + information: + + kubectl get nodes -o yaml | grep '\sname\|cpu\|memory' + kubectl get nodes -o json | jq '.items[] | {name: .metadata.name, cap: .status.capacity}' + + The [resource quota](/docs/admin/resource-quota/) + feature can be configured to limit the total amount of + resources that can be consumed. If used in conjunction with namespaces, it can + prevent one team from hogging all the resources. + +#### Using hostPort + +When you bind a pod to a `hostPort` there are a limited number of places that +the pod can be scheduled. In most cases, `hostPort` is unnecessary; try using a +service object to expose your pod. If you do require `hostPort` then you can +only schedule as many pods as there are nodes in your container cluster. + +### My pod stays waiting + +If a pod is stuck in the `Waiting` state, then it has been scheduled to a +worker node, but it can't run on that machine. Again, the information from +`kubectl describe ...` should be informative. The most common cause of +`Waiting` pods is a failure to pull the image. There are three things to check: + +* Make sure that you have the name of the image correct. +* Have you pushed the image to the repository? +* Run a manual `docker pull ` on your machine to see if the image can be + pulled. + +### My pod is crashing or otherwise unhealthy + +First, take a look at the logs of the current container: + + $ kubectl logs ${POD_NAME} ${CONTAINER_NAME} + +If your container has previously crashed, you can access the previous +container's crash log with: + + $ kubectl logs --previous ${POD_NAME} ${CONTAINER_NAME} + +Alternately, you can run commands inside that container with `exec`: + + $ kubectl exec ${POD_NAME} -c ${CONTAINER_NAME} -- ${CMD} ${ARG1} ${ARG2} ... ${ARGN} + +Note that `-c ${CONTAINER_NAME}` is optional and can be omitted for pods that +only contain a single container. + +As an example, to look at the logs from a running Cassandra pod, you might run: + + $ kubectl exec cassandra -- cat /var/log/cassandra/system.log + +If none of these approaches work, you can find the host machine that the pod is +running on and SSH into that host. + +## Debugging Replication Controllers + +Replication controllers are fairly straightforward. They can either create pods +or they can't. If they can't create pods, then please refer to the +[instructions above](#debugging_pods) to debug your pods. + +You can also use `kubectl describe rc ${CONTROLLER_NAME}` to inspect events +related to the replication controller. + diff --git a/docs/user-guide/debugging-services.md b/docs/user-guide/debugging-services.md index 790f15f71b..4fa6f2dbe7 100644 --- a/docs/user-guide/debugging-services.md +++ b/docs/user-guide/debugging-services.md @@ -9,7 +9,6 @@ This document will hopefully help you to figure out what's going wrong. * TOC {:toc} - ## Conventions Throughout this doc you will see various commands that you can run. Some @@ -506,6 +505,66 @@ Setting endpoints for default/hostnames:default to [10.244.0.5:9376 10.244.0.6:9 If you don't see those, try restarting `kube-proxy` with the `-V` flag set to 4, and then look at the logs again. +Services provide load balancing across a set of pods. There are several common +problems that can make services not work properly. The following instructions +should help debug service problems. + +First, verify that there are endpoints for the service. For every service +object, the apiserver makes an `endpoints` resource available. + +You can view this resource with: + + $ kubectl get endpoints ${SERVICE_NAME} + +Make sure that the endpoints match up with the number of containers that you +expect to be a member of your service. For example, if your service is for an +nginx container with 3 replicas, you would expect to see three different IP +addresses in the service's endpoints. + +### My service is missing endpoints + +If you are missing endpoints, try listing pods using the labels that service +uses. Imagine that you have a service where the labels are: + + ... + spec: + - selector: + name: nginx + type: frontend + +You can use: + + $ kubectl get pods --selector=name=nginx,type=frontend + +to list pods that match this selector. Verify that the list matches the pods +that you expect to provide your service. + +If the list of pods matches expectations, but your endpoints are still empty, +it's possible that you don't have the right ports exposed. If your service has +a `containerPort` specified, but the pods that are selected don't have that +port listed, then they won't be added to the endpoints list. + +Verify that the pod's `containerPort` matches up with the service's +`containerPort`. + +### Network traffic is not forwarded + +If you can connect to the service, but the connection is immediately dropped, +and there are endpoints in the endpoints list, it's likely that the proxy can't +contact your pods. + +There are three things to check: + +* Are your pods working correctly? Look for restart count, and + [debug pods](#debugging_pods). + +* Can you connect to your pods directly? Get the IP address for the pod, and + try to connect directly to that IP. + +* Is your application serving on the port that you configured? Container + Engine doesn't do port remapping, so if your application serves on 8080, + the `containerPort` field needs to be 8080. + ## Seek help If you get this far, something very strange is happening. Your `Service` is diff --git a/docs/user-guide/load-balancer.md b/docs/user-guide/load-balancer.md new file mode 100644 index 0000000000..0a3ad8f837 --- /dev/null +++ b/docs/user-guide/load-balancer.md @@ -0,0 +1,73 @@ +--- +--- + +* TOC +{:toc} + +## Overview + +When creating a service, you have the option of automatically creating a +network load balancer. This provides an +externally-accessible IP address that sends traffic to the correct port on your +cluster nodes. + +## Configuration file + +To create an external load balancer, add the following line to your +[service configuration file](/docs/services/operations/#service-configuration-file): + + "type": "LoadBalancer" + +Your configuration file might look like: + + { + "kind": "Service", + "apiVersion": "v1", + "metadata": { + "name": "example-service" + }, + "spec": { + "ports": [{ + "port": 8765, + "targetPort": 9376, + }], + "selector": { + "app": "example" + }, + "type": "LoadBalancer" + } + } + +## Using kubectl + +You can alternatively create the service with the `kubectl expose` command and +its `--type=LoadBalancer` flag: + + $ kubectl expose rc example --port=8765 --target-port=9376 \ + --name=example-service --type=LoadBalancer + +This command creates a new service using the same selectors as the referenced +resource (in the case of the example above, a replication controller named +`example`.) + +For more information, including optional flags, refer to the +[`kubectl expose` reference](/docs/user-guide/kubectl/kubectl_expose/). + +## Finding your IP address + +You can find the IP address created for your service by getting the service +information through `kubectl`: + + $ kubectl describe services example-service + Name: example-service + Selector: app=example + Type: LoadBalancer + IP: 10.67.252.103 + LoadBalancer Ingress: 123.45.678.9 + Port: 80/TCP + NodePort: 32445/TCP + Endpoints: 10.64.0.4:80,10.64.1.5:80,10.64.2.4:80 + Session Affinity: None + No events. + +The IP address is listed next to `LoadBalancer Ingress`. diff --git a/docs/user-guide/pods/_viewing-a-pod.md b/docs/user-guide/pods/_viewing-a-pod.md new file mode 100644 index 0000000000..11d30057c1 --- /dev/null +++ b/docs/user-guide/pods/_viewing-a-pod.md @@ -0,0 +1,58 @@ +To view a specific pod, use the `kubectl get` command: + +```shell +$ kubectl get pod NAME +NAME READY STATUS RESTARTS AGE +example 1/1 Running 0 2d +``` + +To return the name of the node on which the pod is scheduled, use the `-o wide` +option: + +```shell +$ kubectl get pod NAME -o wide +NAME READY STATUS RESTARTS AGE NODE +example 1/1 Running 0 2d gke-example-c6a38-node-xij3 +``` + +For more details about a pod, including events, use `describe` in place of +`get`: + +```shell +$ kubectl describe pod NAME +Name: example +Namespace: default +Image(s): kubernetes/example-php-redis:v2 +Node: gke-example-c6a38461-node-xij3/10.240.34.183 +Labels: name=frontend +Status: Running +Reason: +Message: +IP: 10.188.2.10 +Replication Controllers: example (5/5 replicas created) +Containers: + php-redis: + Image: kubernetes/example-php-redis:v2 + Limits: + cpu: 100m + State: Running + Started: Tue, 04 Aug 2015 09:02:46 -0700 + Ready: True + Restart Count: 0 +Conditions: + Type Status + Ready True +Events: + FirstSeen LastSeen Coun From SubobjectPath Reason Message + Thu, 06 Aug 2015 11:49:44 -0700 Thu, 06 Aug 2015 11:49:44 -0700 1 {kubelet gke-example-c6a38461-node-xij3} spec.containers{example} started Started with docker id 5705bffa65e2 +``` + +To list all pods running on a cluster: + +```shell +$ kubectl get pods + +NAME READY STATUS RESTARTS AGE +example-xypvc 1/1 Running 0 1m +frontend-7kdod 1/1 Running 0 1d +``` \ No newline at end of file diff --git a/docs/user-guide/pods.md b/docs/user-guide/pods/index.md similarity index 100% rename from docs/user-guide/pods.md rename to docs/user-guide/pods/index.md diff --git a/docs/user-guide/pods/multi-container.md b/docs/user-guide/pods/multi-container.md new file mode 100644 index 0000000000..3b4214f111 --- /dev/null +++ b/docs/user-guide/pods/multi-container.md @@ -0,0 +1,175 @@ +--- +--- + +* TOC +{:toc} + +A pod is a group of containers that are scheduled +onto the same host. Pods serve as units of scheduling, deployment, and +horizontal scaling/replication. Pods share fate, and share some resources, such +as storage volumes and IP addresses. + +## Creating a pod + +Multi-container pods must be created with the `create` command. Properties +are passed to the command as a YAML- or JSON-formatted configuration file. + +The `create` command can be used to create a pod directly, or it can create +a pod or pods through a replication controller. It is highly recommended that +you use a +[replication controller](/docs/user-guide/replication-controller/) +to create your pods. The controller watches for failed pods and will start up +new pods as required to maintain the specified number. + +For instructions on creating pods with a replication controller, refer to +[Creating replication controllers](/docs/user-guide/replication-controller/operations/). + +If you don't want a replication controller to monitor your pod (e.g. your pod +is writing non-persistent data which won't survive a restart, or your pod is +intended to be very short-lived), you can create a pod directly with the +`create` command. + +### Using `create` + +Note: We recommend using a +[replication controller](/docs/user-guide/replication-controller/) +to create pods. You should use the instructions below only if you don't want +to create a replication controller. + +If your pod will contain more than one container, or if you don't want to +create a replication controller to manage your pod, use the +`kubectl create` command and pass a pod specification as a JSON- or +YAML-formatted configuration file. + +```shell +$ kubectl create -f FILE +``` + +Where: + +* `-f FILE` or `--filename FILE` is the name of a + [pod configuration file](#pod-configuration-file) in either JSON or YAML + format. + +A successful create request returns the pod name. Use the +[`kubectl get`](#viewing_a_pod) command to view status after creation. + +### Pod configuration file + +A pod configuration file specifies required information about the pod. +It can be formatted as YAML or as JSON, and supports the following fields: + +{% capture tabspec %}configfiles +JSON,json,pod-config.json,/docs/user-guide/pods/pod-config.json +YAML,yaml,pod-config.yaml,/docs/user-guide/pods/pod-config.yaml{% endcapture %} +{% include tabs.html %} + +Required fields are: + +* `kind`: Always `Pod`. +* `apiVersion`: Currently `v1`. +* `metadata`: An object containing: + * `name`: Required if `generateName` is not specified. The name of this pod. + It must be an + [RFC1035](https://www.ietf.org/rfc/rfc1035.txt) compatible value and be + unique within the namespace. + * `labels`: Optional. Labels are arbitrary key:value pairs that can be used + by + [replication controllers](/docs/user-guide/replication-controller) + and [services](/docs/user-guide/services/) for grouping and targeting + pods. + * `generateName`: Required if `name` is not set. A prefix to use to generate + a unique name. Has the same validation rules as `name`. + * `namespace`: Required. The namespace of the pod. + * `annotations`: Optional. A map of string keys and values that can be used + by external tooling to store and retrieve arbitrary metadata about + objects. +* `spec`: The pod specification. See [The `spec` schema](#the_spec_schema) for + details. + + +### The `spec` schema + +A full description of the `spec` schema is contained in the +[Kubernetes API reference](/docs/api-reference/v1/definitions/#_v1_podspec). + +The following fields are required or commonly used in the `spec` schema: + +{% capture tabspec %}specfiles +JSON,json,pod-spec-common.json,/docs/user-guide/pods/pod-spec-common.json +YAML,yaml,pod-spec-common.yaml,/docs/user-guide/pods/pod-spec-common.yaml{% endcapture %} +{% include tabs.html %} + +#### `containers[]` + +A list of containers belonging to the pod. Containers cannot be added or removed once the pod is created, and there must be at least one container in a pod. + +The `containers` object **must contain**: + +* `name`: Name of the container. It must be a DNS_LABEL and be unique within the pod. Cannot be updated. +* `image`: Docker image name. + +The `containers` object **commonly contains** the following optional properties: + +* `command[]`: The entrypoint array. Commands are not executed within a shell. The docker image's entrypoint is used if this is not provided. Cannot be updated. +* `args[]`: A command array containing arguments to the entrypoint. The docker image's `cmd` is used if this is not provided. Cannot be updated. +* `env[]`: A list of environment variables in key:value format to set in the container. Cannot be updated. + * `name`: The name of the environment variable; must be a `C_IDENTIFIER`. + * `value`: The value of the environment variable. Defaults to empty string. +* `imagePullPolicy`: The image pull policy. Accepted values are: + * `Always` + * `Never` + * `IfNotPresent`Defaults to `Always` if `:latest` tag is specified, or `IfNotPresent` otherwise. Cannot be updated. +* `ports[]`: A list of ports to expose from the container. Cannot be updated. + * `containerPort`: The port number to expose on the pod's IP address. + * `name`: The name for the port that can be referred to by services. Must be a `DNS_LABEL` and be unique without the pod. + * `protocol`: Protocol for the port. Must be UDP or TCP. Default is TCP. +* `resources`: The Compute resources required by this container. Contains: + * `cpu`: CPUs to reserve for each container. Default is whole CPUs; scale suffixes (e.g. `100m` for one hundred milli-CPUs) are supported. If the host does not have enough available resources, your pod will not be scheduled. + * `memory`: Memory to reserve for each container. Default is bytes; [binary scale suffixes](http://en.wikipedia.org/wiki/Binary_prefix) (e.g. `100Mi` for one hundred mebibytes) are supported. If the host does not have enough available resources, your pod will not be scheduled.Cannot be updated. + +#### `restartPolicy` + +Restart policy for all containers within the pod. Options are: + +* `Always` +* `OnFailure` +* `Never` + +#### `volumes[]` + +A list of volumes that can be mounted by containers belonging to the pod. You must specify a `name` and a source for each volume. The container must also include a `volumeMount` with matching `name`. Source is one of: + +* `emptyDir`: A temporary directory that shares a pod's lifetime. Contains: + * `medium`: The type of storage used to back the volume. Must be an empty string (default) or `Memory`. +* `hostPath`: A pre-existing host file or directory. This is generally used for privileged system daemons or other agents tied to the host. Contains: + * `path`: The path of the directory on the host. +* `secret`: Secret to populate volume. Secrets are used to hold sensitive information, such as passwords, OAuth tokens, and SSH keys. Learn more from [the docs on secrets](/docs/user-guide/secrets/). Contains: + * `secretName`: The name of a secret in the pod's namespace. + +The `name` must be a DNS_LABEL and unique within the pod. + + +### Sample file + +For example, the following configuration file creates two containers: a +`redis` key-value store image, and a `django` frontend image. + +{% capture tabspec %}samplefiles +JSON,json,pod-sample.json,/docs/user-guide/pods/pod-sample.json +YAML,yaml,pod-sample.yaml,/docs/user-guide/pods/pod-sample.yaml{% endcapture %} +{% include tabs.html %} + +## Viewing a pod + +{% include_relative _viewing-a-pod.md %} + +## Deleting a pod + +If you created your pod directly with `kubectl create`, use `kubectl delete`: + +```shell +$ kubectl delete pod NAME +``` + +A successful delete request returns the name of the deleted pod. diff --git a/docs/user-guide/pods/pod-config.json b/docs/user-guide/pods/pod-config.json new file mode 100644 index 0000000000..265db0368d --- /dev/null +++ b/docs/user-guide/pods/pod-config.json @@ -0,0 +1,18 @@ +{ + "kind": "Pod", + "apiVersion": "v1", + "metadata": { + "name": "", + "labels": { + "name": "" + }, + "generateName": "", + "namespace": "", + "annotations": [] + }, + "spec": { + + // See 'The spec schema' for details. + + } +} diff --git a/docs/user-guide/pods/pod-config.yaml b/docs/user-guide/pods/pod-config.yaml new file mode 100644 index 0000000000..9eb3691a74 --- /dev/null +++ b/docs/user-guide/pods/pod-config.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Pod +metadata: + name: "" + labels: + name: "" + namespace: "" + annotations: [] + generateName: "" +spec: + ? "// See 'The spec schema' for details." + : ~ diff --git a/docs/user-guide/pods/pod-sample.json b/docs/user-guide/pods/pod-sample.json new file mode 100644 index 0000000000..25d0373204 --- /dev/null +++ b/docs/user-guide/pods/pod-sample.json @@ -0,0 +1,32 @@ +{ + "kind": "Pod", + "apiVersion": "v1", + "metadata": { + "name": "redis-django", + "labels": { + "app": "webapp" + } + }, + "spec": { + "containers": [ + { + "name": "key-value-store", + "image": "redis", + "ports": [ + { + "containerPort": 6379, + } + ] + }, + { + "name": "frontend", + "image": "django", + "ports": [ + { + "containerPort": 8000, + } + ] + } + ] + } +} diff --git a/docs/user-guide/pods/pod-sample.yaml b/docs/user-guide/pods/pod-sample.yaml new file mode 100644 index 0000000000..84635ff24f --- /dev/null +++ b/docs/user-guide/pods/pod-sample.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Pod +metadata: + name: redis-django + labels: + app: web +spec: + containers: + - name: key-value-store + image: redis + ports: + - containerPort: 6379 + - name: frontend + image: django + ports: + - containerPort: 8000 diff --git a/docs/user-guide/pods/pod-spec-common.json b/docs/user-guide/pods/pod-spec-common.json new file mode 100644 index 0000000000..c449c34de5 --- /dev/null +++ b/docs/user-guide/pods/pod-spec-common.json @@ -0,0 +1,44 @@ +"spec": { + "containers": [ + { + "name": "", + "image": "", + "command": [ + "" + ], + "args": [ + "" + ], + "env": [ + { + "name": "", + "value": "" + } + ], + "imagePullPolicy": "", + "ports": [ + { + "containerPort": 0, + "name": "", + "protocol": "" + } + ], + "resources": { + "cpu": "" + "memory": "" + } + } + ], + "restartPolicy": "", + "volumes": [ + { + "name": "", + "emptyDir": { + "medium": "" + }, + "secret": { + "secretName": "" + } + } + ] +} diff --git a/docs/user-guide/pods/pod-spec-common.yaml b/docs/user-guide/pods/pod-spec-common.yaml new file mode 100644 index 0000000000..96e4c1c6e8 --- /dev/null +++ b/docs/user-guide/pods/pod-spec-common.yaml @@ -0,0 +1,31 @@ +spec: + containers: + - + args: + - "" + command: + - "" + env: + - + name: "" + value: "" + image: "" + imagePullPolicy: "" + name: "" + ports: + - + containerPort: 0 + name: "" + protocol: "" + resources: + cpu: "" + memory: "" + restartPolicy: "" + volumes: + - + emptyDir: + medium: "" + name: "" + secret: + secretName: "" + diff --git a/docs/user-guide/pods/single-container.md b/docs/user-guide/pods/single-container.md new file mode 100644 index 0000000000..36f0fa128b --- /dev/null +++ b/docs/user-guide/pods/single-container.md @@ -0,0 +1,88 @@ +--- +--- + +* TOC +{:toc} + +A pod is a group of containers that are scheduled +onto the same host. Pods serve as units of scheduling, deployment, and +horizontal scaling/replication. Pods share fate, and share some resources, such +as storage volumes and IP addresses. + +## Creating a pod + +Single-container pods can be created with the `run` command. The +pod's properties are specified with flags on the command line. + +The `run` command creates a replication controller to monitor the pod(s). +The controller watches for failed pods and will start up new pods as required +to maintain the specified number. + +Note: If you don't want a replication controller to monitor your pod (e.g. your pod +is writing non-persistent data which won't survive a restart, or your pod is +intended to be very short-lived), you can +[create a pod directly with the `create` command](/docs/user-guide/pods/multi-container/). + +To create a pod using the `run` command: + +```shell +$ kubectl run NAME + --image=image + [--port=port] + [--replicas=replicas] + [--labels=key=value,key=value,...] +``` + +Where: + +* `NAME` (required) is the name of the container to create. This value is also + applied as the name of the replication controller, and as the prefix of the + pod name. For example: + + ```shell + $ kubectl run example --image=nginx + replicationcontroller "example" created + + $ kubectl get pods + NAME READY STATUS RESTARTS AGE + example-xypvc 1/1 Running 0 13s + ``` +* `--image=IMAGE` (required) is the Docker container image to use for this + container. +* `--port=PORT` is the port to expose on the container. +* `--replicas=NUM` is the number of replicated pods to create. If not specified, + one pod will be created. +* `--labels=key=value` specifies one or more labels to attach to the pod. In + addition to any labels specified here, `run` attaches a label of + the format `run=NAME`. This is used by the replication controller + to target the pods created by the command. + +There are additional flags that can be specified. For a complete list, run: + + $ kubectl run --help + +## Viewing a pod + +{% include_relative _viewing-a-pod.md %} + +## Deleting a pod + +If your pod was created using the `run` command, kubernetes creates a +[replication controller](/docs/user-guide/replication-controller/) +to manage the pod. Pods managed by a replication controller are rescheduled if +they go away, including being deleted by `kubectl delete pod`. To permanently +delete the pod, delete its replication controller. + +First, find the controller's name: + +```shell +$ kubectl get rc +CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS +example example busybox run=example 1 +``` + +Then, `delete` the controller: + +```shell +$ kubectl delete rc CONTROLLER_NAME +``` \ No newline at end of file diff --git a/docs/user-guide/replication-controller.md b/docs/user-guide/replication-controller/index.md similarity index 98% rename from docs/user-guide/replication-controller.md rename to docs/user-guide/replication-controller/index.md index ba562e5545..4b4e888c67 100644 --- a/docs/user-guide/replication-controller.md +++ b/docs/user-guide/replication-controller/index.md @@ -92,8 +92,8 @@ A Replication Controller also needs a [`.spec` section](https://github.com/kuber The `.spec.template` is the only required field of the `.spec`. -The `.spec.template` is a [pod template](/docs/user-guide/replication-controller/#pod-template). It has exactly -the same schema as a [pod](pods.md), except it is nested and does not have an `apiVersion` or +The `.spec.template` is a [pod template](#pod-template). It has exactly +the same schema as a [pod](/docs/user-guide/pods/), except it is nested and does not have an `apiVersion` or `kind`. In addition to required fields for a Pod, a pod template in a job must specify appropriate @@ -241,3 +241,7 @@ Use a [DaemonSet](/docs/admin/daemons/) instead of a replication controller for machine-level function, such as machine monitoring or machine logging. These pods have a lifetime is tied to machine lifetime: the pod needs to be running on the machine before other pods start, and are safe to terminate when the machine is otherwise ready to be rebooted/shutdown. + +## For more information + +Read [Replication Controller Operations](/docs/user-guide/replication-controller/operations/). diff --git a/docs/user-guide/replication-controller/operations.md b/docs/user-guide/replication-controller/operations.md new file mode 100644 index 0000000000..78f10dbd3f --- /dev/null +++ b/docs/user-guide/replication-controller/operations.md @@ -0,0 +1,226 @@ +--- +--- +* TOC +{:toc} + +A replication controller ensures that a specified number of pod "replicas" are +running at any one time. If there are too many, it will kill some. If there are +too few, it will start more. + +## Creating a replication controller + +Replication controllers are created with `kubectl create`: + +```shell +$ kubectl create -f FILE +``` + +Where: + +* `-f FILE` or `--filename FILE` is a relative path to a + [configuration file](#replication_controller_configuration_file) in + either JSON or YAML format. + +You can use the [sample file](#sample_file) below to try a create request. + +A successful create request returns the name of the replication controller. To +view more details about the controller, see +[Viewing replication controllers](#viewing_replication_controllers) below. + +### Replication controller configuration file + +When creating a replication controller, you must point to a configuration file +as the value of the `-f` flag. The configuration +file can be formatted as YAML or as JSON, and supports the following fields: + +```json +{ + "apiVersion": "v1", + "kind": "ReplicationController", + "metadata": { + "name": "", + "labels": "", + "namespace": "" + }, + "spec": { + "replicas": int, + "selector": { + "":"" + }, + "template": { + "metadata": { + "labels": { + "":"" + } + }, + "spec": { + // See 'The spec schema' below + } + } + } +} +``` + +Required fields are: + +* `kind`: Always `ReplicationController`. +* `apiVersion`: Currently `v1`. +* `metadata`: An object containing: + * `name`: Required if `generateName` is not specified. The name of this + replication controller. It must be an + [RFC1035](https://www.ietf.org/rfc/rfc1035.txt) compatible value and be + unique within the namespace. + * `labels`: Optional. Labels are arbitrary key:value pairs that can be used + for grouping and targeting by other resources and services. + * `generateName`: Required if `name` is not set. A prefix to use to generate + a unique name. Has the same validation rules as `name`. + * `namespace`: Optional. The namespace of the replication controller. + * `annotations`: Optional. A map of string keys and values that can be used + by external tooling to store and retrieve arbitrary metadata about + objects. +* `spec`: The configuration for this replication controller. It must + contain: + * `replicas`: The number of pods to create and maintain. + * `selector`: A map of key:value pairs assigned to the set of pods that + this replication controller is responsible for managing. **This must** + **match the key:value pairs in the `template`'s `labels` field**. + * `template` contains: + * A `metadata` object with `labels` for the pod. + * The [`spec` schema](#the_spec_schema) that defines the pod + configuration. + +### The `spec` schema + +The `spec` schema (that is a child of `template`) is described in the locations +below: + +* The [`spec` schema](/docs/user-guide/pods/multi-container/#the_spec_schema) + section of the Creating Multi-Container Pods page covers required and + frequently-used fields. +* The entire `spec` schema is documented in the + [Kubernetes API reference](/docs/api-reference/v1/definitions/#_v1_podspec). + +### Sample file + +The following sample file creates 2 pods, each containing a single container +using the `redis` image. Port 80 on each container is opened. The replication +controller is tagged with the `serving` label. The pods are given the label +`frontend` and the `selector` is set to `frontend`, to indicate that the +controller should manage pods with the `frontend` label. + +```json +{ + "kind": "ReplicationController", + "apiVersion": "v1", + "metadata": { + "name": "frontend-controller", + "labels": { + "state": "serving" + } + }, + "spec": { + "replicas": 2, + "selector": { + "app": "frontend" + }, + "template": { + "metadata": { + "labels": { + "app": "frontend" + } + }, + "spec": { + "volumes": null, + "containers": [ + { + "name": "php-redis", + "image": "redis", + "ports": [ + { + "containerPort": 80, + "protocol": "TCP" + } + ], + "imagePullPolicy": "IfNotPresent" + } + ], + "restartPolicy": "Always", + "dnsPolicy": "ClusterFirst" + } + } + } +} +``` + +## Updating replication controller pods + +See [Rolling Updates](/docs/user-guide/rolling-updates/). + +## Resizing a replication controller + +See +[Resizing a replication controller](/docs/user-guide/resizing-a-replication-controller/). + +## Viewing replication controllers + +To list replication controllers on a cluster, use the `kubectl get` command: + +```shell +$ kubectl get rc +``` + +A successful get command returns all replication controllers on the cluster in +the specified or default namespace. For example: + +```shell +CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS +frontend php-redis redis name=frontend 2 +``` + +You can also use `get rc NAME` to return information about a specific +replication controller. + +To view detailed information about a specific replication controller, use the +`kubectl describe` command: + +```shell +$ kubectl describe rc NAME +``` + +A successful describe request returns details about the replication controller +including number and status of pods managed, and recent events: + +```conf +Name: frontend +Namespace: default +Image(s): gcr.io/google_samples/gb-frontend:v3 +Selector: name=frontend +Labels: name=frontend +Replicas: 2 current / 2 desired +Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed +Events: + FirstSeen LastSeen Count From SubobjectPath Reason Message + Fri, 06 Nov 2015 16:52:50 -0800 Fri, 06 Nov 2015 16:52:50 -0800 1 {replication-controller } SuccessfulCreate Created pod: frontend-gyx2h + Fri, 06 Nov 2015 16:52:50 -0800 Fri, 06 Nov 2015 16:52:50 -0800 1 {replication-controller } SuccessfulCreate Created pod: frontend-vc9w4 +``` + +## Deleting replication controllers + +To delete a replication controller as well as the pods that it controls, use +`kubectl delete`: + +```shell +$ kubectl delete rc NAME +``` + +By default, `kubectl delete rc` will resize the controller to zero (effectively +deleting all pods) before deleting it. + +To delete a replication controller without deleting its pods, use +`kubectl delete` and specify `--cascade=false`: + +```shell +$ kubectl delete rc NAME --cascade=false +``` + +A successful delete request returns the name of the deleted resource. diff --git a/docs/user-guide/replication.yaml b/docs/user-guide/replication-controller/replication.yaml similarity index 100% rename from docs/user-guide/replication.yaml rename to docs/user-guide/replication-controller/replication.yaml diff --git a/docs/user-guide/resizing-a-replication-controller.md b/docs/user-guide/resizing-a-replication-controller.md new file mode 100644 index 0000000000..ada87aade0 --- /dev/null +++ b/docs/user-guide/resizing-a-replication-controller.md @@ -0,0 +1,33 @@ +--- +--- + +To increase or decrease the number of pods under a replication controller's +control, use the `kubectl scale` command: + + $ kubectl scale rc NAME --replicas=COUNT \ + [--current-replicas=COUNT] \ + [--resource-version=VERSION] + +Tip: You can use the `rc` alias in your commands in place of +`replicationcontroller`. + +Required fields are: + +* `NAME`: The name of the replication controller to update. +* `--replicas=COUNT`: The desired number of replicas. + +Optional fields are: + +* `--current-replicas=COUNT`: A precondition for current size. If specified, + the resize will only take place if the current number of replicas matches + this value. +* `--resource-version=VERSION`: A precondition for resource version. If + specified, the resize will only take place if the current replication + controller version matches this value. Versions are specified in the + `labels` field of the replication controller's configuration file, as a + key:value pair with a key of `version`. For example, + `--resource-version test` matches: + + "labels": { + "version": "test" + } diff --git a/docs/user-guide/rolling-updates.md b/docs/user-guide/rolling-updates.md new file mode 100644 index 0000000000..fe79c7305d --- /dev/null +++ b/docs/user-guide/rolling-updates.md @@ -0,0 +1,127 @@ +--- +--- + +* TOC +{:toc} + +## Overview + +A rolling update applies changes to the configuration of pods being managed by +a replication controller. The changes can be passed as a new replication +controller configuration file; or, if only updating the image, a new container +image can be specified directly. + +A rolling update works by: + +1. Creating a new replication controller with the updated configuration. +2. Increasing/decreasing the replica count on the new and old controllers until + the correct number of replicas is reached. +3. Deleting the original replication controller. + +Rolling updates are initiated with the `kubectl rolling-update` command: + + $ kubectl rolling-update NAME \ + ([NEW_NAME] --image=IMAGE | -f FILE) + +## Passing a configuration file + +To initiate a rolling update using a configuration file, pass the new file to +`kubectl rolling-update`: + + $ kubectl rolling-update NAME -f FILE + +The configuration file must: + +* Specify a different `metadata.name` value. + +* Overwrite at least one common label in its `spec.selector` field. + +* Use the same `metadata.namespace`. + +Replication controller configuration files are described in +[Creating Replication Controllers](/docs/user-guide/replication-controller/operations/). + +### Examples + + // Update pods of frontend-v1 using new replication controller data in frontend-v2.json. + $ kubectl rolling-update frontend-v1 -f frontend-v2.json + + // Update pods of frontend-v1 using JSON data passed into stdin. + $ cat frontend-v2.json | kubectl rolling-update frontend-v1 -f - + +## Updating the container image + +To update only the container image, pass a new image name and tag with the +`--image` flag and (optionally) a new controller name: + + $ kubectl rolling-update NAME [NEW_NAME] --image=IMAGE:TAG + +The `--image` flag is only supported for single-container pods. Specifying +`--image` with multi-container pods returns an error. + +If no `NEW_NAME` is specified, a new replication controller is created with +a temporary name. Once the rollout is complete, the old controller is deleted, +and the new controller is updated to use the original name. + +The update will fail if `IMAGE:TAG` is identical to the +current value. For this reason, we recommend the use of versioned tags as +opposed to values such as `:latest`. Doing a rolling update from `image:latest` +to a new `image:latest` will fail, even if the image at that tag has changed. + +### Examples + + // Update the pods of frontend-v1 to frontend-v2 + $ kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2 + + // Update the pods of frontend, keeping the replication controller name + $ kubectl rolling-update frontend --image=image:v2 + +## Required and optional fields + +Required fields are: + +* `NAME`: The name of the replication controller to update. + +as well as either: + +* `-f FILE`: A replication controller configuration file, in either JSON or + YAML format. The configuration file must specify a new top-level `id` value + and include at least one of the existing `spec.selector` key:value pairs. + See the + [Replication Controller Operations](/docs/user-guide/replication-controller/operations#replication-controller-configuration-file) + page for details. +
+
+ or: +
+
+* `--image IMAGE:TAG`: The name and tag of the image to update to. Must be + different than the current image:tag currently specified. + +Optional fields are: + +* `NEW_NAME`: Only used in conjunction with `--image` (not with `-f FILE`). The + name to assign to the new replication controller. +* `--poll-interval DURATION`: The time between polling the controller status + after update. Valid units are `ns` (nanoseconds), `us` or `µs` (microseconds), + `ms` (milliseconds), `s` (seconds), `m` (minutes), or `h` (hours). Units can + be combined (e.g. `1m30s`). The default is `3s`. +* `--timeout DURATION`: The maximum time to wait for the controller to update a + pod before exiting. Default is `5m0s`. Valid units are as described for + `--poll-interval` above. +* `--update-period DURATION`: The time to wait between updating pods. Default + is `1m0s`. Valid units are as described for `--poll-interval` above. + +Additional information about the `kubectl rolling-update` command is available +from the [`kubectl` reference](/docs/user-guide/kubectl/kubectl_rolling-update/). + +## Troubleshooting + +If the `timeout` duration is reached during a rolling update, the operation will +fail with some pods belonging to the new replication controller, and some to the +original controller. + +To continue the update from where it failed, retry using the same command. + +To roll back to the original state before the attempted update, append the +`--rollback=true` flag to the original command. This will revert all changes. diff --git a/docs/user-guide/services.md b/docs/user-guide/services/index.md similarity index 99% rename from docs/user-guide/services.md rename to docs/user-guide/services/index.md index 60a373c385..99b1453c6d 100644 --- a/docs/user-guide/services.md +++ b/docs/user-guide/services/index.md @@ -569,3 +569,7 @@ through a load-balancer, though in those cases the client IP does get altered. Service is a top-level resource in the kubernetes REST API. More details about the API object can be found at: [Service API object](/docs/api-reference/v1/definitions/#_v1_service). + +## For More Information + +Read [Service Operations](/docs/user-guide/services/operations/). diff --git a/docs/user-guide/services/load-balancer-sample.json b/docs/user-guide/services/load-balancer-sample.json new file mode 100644 index 0000000000..847f21dbb6 --- /dev/null +++ b/docs/user-guide/services/load-balancer-sample.json @@ -0,0 +1,17 @@ +{ + "kind": "Service", + "apiVersion": "v1", + "metadata": { + "name": "myapp" + }, + "spec": { + "ports": [{ + "port": 8765, + "targetPort": 9376 + }], + "selector": { + "app": "example" + }, + "type": "LoadBalancer" + } +} diff --git a/docs/user-guide/services/load-balancer-sample.yaml b/docs/user-guide/services/load-balancer-sample.yaml new file mode 100644 index 0000000000..b66c5ea231 --- /dev/null +++ b/docs/user-guide/services/load-balancer-sample.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: myapp +spec: + ports: + - + port: 8765 + targetPort: 9376 + selector: + app: example + type: LoadBalancer diff --git a/docs/user-guide/services/operations.md b/docs/user-guide/services/operations.md new file mode 100644 index 0000000000..64551d47a4 --- /dev/null +++ b/docs/user-guide/services/operations.md @@ -0,0 +1,161 @@ +--- +--- +* TOC +{:toc} + +Services map a port on each cluster node to ports on one or more pods. + +The mapping uses a `selector` key:value pair in the service, and the +`labels` property of pods. Any pods whose labels match the service selector +are made accessible through the service's port. + +For more information, see the +[Services Overview](/docs/user-guide/services/). + +## Create a service + +Services are created by passing a configuration file to the `kubectl create` +command: + +```shell +$ kubectl create -f FILE +``` + +Where: + +* `-f FILE` or `--filename FILE` is a relative path to a + [service configuration file](#service-configuration-file) in either JSON + or YAML format. + +A successful service create request returns the service name. You can use +a [sample file](#sample_files) below to try a create request. + +### Service configuration file + +When creating a service, you must point to a service configuration file as the +value of the `-f` flag. The configuration file can be formatted as +YAML or as JSON, and supports the following fields: + +```json +{ + "kind": "Service", + "apiVersion": "v1", + "metadata": { + "name": string + }, + "spec": { + "ports": [{ + "port": int, + "targetPort": int + }], + "selector": { + string: string + }, + "type": "LoadBalancer" + } +} +``` + +Required fields are: + +* `kind`: Always `Service`. +* `apiVersion`: Currently `v1`. +* `metadata`: Contains: + * `name`: The name to give to this service. +* `spec`: Contains: + * `ports`: The ports to map. `port` is the service port to expose on the + cluster IP. `targetPort` is the port to target on the pods that are part + of this service. + * `selector`: The label key:value pair that defines the pods to + target. + * `type`: Optional. If the type is `LoadBalancer`, sets up a [network load balancer](/docs/user-guide/load-balancer/) + for your service. This provides an externally-accessible IP address that + sends traffic to the correct port on your cluster nodes. + +For the full `service` schema see the +[Kubernetes api reference](/docs/api-reference/v1/definitions/#_v1_service). + +### Sample files + +The following service configuration files assume that you have a set of pods +that expose port 9376 and carry the label `app=example`. + +Both files create a new service named `myapp` which resolves to TCP port 9376 +on any pod with the `app=example` label. + +The difference in the files is in how the service is accessed. The first file +does not create an external load balancer; the service can be accessed through +port 8765 on any of the nodes' IP addresses. + +{% capture tabspec %}servicesample +JSON,json,service-sample.json,/docs/user-guide/services/service-sample.json +YAML,yaml,service-sample.yaml,/docs/user-guide/services/service-sample.yaml{% endcapture %} +{% include tabs.html %} + +The second file uses +[network load balancing](/docs/user-guide/load-balancer/) to create a +single IP address that spreads traffic to all of the nodes in +your cluster. This option is specified with the +`"type": "LoadBalancer"` property. + +{% capture tabspec %}loadbalancesample +JSON,json,load-balancer-sample.json,/docs/user-guide/services/load-balancer-sample.json +YAML,yaml,load-balancer-sample.yaml,/docs/user-guide/services/load-balancer-sample.yaml{% endcapture %} +{% include tabs.html %} + +To access the service, a client connects to the external IP address, which +forwards to port 8765 on a node in the cluster, which in turn accesses +port 9376 on the pod. See the +[Service configuration file](#service-configuration-file) section of this doc +for directions on finding the external IP address. + +## View a service + +To list all services on a cluster, use the +`kubectl get` command: + +```shell +$ kubectl get services +``` + +A successful get request returns all services that exist on the specified +cluster: + +```shell +NAME LABELS SELECTOR IP PORT +myapp app=MyApp 10.123.255.83 8765/TCP +``` + +To return information about a specific service, use the +`kubectl describe` command: + +```shell +$ kubectl describe service NAME +``` + +Details about the specific service are returned: + +```conf +Name: myapp +Labels: +Selector: app=MyApp +IP: 10.123.255.83 +Port: 8765/TCP +NodePort: 31474/TCP +Endpoints: +Session Affinity: None +No events. +``` + +To return information about a service when event information is not required, +substitute `get` for `describe`. + +## Delete a service + +To delete a service, use the `kubectl delete` command: + +```shell +$ kubectl delete service NAME +``` + +A successful delete request returns the deleted service's name. diff --git a/docs/user-guide/services/service-sample.json b/docs/user-guide/services/service-sample.json new file mode 100644 index 0000000000..764bb32d19 --- /dev/null +++ b/docs/user-guide/services/service-sample.json @@ -0,0 +1,16 @@ +{ + "kind": "Service", + "apiVersion": "v1", + "metadata": { + "name": "myapp" + }, + "spec": { + "ports": [{ + "port": 8765, + "targetPort": 9376 + }], + "selector": { + "app": "example" + } + } +} diff --git a/docs/user-guide/services/service-sample.yaml b/docs/user-guide/services/service-sample.yaml new file mode 100644 index 0000000000..b9c214226f --- /dev/null +++ b/docs/user-guide/services/service-sample.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: myapp +spec: + ports: + - + port: 8765 + targetPort: 9376 + selector: + app: example diff --git a/images/jquery-ui/ui-bg_diagonals-thick_18_b81900_40x40.png b/images/jquery-ui/ui-bg_diagonals-thick_18_b81900_40x40.png new file mode 100755 index 0000000000000000000000000000000000000000..ed793737cc1d1383f3478faa1b9519c9f3318268 GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^8Xzpd1SErbK34)Mwj^(Nm;YeE8S(uNP=vFJ#Am<$En9-cLebC{re^wgoll|t(`&s7)9J{YxO^N-aI z$5L3jD^ISzl+wQbw$Cm(|Mhq4jH=@2wI8o7+Gd%b|IIx5*Zn&?>lgCSXrXO^WskXw=UX3LH%8!s;k z#x%*aEGp*Jjm(QM&8zq~)!)n5QqVsS=vUPe*NBpo#FA922>S z4={E+nQaGTRC&5MhIkx*d-b$ng949h;3{8svn*F5o}?c;Kir+G=xvlfb9Ucnx!LzV zKYw1UzcGecb6t~6xWlB=3a51)dX2qx%p0t(H?ll;Xvl-Ua7M6%M)vm*~w}RD4lnZuhbmcl2i$G2U9fNc+T-xj%reP%UwdC`m~y zNwrEYN(E93Mh1qax(3F&hK3;q7FH&fR>nZCxs`!|)jXb!C>nC}Q!>*kacl5CyoDF2 Ofx*+&&t;ucLK6U;g=tU# literal 0 HcmV?d00001 diff --git a/images/jquery-ui/ui-bg_flat_10_000000_40x100.png b/images/jquery-ui/ui-bg_flat_10_000000_40x100.png new file mode 100755 index 0000000000000000000000000000000000000000..2fd24e203646d56fa3df07b5df3bf8f364f492b2 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F2qYNp$opRhQcOwS?k)_Bce{j_0C}7R9+AaB z+5?Q;PG;Ky8T_6ujv*T7lM^IZ7dQL@YKdTAEH!H@2TG}yxJHzuB$lLFB^RXvDF!10 zLsMM?V_ieT5CaP<6H6;&AlKZ=z`$xA&qfptx%nxXX_dG&cpu)v3)H~i>FVdQ&MBb@ E0QKuIYybcN literal 0 HcmV?d00001 diff --git a/images/jquery-ui/ui-bg_glass_100_f6f6f6_1x400.png b/images/jquery-ui/ui-bg_glass_100_f6f6f6_1x400.png new file mode 100755 index 0000000000000000000000000000000000000000..0fccfbcf3243850c80947e1002f035601fc2228b GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&0LWmFTHNUZq?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z#PD=+46!(!{KIr+qDZgOs>S*DCH8q6)|^lLQ8(vdyV&7=Rv!DK5_Nv5 zKU5EWSl#{5ocZwkn6~@klK(Ue|8%DOm~7JJCTPgP@M)6!J>`Xd0YEcVOI#yLQW8s2 zt&)pUffR$0fuX6cfw8WkVTgf+m5HU5v5BsMxs`#zoR{pZC>nC}Q!>*kacg+HW&ci~ O1_n=8KbLh*2~7ZcZBZNm literal 0 HcmV?d00001 diff --git a/images/jquery-ui/ui-bg_glass_100_fdf5ce_1x400.png b/images/jquery-ui/ui-bg_glass_100_fdf5ce_1x400.png new file mode 100755 index 0000000000000000000000000000000000000000..d7899969c45c69c8cd8bce58571c13e43d352c3d GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12SfLx;Tb-9DjS>o|}bBPw4YFRSXO})J!^(4ctv-3U*RGnKs-FC}~_uAYurjflzw{7+6@DSXvpI=o*+?85qoY$jl?z`ix9?SJ%N(qDp6$}Q>em9L%6)t$Z1L08eZ)N?T6C$}i+_|x9k zx+53_04T0syL!nvp2aKj`aO{0(k^<_toHc2^H*8UIvwNQFOH_jp0vF-Z0`Kv!y6pw ziMi~?&1|xJ!sDx}@cVbY-{yb6DSt{Kurwt?P@y1mR&E_Qupyt&MKv@&q5k6MqRAfp zW>mrthMe)yIKpSVWL6|D>X;S$HvWt#Vg;iaEb(H;Gh%q$%0QgjCiU1pXtQk0i+nTIx^7#MZQD>R1^&p2x3qsNwJh&)r^ivKaC z7@@d?9+??soT=xbM1Gtqt-72VOSUop;lw-3L=m2Vwls9!ONZ;hVhB7>lE|bA`))kP zt7`@eHMlNxZsBbpt?3}b>jpk_|3?}Oo|6}waWgyZwwM=?4!N@IT3sV>k8$-4J+@W} zH`H53VDq~r@;!o)l}6JUoMYw5bE3%xuu1b~ZkF;>o2D3-K4hNeLqWI8m1_mcHKHtf^%Ds~Q%QzD?)-pU;qRP|)IL7X}sSHPUnIsJ-iPVBbL zxse=G$AlFpr*NPWtLOQM+s#GosP{`{nS~WWG8UO^7jj;ht;@?A&EV%wx}4$M{3eQ! zt*jzix6Xmcu}StAHpjw(%5_bfoervB1ctX8Sx@dS8>yyH;<17Tozbpbe`CG2oGjaO zrLc*2leE>Xj#&^lRg_E3JJUTBz9tI~1v)*$19xnKGwY zFH6DZgkft)TknI?+|n%hv{L^dkFsq+JwfA^I4|`Np*h^9_A_?z8b2U=0ETEQ zD;>d&z8Q=I0mY_3Q|XGn*Y$Z?2r_kjNkld~Ykx0@NyY zA>)7blecP~4`J3tdDnXBCHB}v_cu{sQuJi)6&jffgV>!uCULu>_*xstK7GrRL{k=nrpdD z@)NXEO7RUbF?PeX^~gEFcf%$|VeCf6zu+)!EzKx!rOfi2u6dm<XP;QDRCvt0m}g4(O;Z@?w@ z=6F1Yu$`(Pjzmpd;S4H??{#H;4bDlZ!TuhINevw9w>%35i3L^p1Nynx9J$mY3hU=+ zVZe>gzgdai_da*x#YVGF)&>((SyIa}c3{gU~vl^u;T1xhAFj)Otg%i%vs1 zBWpV{DCK5X?eW;AdzKi!Dp+t4PL$V#A>AzF;~ zW{^(V@Y%VM%W6$ z-0CG|hVZK6Kw+>&94uD>6CKjZ*YfClUM!Ipcb=|WM!F1#j#OPIs4TC$3+zNA)lRUN zupJ(Zoog$)l;SCRlK^knDM=D5~5b~mBd6Cpat)LlC$j8pX z8<~wuVc)_B3olu)vm`0x@R7|y6?4g^+LAeHMrg4307BOZNgjN0|6T8$&>P{SE%bNx zA%+~6sdP(NPRRKA|>3WGEnX!Z$$T<4+Mjr^)$ zi+rfIvPflRf#9JA?S(qD#WPB>HX+s`{4HA=MLQI?sBQFTy47;oBUpXo0_jCfI3gHQ z6LoD-nCt##Wl4iI<>}Db-dWg+xTssw+RKz~9757xL~uTOXt(qLPv1rUwr3pkR>j{Z zZ>qQGJX?ruF<2ygjEhPFV~Gl3r|ZVEmFixGWDvO1{QR5r{UUI0{%SG;^oa0W`@%#T#U9` z+DESKBVi1>ChH>JzbE)&U-jxkn3@x|-N>W5G+K@e+RqoNBNu^jT;IO-oMND1%d1J1 z1OdseqJ+Z6jU6%b8MO&?iN%7yKNi={Xy@@@l})LZl`v#s;X{o~{9Hiw6zSPQbv16T zq{1H&FimSD109*6{DcOsO-CAoChr-fAP$7edQP1eHu~7$Y7ApDDDLxEW`9|iyIB*T0*O@?;R&0^GwsjRD z(IUeNBaf(V5nmnQz1*r3aMCZ_kC<*#*-No;7J^TL z#z(;1BT{Jgu8Kb3Koj!wC*8=WdNw8_8Zhe8|3Gfk4sF{=Qs~E9z6-_*vD+E+;~85= z3=6iYbaKAB!Ol?saFL%3VJH(F8GB#a(1+c&;&`Z8vIWi@P7 z0s-x`?zqO)NFh5i>`-QOUlIx{D+!%4p%W)6n!1QsOmYM&?ySeZOJtUNm&|WV-bYYT zaopY+S9N+6)WHjN?H~YDK$)DZOZe8qo}ySk=XF?=w6nBqx%Hto!uRv#*Ya$c_S1s{ zUUPc7YG$8|J{^*jai*ti_1S8-Y{(mI?dFx%W>?8uX*tO%!>*W)S}@8iQ&hL(BfgWS zqx@+!eNwl(Wz~ivn-IX|67?=7oC0mo$W16N1$+F*gY>VWnU5B>Uhi0AMpkiuz7g zv7h@RC%a>wyuJ`LdK+4xdKQMw+T~H|I`qW(H_LfNOSHNDx)1iMXF;#fi$n5$2>+(6 z+hLQKynJ7dj+I1?O(K{_D(J(tvzr0SzL;B|T{m81h!|h1^_spxcjEJj5Y`3%lBU*X z$`&=bnHYxI<126PMvdWn}j3cntTy6HK-dOrE z#S%vfb?hTm1+N=wsG^^bJi<4DW^ljp+Ul``)QML{>O#zEE1b?yY8mNl>JgaHLT}Ab z4BR^3pO|1ov=QM|I}<|45KRPs1ie%^s(60Y;a&gRazi=D{lBT6H*O_TYtQ@TlVo_`Uzp@gFGz+n zXPy6Idp${+;J-5U&RifNGI*p$6hXJ#p^zz)}se`OeH5(t>SzxIIXdm`SkD* zt{{?-_2|`2CxZ6!Lzs(VtL=9<_=}hk+W=%*2ojxP!(hB^+|2J=QZh8*^c6;R&yMya>{d`ySYR4=D03x-67Lr z&7D5A7u@p`_Wux3%0H^`lh0_>-|w76ul`$R{C%PkB#hlNZQM91`%l3p5~t}mzdf{0 zIajFG8b3bN#~s$9(Js<(110XDN0`}rpaTNrJj8bG5hm?{6P@e18f{^DFvq{@r2$nn z!=_TKpxv*VF+qbZ5kXigBXlQt^tzjH;lo{uEjR?JsO=b#9S287^MtBhwUf)SX@+`| zQ9@$i#MgVW_0Il(`1T!yYZCfz4O`eF6-ufVoqKy3Voa|zAmp9eqvdyEyXp1+ka5}B z&1wU>dX=D7B}3K4a63BYbzx9J%NTn}5o24(4@v;Wm^5HTH{6IWsn7*S?I4ZLIhmIs zpAcoDp1~V^Sf^|RI@BfCHAH2>x(ISg21o=c_HQ(ztyax%o^2=(9B)!x@S9IQ@X~j+ z%JUF(>UJ<05}fTUi0q0VJ3v<%BWdIS zC-?aRr=ecdckP|=XZWmc=#HYwTAh24(VnMUbG`~>jfu)dO@BAKd>n=%rWZ{ zBCLdJ6fh?GWS40rYWV(MXVeYRJF|SMvg6uN%m>^sG8U!yi_IIkn36xrNnxvHg2}`c za`;^BuC8Dfzu&hpof#ZjGTj$3Eo3tVENyoAB1(6Tow2;2n_Cy%)qv(S8swGwq?904 z!HFYJ@5T0@)`x7mxlrG4^%$h@)?s=j!Ma-S@v^Nu6jQQ|gG$MtMTH!aKU5XPQL#(W z;M{YXYCwk@A)_9f4FMN zkyF6Qy_)d`b`vDx5fC&$sewKZHE&a@u{NnEc8phzuC^(XOYjC#lpZ{x?PfR3?+j6y zKbz^q=o{|Ksm%O?RWIMzI@`CiHM?ZbE=iW+u}3<4&DK*SKUR>*o>#_Ku%zwpHy_Cv zb(m1Wic5}%Upp5~_~`1?ueq7y{4}eHd1YCn^Pw?PCsv%(K++nirZdNwYS3hg>9zDM za#(yYC|3m-SKXZk=`in#J*Qw1jJt&lpsxR%l^+|`qgtKU!qI+{b;jZxAsi9ayp&D$ zSH}{BLKZX*l($T?Ef#kQ$ls@qGR)MSTf{;m^Iq3 zSX*tMdAT67A*r*flyI=I51Fy%Rx{@(u5|6HK8Ie{SS}l1cRxj51*Js0*ag(#?oeB} zt1R0*!ta}n6@>dp8s*Ig?W*?&mKXf1pYnfR1rtj7>h5n?sYehFQ#rG2*B}d=tuQ+k z(v?V<C-%e+j@lvH`{BIh|)?T%CgXZ8#3Eu@rA*wqpWT<~(eS1#zFo4}&wb zf^E_qZNFnZV~u?oZgMHzeLaC&$DU=BxBh+_F&_3Fn!z+kk(?`EjLnBYg>7@V#;hw}O$!m*Os!FF z;eZLJnQEY&Q}Y|?h@y-0Kqk1m@I|E~Mf(blRQLTEM4TOK7I%V8FIVgVpZwJG*qzv& z;f@)Z1I@V9TjXVFE`R+BY0nd`K1AwtNjohzt*=--eV{n5;@DnU-~59zmo}dT`$CsC z6B@Z>J3;8>5pT3Hxw9E|8!Iy8Z;m(oC zi@STHiuF3rnSwDEV4V%r(LR;}Di}8WBxP@UC zzO^&{g^4w_C+K%ls@79x)u$e0D>U4ifAfxe6!EHTtNpdan8_e3Mwn8*`GH&-uXw*7 zzxWMFdX2}+nr)Rz&xx=)^wJ@@5P0X_We-5xhuw_Yuz^@Mg_-Q7_3g)USG19RLRU=Z$pr4Rz0-ch>*G^uk3`L+RASRA1k;_;B6-Sr8iT ae=7j-pBLECU+rDeT(h#jiofiA_rCyKji%WE literal 0 HcmV?d00001 diff --git a/images/jquery-ui/ui-bg_highlight-soft_100_eeeeee_1x100.png b/images/jquery-ui/ui-bg_highlight-soft_100_eeeeee_1x100.png new file mode 100755 index 0000000000000000000000000000000000000000..256154537205de6fed50fafb52e41cfbc5282d03 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^j6j?s03;ZUuHXC*q?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z$cXTCaSV~TeDu&>UIzz;hKv1@CM62OC7#SFv>KYj98XATeSXh}@S{a+@8kk!d7|eOe g&WfTTH$NpatrE9}w_En_1ZrULboFyt=akR{0E|FY@c;k- literal 0 HcmV?d00001 diff --git a/images/jquery-ui/ui-bg_highlight-soft_75_ffe45c_1x100.png b/images/jquery-ui/ui-bg_highlight-soft_75_ffe45c_1x100.png new file mode 100755 index 0000000000000000000000000000000000000000..367be20d6d6359689a715e9d10ef0bbc251a97b3 GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^j6j?szyu^`+!HJTQfx`y?k@kqfHUIz9iRwjfk$L9 zkoEv$x0Bg+Kt`LVi(`n!`KJ>Mxef&gxX1@bahq-QJ@-iVjABv8k}dz1cpvckAS5Q| zCa~sgnvR`g{(^+B71o<|biO4QZ((@QU$9to$Nb3+c9+^q0~7AA&s1G7ldW;K1nZSx z%@1{}Sk7(ZdA*`2jO&K2|NFg5Zyr%7kiMO>_`pxASP`akpQ9dh^WXn}$^S9yv#0i* zg_~-mfG$!kag8WRNi0dVN-jzTQVd20hNij(#=3@vAqEy!CYDylK(4u!fq~ULo{cCP ca`RI%(<*Um@IJhS7pQ^3)78&qol`;+0DZV~UH||9 literal 0 HcmV?d00001 diff --git a/images/jquery-ui/ui-icons_222222_256x240.png b/images/jquery-ui/ui-icons_222222_256x240.png new file mode 100755 index 0000000000000000000000000000000000000000..82fad68f5f7131d7d06c0f8999c511e6d65d67fb GIT binary patch literal 6922 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 literal 0 HcmV?d00001 diff --git a/images/jquery-ui/ui-icons_228ef1_256x240.png b/images/jquery-ui/ui-icons_228ef1_256x240.png new file mode 100755 index 0000000000000000000000000000000000000000..0c554acbc625ea41123a7faea547a5696171fd29 GIT binary patch literal 4549 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 literal 0 HcmV?d00001 diff --git a/images/jquery-ui/ui-icons_555555_256x240.png b/images/jquery-ui/ui-icons_555555_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..7009bf752f54a13850f5cd3c2956b1c4469b5c65 GIT binary patch literal 6988 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 DJqb9i literal 0 HcmV?d00001 diff --git a/images/jquery-ui/ui-icons_777777_256x240.png b/images/jquery-ui/ui-icons_777777_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..8e26ee4fd8c3d9f55b7495bd708181b8558c861c GIT binary patch literal 6999 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 MNJH&PP0W-304*4($N&HU literal 0 HcmV?d00001 diff --git a/images/jquery-ui/ui-icons_ffffff_256x240.png b/images/jquery-ui/ui-icons_ffffff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..4d66f596e5967a460a37526e2130a55711eeca3c GIT binary patch literal 6299 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 literal 0 HcmV?d00001 diff --git a/jquery-ui.html b/jquery-ui.html new file mode 100755 index 0000000000..2473b49692 --- /dev/null +++ b/jquery-ui.html @@ -0,0 +1,513 @@ + + + + + jQuery UI Example Page + + + + + +

Welcome to jQuery UI!

+ +
+

This page demonstrates the widgets and theme you selected in Download Builder. Please make sure you are using them with a compatible jQuery version.

+
+ +

YOUR COMPONENTS:

+ + + +

Accordion

+
+

First

+
Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.
+

Second

+
Phasellus mattis tincidunt nibh.
+

Third

+
Nam dui erat, auctor a, dignissim quis.
+
+ + + + +

Autocomplete

+
+ +
+ + + + +

Button

+ +
+
+ + + +
+
+ + + + +

Tabs

+
+ +
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+
Phasellus mattis tincidunt nibh. Cras orci urna, blandit id, pretium vel, aliquet ornare, felis. Maecenas scelerisque sem non nisl. Fusce sed lorem in enim dictum bibendum.
+
Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.
+
+ + + + +

Dialog

+

Open Dialog

+ +

Overlay and Shadow Classes (not currently used in UI widgets)

+
+

Lorem ipsum dolor sit amet, Nulla nec tortor. Donec id elit quis purus consectetur consequat.

Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci.

Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat.

Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam.

Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante.

Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi.

+ + +
+
+
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

+
+
+ +
+ + +
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

+
+ + + +

Framework Icons (content color preview)

+
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
+ + + +

Slider

+
+ + + + +

Datepicker

+
+ + + + +

Progressbar

+
+ + + + +

Selectmenu

+ + + + + +

Spinner

+ + + + + +

Menu

+ + + + + +

Tooltip

+

+ Tooltips can be attached to any element. When you hover +the element with your mouse, the title attribute is displayed in a little box next to the element, just like a native tooltip. +

+ + + +

Highlight / Error

+
+
+

+ Hey! Sample ui-state-highlight style.

+
+
+
+
+
+

+ Alert: Sample ui-state-error style.

+
+
+ + + + + + diff --git a/js/jquery-ui.min.js b/js/jquery-ui.min.js new file mode 100755 index 0000000000..5824d1292d --- /dev/null +++ b/js/jquery-ui.min.js @@ -0,0 +1,13 @@ +/*! jQuery UI - v1.11.4 - 2015-03-11 +* http://jqueryui.com +* Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js +* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */ + +(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/^(input|select|textarea|button|object)$/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}function s(e){for(var t,i;e.length&&e[0]!==document;){if(t=e.css("position"),("absolute"===t||"relative"===t||"fixed"===t)&&(i=parseInt(e.css("zIndex"),10),!isNaN(i)&&0!==i))return i;e=e.parent()}return 0}function n(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},e.extend(this._defaults,this.regional[""]),this.regional.en=e.extend(!0,{},this.regional[""]),this.regional["en-US"]=e.extend(!0,{},this.regional.en),this.dpDiv=a(e("
"))}function a(t){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return t.delegate(i,"mouseout",function(){e(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",o)}function o(){e.datepicker._isDisabledDatepicker(v.inline?v.dpDiv.parent()[0]:v.input[0])||(e(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),e(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).addClass("ui-datepicker-next-hover"))}function r(t,i){e.extend(t,i);for(var s in i)null==i[s]&&(t[s]=i[s]);return t}function h(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.4",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var l=0,u=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,n=u.call(arguments,1),a=0,o=n.length;o>a;a++)for(i in n[a])s=n[a][i],n[a].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(n){var a="string"==typeof n,o=u.call(arguments,1),r=this;return a?this.each(function(){var i,a=e.data(this,s);return"instance"===n?(r=a,!1):a?e.isFunction(a[n])&&"_"!==n.charAt(0)?(i=a[n].apply(a,o),i!==a&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+n+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+n+"'")}):(o.length&&(n=e.widget.extend.apply(null,[n].concat(o))),this.each(function(){var t=e.data(this,s);t?(t.option(n||{}),t._init&&t._init()):e.data(this,s,new i(n,this))})),r}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=l++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(t,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(i).undelegate(i),this.bindings=e(this.bindings.not(t).get()),this.focusable=e(this.focusable.not(t).get()),this.hoverable=e(this.hoverable.not(t).get())},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var d=!1;e(document).mouseup(function(){d=!1}),e.widget("ui.mouse",{version:"1.11.4",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!d){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),d=!0,!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button)return this._mouseUp(t);if(!t.which)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),d=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),function(){function t(e,t,i){return[parseFloat(e[0])*(p.test(e[0])?t/100:1),parseFloat(e[1])*(p.test(e[1])?i/100:1)]}function i(t,i){return parseInt(e.css(t,i),10)||0}function s(t){var i=t[0];return 9===i.nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:e.isWindow(i)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()}}e.ui=e.ui||{};var n,a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,u=/top|center|bottom/,d=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,p=/%$/,f=e.fn.position;e.position={scrollbarWidth:function(){if(void 0!==n)return n;var t,i,s=e("
"),a=s.children()[0];return e("body").append(s),t=a.offsetWidth,s.css("overflow","scroll"),i=a.offsetWidth,t===i&&(i=s[0].clientWidth),s.remove(),n=t-i},getScrollInfo:function(t){var i=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),s=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),n="scroll"===i||"auto"===i&&t.widthi?"left":t>0?"right":"center",vertical:0>a?"top":s>0?"bottom":"middle"};d>m&&m>r(t+i)&&(h.horizontal="center"),c>g&&g>r(s+a)&&(h.vertical="middle"),h.important=o(r(t),r(i))>o(r(s),r(a))?"horizontal":"vertical",n.using.call(this,e,h)}),u.offset(e.extend(M,{using:l}))})},e.ui.position={fit:{left:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=e.left-t.collisionPosition.marginLeft,h=n-r,l=r+t.collisionWidth-a-n;t.collisionWidth>a?h>0&&0>=l?(i=e.left+h+t.collisionWidth-a-n,e.left+=h-i):e.left=l>0&&0>=h?n:h>l?n+a-t.collisionWidth:n:h>0?e.left+=h:l>0?e.left-=l:e.left=o(e.left-r,e.left)},top:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollTop:s.offset.top,a=t.within.height,r=e.top-t.collisionPosition.marginTop,h=n-r,l=r+t.collisionHeight-a-n;t.collisionHeight>a?h>0&&0>=l?(i=e.top+h+t.collisionHeight-a-n,e.top+=h-i):e.top=l>0&&0>=h?n:h>l?n+a-t.collisionHeight:n:h>0?e.top+=h:l>0?e.top-=l:e.top=o(e.top-r,e.top)}},flip:{left:function(e,t){var i,s,n=t.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=e.left-t.collisionPosition.marginLeft,u=l-h,d=l+t.collisionWidth-o-h,c="left"===t.my[0]?-t.elemWidth:"right"===t.my[0]?t.elemWidth:0,p="left"===t.at[0]?t.targetWidth:"right"===t.at[0]?-t.targetWidth:0,f=-2*t.offset[0];0>u?(i=e.left+c+p+f+t.collisionWidth-o-a,(0>i||r(u)>i)&&(e.left+=c+p+f)):d>0&&(s=e.left-t.collisionPosition.marginLeft+c+p+f-h,(s>0||d>r(s))&&(e.left+=c+p+f))},top:function(e,t){var i,s,n=t.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=e.top-t.collisionPosition.marginTop,u=l-h,d=l+t.collisionHeight-o-h,c="top"===t.my[1],p=c?-t.elemHeight:"bottom"===t.my[1]?t.elemHeight:0,f="top"===t.at[1]?t.targetHeight:"bottom"===t.at[1]?-t.targetHeight:0,m=-2*t.offset[1];0>u?(s=e.top+p+f+m+t.collisionHeight-o-a,(0>s||r(u)>s)&&(e.top+=p+f+m)):d>0&&(i=e.top-t.collisionPosition.marginTop+p+f+m-h,(i>0||d>r(i))&&(e.top+=p+f+m))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,i,s,n,o,r=document.getElementsByTagName("body")[0],h=document.createElement("div");t=document.createElement(r?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},r&&e.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)t.style[o]=s[o];t.appendChild(h),i=r||document.documentElement,i.insertBefore(t,i.firstChild),h.style.cssText="position: absolute; left: 10.7432222px;",n=e(h).offset().left,a=n>10&&11>n,t.innerHTML="",i.removeChild(t)}()}(),e.ui.position,e.widget("ui.accordion",{version:"1.11.4",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),t.collapsible||t.active!==!1&&null!=t.active||(t.active=0),this._processPanels(),0>t.active&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").removeUniqueId(),this._destroyIcons(),e=this.headers.next().removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").css("display","").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&e.css("height","")},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):("event"===e&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),"collapsible"!==e||t||this.options.active!==!1||this._activate(0),"icons"===e&&(this._destroyIcons(),t&&this._createIcons()),"disabled"===e&&(this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)),void 0)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var i=e.ui.keyCode,s=this.headers.length,n=this.headers.index(t.target),a=!1;switch(t.keyCode){case i.RIGHT:case i.DOWN:a=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:a=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(t);break;case i.HOME:a=this.headers[0];break;case i.END:a=this.headers[s-1]}a&&(e(t.target).attr("tabIndex",-1),e(a).attr("tabIndex",0),a.focus(),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t=this.options;this._processPanels(),t.active===!1&&t.collapsible===!0||!this.headers.length?(t.active=!1,this.active=e()):t.active===!1?this._activate(0):this.active.length&&!e.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=e()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var e=this.headers,t=this.panels;this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-state-default ui-corner-all"),this.panels=this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide(),t&&(this._off(e.not(this.headers)),this._off(t.not(this.panels)))},_refresh:function(){var t,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(){var t=e(this),i=t.uniqueId().attr("id"),s=t.next(),n=s.uniqueId().attr("id");t.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(t=n.height(),this.element.siblings(":visible").each(function(){var i=e(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(t-=i.outerHeight(!0))}),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===s&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).css("height","").height())}).height(t))},_activate:function(t){var i=this._findActive(t)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):e()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n[0]===s[0],o=a&&i.collapsible,r=o?e():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:o?e():n,newPanel:r};t.preventDefault(),a&&!i.collapsible||this._trigger("beforeActivate",t,l)===!1||(i.active=o?!1:this.headers.index(n),this.active=a?e():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),a||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(t){var i=t.newPanel,s=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,t):(s.hide(),i.show(),this._toggleComplete(t)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(e(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(e,t,i){var s,n,a,o=this,r=0,h=e.css("box-sizing"),l=e.length&&(!t.length||e.index()",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},items:"> *",menus:"ul",position:{my:"left-1 top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item":function(e){e.preventDefault()},"click .ui-menu-item":function(t){var i=e(t.target);!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&e(this.document[0].activeElement).closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){if(!this.previousFilter){var i=e(t.currentTarget); +i.siblings(".ui-state-active").removeClass("ui-state-active"),this.focus(t,i)}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var i=this.active||this.element.find(this.options.items).eq(0);t||this.focus(e,i)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){this._closeOnDocumentClick(e)&&this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-menu-icons ui-front").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").removeUniqueId().removeClass("ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){var i,s,n,a,o=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:o=!1,s=this.previousFilter||"",n=String.fromCharCode(t.keyCode),a=!1,clearTimeout(this.filterTimer),n===s?a=!0:n=s+n,i=this._filterMenuItems(n),i=a&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(t.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(t,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}o&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.is("[aria-haspopup='true']")?this.expand(e):this.select(e))},refresh:function(){var t,i,s=this,n=this.options.icons.submenu,a=this.element.find(this.options.menus);this.element.toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length),a.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-front").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=e(this),i=t.parent(),s=e("").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);i.attr("aria-haspopup","true").prepend(s),t.attr("aria-labelledby",i.attr("id"))}),t=a.add(this.element),i=t.find(this.options.items),i.not(".ui-menu-item").each(function(){var t=e(this);s._isDivider(t)&&t.addClass("ui-widget-content ui-menu-divider")}),i.not(".ui-menu-item, .ui-menu-divider").addClass("ui-menu-item").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(e,t){"icons"===e&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(t.submenu),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},focus:function(e,t){var i,s;this.blur(e,e&&"focus"===e.type),this._scrollIntoView(t),this.active=t.first(),s=this.active.addClass("ui-state-focus").removeClass("ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").addClass("ui-state-active"),e&&"keydown"===e.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=t.children(".ui-menu"),i.length&&e&&/^mouse/.test(e.type)&&this._startOpening(i),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var i,s,n,a,o,r;this._hasScroll()&&(i=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,n=t.offset().top-this.activeMenu.offset().top-i-s,a=this.activeMenu.scrollTop(),o=this.activeMenu.height(),r=t.outerHeight(),0>n?this.activeMenu.scrollTop(a+n):n+r>o&&this.activeMenu.scrollTop(a+n-o+r))},blur:function(e,t){t||clearTimeout(this.timer),this.active&&(this.active.removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active}))},_startOpening:function(e){clearTimeout(this.timer),"true"===e.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(e)},this.delay))},_open:function(t){var i=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(t,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(t),this.activeMenu=s},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find(".ui-state-active").not(".ui-state-focus").removeClass("ui-state-active")},_closeOnDocumentClick:function(t){return!e(t.target).closest(".ui-menu").length},_isDivider:function(e){return!/[^\-\u2014\u2013\s]/.test(e.text())},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,i){var s;this.active&&(s="first"===e||"last"===e?this.active["first"===e?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[e+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[t]()),this.focus(i,s)},nextPage:function(t){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=e(this),0>i.offset().top-s-n}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(t),void 0)},previousPage:function(t){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=e(this),i.offset().top-s+n>0}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items).first())),void 0):(this.next(t),void 0)},_hasScroll:function(){return this.element.outerHeight()",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return t=!0,s=!0,i=!0,void 0;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:t=!0,this._move("nextPage",n);break;case a.UP:t=!0,this._keyEvent("previous",n);break;case a.DOWN:t=!0,this._keyEvent("next",n);break;case a.ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),void 0):(this._searchTimeout(e),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(e),this._change(e),void 0)}}),this._initSource(),this.menu=e("