The response has been limited to 50k tokens of the smallest files in the repo. You can remove this limitation by removing the max tokens filter.
├── .coveragerc
├── .gitattributes
├── .gitignore
├── .pylintrc
├── .travis.yml
├── .travis
    ├── after_script
    └── script
├── AUTHORS.rst
├── CONTRIBUTING.rst
├── LICENSE
├── MANIFEST.in
├── README.rst
├── admin
    ├── LICENSE.template
    ├── __init__.py
    ├── _preamble.py
    ├── acceptance.py
    ├── add-cluster-nodes
    ├── ami-search-ubuntu
    ├── aws.py
    ├── build-package
    ├── build-package-entrypoint
    ├── build_targets
    │   ├── centos-7
    │   │   └── Dockerfile
    │   ├── ubuntu-14.04
    │   │   └── Dockerfile
    │   └── ubuntu-16.04
    │   │   └── Dockerfile
    ├── cleanup.py
    ├── cleanup_cloud_resources
    ├── client.py
    ├── cluster_add_nodes.py
    ├── cluster_setup.py
    ├── create-cloudformation-template
    ├── create-release-branch
    ├── eliotlogging.py
    ├── filter-eliot
    ├── find-flaky-tests
    ├── flaky.py
    ├── functional
    │   ├── __init__.py
    │   ├── test_aws.py
    │   └── test_release.py
    ├── initialize-release
    ├── installer
    │   ├── __init__.py
    │   ├── _images.py
    │   ├── cloudformation.py
    │   ├── common.sh
    │   ├── docker-swarm-ca-setup.sh
    │   ├── flocker-configuration-generator.sh
    │   ├── flocker-configuration-getter.sh
    │   ├── packer
    │   │   ├── provision_ubuntu-16.04_docker.sh
    │   │   ├── provision_ubuntu-16.04_flocker.sh
    │   │   ├── template_ubuntu-16.04_docker.json
    │   │   └── template_ubuntu-16.04_flocker.json
    │   ├── setup_client.sh
    │   ├── setup_docker.sh
    │   ├── setup_s3.sh
    │   ├── setup_swarm_manager.sh
    │   ├── setup_swarm_node.sh
    │   ├── setup_volumehub.sh
    │   └── signal_config_completion.sh
    ├── merge-pr
    ├── merge_pr.py
    ├── package-files
    │   ├── after-install.sh
    │   ├── docker-plugin
    │   │   ├── systemd
    │   │   │   └── flocker-docker-plugin.service
    │   │   └── upstart
    │   │   │   └── flocker-docker-plugin.conf
    │   ├── firewalld-services
    │   │   ├── flocker-control-agent.xml
    │   │   └── flocker-control-api.xml
    │   ├── rsyslog
    │   │   └── flocker.conf
    │   ├── systemd
    │   │   ├── flocker-container-agent.service
    │   │   ├── flocker-control.service
    │   │   └── flocker-dataset-agent.service
    │   ├── ufw-applications.d
    │   │   ├── flocker-control-agent
    │   │   └── flocker-control-api
    │   └── upstart
    │   │   ├── flocker-container-agent.conf
    │   │   ├── flocker-control.conf
    │   │   └── flocker-dataset-agent.conf
    ├── packaging.py
    ├── publish-artifacts
    ├── publish-docs
    ├── publish-installer-images
    ├── release-packaging
    │   ├── README.rst
    │   ├── centos
    │   │   ├── clusterhq-release.spec
    │   │   └── clusterhq.repo
    │   └── rhel
    │   │   ├── clusterhq-release.spec
    │   │   └── clusterhq.repo
    ├── release.py
    ├── requirements.Dockerfile
    ├── requirements.py
    ├── run-acceptance-tests
    ├── run-client-tests
    ├── setup-cluster
    ├── test-artifacts
    ├── test
    │   ├── __init__.py
    │   ├── apt-repo
    │   │   ├── clusterhq-flocker-cli_0.3.3-0.dev.7_all.deb
    │   │   ├── clusterhq-flocker-docker-plugin_0.3.3-0.dev.7_all.deb
    │   │   └── clusterhq-flocker-node_0.3.3-0.dev.7_all.deb
    │   ├── installer
    │   │   └── postgres
    │   │   │   ├── docker-compose-node1.yml
    │   │   │   └── docker-compose-node2.yml
    │   ├── packer_outputs
    │   │   ├── PACKER_OUTPUT_NONE
    │   │   ├── PACKER_OUTPUT_US_ALL
    │   │   └── PACKER_OUTPUT_US_WEST_1
    │   ├── test_acceptance.py
    │   ├── test_cluster_setup.py
    │   ├── test_images.py
    │   ├── test_installer.py
    │   ├── test_merge_pr.py
    │   ├── test_packaging.py
    │   ├── test_release.py
    │   └── yum-repo
    │   │   ├── clusterhq-flocker-cli-0.3.3-0.dev.7.noarch.rpm
    │   │   ├── clusterhq-flocker-docker-plugin-0.3.3-0.dev.7.noarch.rpm
    │   │   └── clusterhq-flocker-node-0.3.3-0.dev.7.noarch.rpm
    ├── ubuntu.py
    ├── update-license
    ├── update-requirements
    ├── update-requirements-entrypoint
    └── yum.py
├── benchmark
    ├── __init__.py
    ├── _driver.py
    ├── _flocker.py
    ├── _interfaces.py
    ├── _method.py
    ├── benchmark
    ├── benchmark.yml
    ├── cleanup-cluster
    ├── cluster.py
    ├── cluster_cleanup.py
    ├── cluster_containers_setup.py
    ├── metrics-parser
    ├── metrics
    │   ├── __init__.py
    │   ├── cputime.py
    │   ├── test
    │   │   ├── __init__.py
    │   │   ├── test_cputime.py
    │   │   └── test_wallclock.py
    │   └── wallclock.py
    ├── metrics_parser.py
    ├── operations
    │   ├── __init__.py
    │   ├── _common.py
    │   ├── create_container.py
    │   ├── create_dataset.py
    │   ├── no_op.py
    │   ├── read_request.py
    │   ├── test
    │   │   ├── __init__.py
    │   │   ├── test_create_container.py
    │   │   ├── test_create_dataset.py
    │   │   ├── test_no_op.py
    │   │   ├── test_read_request.py
    │   │   └── test_wait.py
    │   └── wait.py
    ├── scenarios
    │   ├── __init__.py
    │   ├── _rate_measurer.py
    │   ├── _request_load.py
    │   ├── no_load.py
    │   ├── read_request_load.py
    │   ├── test
    │   │   ├── __init__.py
    │   │   ├── test_no_load.py
    │   │   ├── test_rate_measurer.py
    │   │   ├── test_read_request_load.py
    │   │   ├── test_request_load.py
    │   │   └── test_write_request_load.py
    │   └── write_request_load.py
    ├── script.py
    ├── setup-cluster-containers
    ├── submit.py
    └── test
    │   ├── __init__.py
    │   ├── test_cluster.py
    │   ├── test_driver.py
    │   ├── test_method.py
    │   ├── test_metrics_parser.py
    │   └── test_script.py
├── build.yaml
├── dev-requirements.txt
├── dockerfiles
    ├── control
    │   └── Dockerfile
    ├── dataset
    │   └── Dockerfile
    └── docker-plugin
    │   └── Dockerfile
├── docs
    ├── Makefile
    ├── _static
    │   └── .placeholder
    ├── _templates
    │   └── .placeholder
    ├── _themes
    │   └── clusterhq
    │   │   ├── layout.html
    │   │   ├── layout_docs.html
    │   │   ├── layout_version.html
    │   │   ├── search.html
    │   │   ├── static
    │   │       ├── css
    │   │       │   ├── bootstrap-theme.css
    │   │       │   ├── bootstrap-theme.css.map
    │   │       │   ├── bootstrap-theme.min.css
    │   │       │   ├── bootstrap.css
    │   │       │   ├── bootstrap.css.map
    │   │       │   ├── bootstrap.min.css
    │   │       │   ├── docs.css
    │   │       │   ├── homepage.css
    │   │       │   └── pygments.css
    │   │       ├── files
    │   │       ├── fonts
    │   │       │   ├── glyphicons-halflings-regular.eot
    │   │       │   ├── glyphicons-halflings-regular.svg
    │   │       │   ├── glyphicons-halflings-regular.ttf
    │   │       │   └── glyphicons-halflings-regular.woff
    │   │       ├── images
    │   │       │   ├── AWS.png
    │   │       │   ├── GCE.png
    │   │       │   ├── Untitled-2.png
    │   │       │   ├── amazon-docker2x.png
    │   │       │   ├── arrow.png
    │   │       │   ├── arrow@2x.png
    │   │       │   ├── centos2x.png
    │   │       │   ├── ceph2x.png
    │   │       │   ├── clusterhq.png
    │   │       │   ├── clusterhq@2x.png
    │   │       │   ├── convergeio2x.png
    │   │       │   ├── coprhd.png
    │   │       │   ├── coreos2x.png
    │   │       │   ├── default2x.png
    │   │       │   ├── dell2x.png
    │   │       │   ├── docker2x.png
    │   │       │   ├── download@2x.png
    │   │       │   ├── emc2x.png
    │   │       │   ├── exclamation@2x.png
    │   │       │   ├── flocker.png
    │   │       │   ├── flocker@2x.png
    │   │       │   ├── gce2x.png
    │   │       │   ├── hedvig2x.png
    │   │       │   ├── huawei2x.png
    │   │       │   ├── icon-community2x.png
    │   │       │   ├── icon-labs2x.png
    │   │       │   ├── icon-question2x.png
    │   │       │   ├── icon-soon2x.png
    │   │       │   ├── kaminario.png
    │   │       │   ├── kubernetes2x.png
    │   │       │   ├── logo-woodmark@2x.png
    │   │       │   ├── macbook@2x.png
    │   │       │   ├── menu@2x.png
    │   │       │   ├── mesos2x.png
    │   │       │   ├── migration@2x.png
    │   │       │   ├── netapp2x.png
    │   │       │   ├── nexenta2x.png
    │   │       │   ├── nodes@2x.png
    │   │       │   ├── open-vstorage.png
    │   │       │   ├── openstack2x.png
    │   │       │   ├── pure-storage.png
    │   │       │   ├── rhel72x.png
    │   │       │   ├── saratoga2x.png
    │   │       │   ├── search-icon@2x.png
    │   │       │   ├── signup.png
    │   │       │   ├── signup@2x.png
    │   │       │   ├── ubuntu2x.png
    │   │       │   ├── vmware2x.png
    │   │       │   └── warning@2x.png
    │   │       └── js
    │   │       │   ├── feedback.js
    │   │       │   ├── main.js
    │   │       │   ├── plugins.js
    │   │       │   ├── segment.js
    │   │       │   └── vendor
    │   │       │       ├── bootstrap.js
    │   │       │       ├── bootstrap.min.js
    │   │       │       ├── jquery-1.11.1.min.js
    │   │       │       ├── modernizr-2.6.2-respond-1.1.0.min.js
    │   │       │       ├── npm.js
    │   │       │       └── retina.min.js
    │   │   └── theme.conf
    ├── administering
    │   ├── debugging.rst
    │   ├── index.rst
    │   └── upgrading.rst
    ├── conf.py
    ├── docker-integration
    │   ├── about.rst
    │   ├── cloudformation.rst
    │   ├── configuring-authentication.rst
    │   ├── configuring-nodes-storage.rst
    │   ├── control-plugin.rst
    │   ├── enabling-agent-service.rst
    │   ├── enabling-control-service.rst
    │   ├── generate-api-certificates.rst
    │   ├── generate-api-plugin.rst
    │   ├── index.rst
    │   ├── install-client.rst
    │   ├── install-node.rst
    │   ├── manual-install.rst
    │   ├── setup-aws.rst
    │   ├── setup-gce.rst
    │   ├── setup-rackspace.rst
    │   ├── tutorial-downloads
    │   │   ├── flocker-swarm-tutorial-node1.yml
    │   │   └── flocker-swarm-tutorial-node2.yml
    │   └── tutorial-swarm-compose.rst
    ├── error_pages
    │   └── 404.rst
    ├── faq
    │   └── index.rst
    ├── filters.py
    ├── flocker-features
    │   ├── architecture.rst
    │   ├── aws-configuration.rst
    │   ├── convergeio-configuration.rst
    │   ├── coprhd-configuration.rst
    │   ├── dell-configuration.rst
    │   ├── emc-configuration.rst
    │   ├── flockerctl.rst
    │   ├── gce-configuration.rst
    │   ├── hedvig-configuration.rst
    │   ├── huawei-configuration.rst
    │   ├── index.rst
    │   ├── kaminario-configuration.rst
    │   ├── loopback-configuration.rst
    │   ├── netapp-configuration.rst
    │   ├── nexenta-configuration.rst
    │   ├── open-vstorage-configuration.rst
    │   ├── openstack-configuration.rst
    │   ├── pure-storage-configuration.rst
    │   ├── saratogaspeed-configuration.rst
    │   ├── security.rst
    │   ├── storage-backends.rst
    │   ├── storage-profiles.rst
    │   └── vmware-configuration.rst
    ├── flocker-standalone
    │   ├── configuring-authentication.rst
    │   ├── configuring-nodes-storage.rst
    │   ├── enabling-agent-service.rst
    │   ├── enabling-control-service.rst
    │   ├── generate-api-certificates.rst
    │   ├── index.rst
    │   ├── install-client.rst
    │   ├── install-node.rst
    │   ├── manual-install.rst
    │   ├── setup-aws.rst
    │   ├── setup-gce.rst
    │   └── setup-rackspace.rst
    ├── gettinginvolved
    │   ├── acceptance-testing.rst
    │   ├── authors.rst
    │   ├── benchmarking.rst
    │   ├── client-testing.rst
    │   ├── cluster-setup.rst
    │   ├── contributing.rst
    │   ├── example-acceptance.yml
    │   ├── functional-testing.rst
    │   ├── index.rst
    │   ├── infrastructure
    │   │   ├── documentation.rst
    │   │   ├── index.rst
    │   │   ├── maintaining-cloudformation.rst
    │   │   ├── packaging.rst
    │   │   ├── release-process.rst
    │   │   └── release-schedule-versioning.rst
    │   └── plugins
    │   │   ├── building-driver.rst
    │   │   ├── faq.rst
    │   │   ├── index.rst
    │   │   └── prereqs.rst
    ├── images
    │   ├── 3rd-party.png
    │   ├── AWS.png
    │   ├── GCE.png
    │   ├── Untitled-2.png
    │   ├── amazon-docker2x.png
    │   ├── amazon2x.png
    │   ├── apache-mesos-logo.png
    │   ├── centos.png
    │   ├── ceph.png
    │   ├── client-swarmhost.png
    │   ├── cloudformation.png
    │   ├── coming-soon.png
    │   ├── convergeio.png
    │   ├── coreos.png
    │   ├── default2x.png
    │   ├── dell.png
    │   ├── docker.png
    │   ├── docker2.png
    │   ├── docker2x.png
    │   ├── emc.png
    │   ├── experimental.png
    │   ├── flocker.png
    │   ├── flockerctl-status.png
    │   ├── gce2x.png
    │   ├── hedvig.png
    │   ├── high-level-flocker-architecture.png
    │   ├── huawei.png
    │   ├── icon-docker2x.png
    │   ├── icon-kubernetes2x.png
    │   ├── icon-mesos2x.png
    │   ├── icon-question2x.png
    │   ├── installer-swarm-compose
    │   │   ├── 01-keys-menu.png
    │   │   ├── 02-create-key.png
    │   │   ├── 03-pem-downloaded.png
    │   │   ├── 10-cloudformation-firstpage.png
    │   │   ├── 11-cloudformation-stackname.png
    │   │   ├── 12-cloudformation-settings.png
    │   │   ├── 13-cloudformation-create.png
    │   │   ├── 21-refresh.png
    │   │   ├── 22-create-in-progress.png
    │   │   ├── 23-create-complete.png
    │   │   ├── 31-stack-outputs.png
    │   │   └── 32-volume-hub-verification.png
    │   ├── kettle.png
    │   ├── keypair.png
    │   ├── kubernetes.png
    │   ├── kubernetes2x.png
    │   ├── mesos-rancher-logos.png
    │   ├── mesos.png
    │   ├── mesos2x.png
    │   ├── mesosphere.png
    │   ├── netapp.png
    │   ├── nexenta.png
    │   ├── node1.png
    │   ├── node2.png
    │   ├── open-vstorage.png
    │   ├── open_in_new_window.png
    │   ├── openstack.png
    │   ├── openstack2x.png
    │   ├── parameters.png
    │   ├── questionmark.png
    │   ├── rhel.png
    │   ├── routing.svg
    │   ├── routing_inkscape.svg
    │   ├── saratoga.png
    │   ├── scaleio.jpeg
    │   ├── stack.png
    │   ├── swarm-status.png
    │   ├── ubuntu.png
    │   ├── vmware.png
    │   ├── vmware2x.png
    │   └── volumes-gui-screenshot.png
    ├── index.rst
    ├── installation
    │   ├── configuring-authentication.rst
    │   ├── configuring-nodes-storage.rst
    │   ├── enabling-agent-service.rst
    │   ├── enabling-control-service.rst
    │   ├── generate-api-certificates.rst
    │   ├── index.rst
    │   ├── install-client.rst
    │   ├── install-node.rst
    │   ├── linux-install.sh.template
    │   ├── setup-aws.rst
    │   ├── setup-gce.rst
    │   └── setup-rackspace.rst
    ├── kubernetes-integration
    │   ├── about.rst
    │   ├── configuring-authentication.rst
    │   ├── configuring-nodes-storage.rst
    │   ├── enabling-agent-service.rst
    │   ├── enabling-control-service.rst
    │   ├── generate-api-certificates.rst
    │   ├── index.rst
    │   ├── install-client.rst
    │   ├── install-node.rst
    │   ├── manual-install.rst
    │   ├── setup-aws.rst
    │   ├── setup-gce.rst
    │   └── setup-rackspace.rst
    ├── mesos-integration
    │   └── index.rst
    ├── redirects.yaml
    ├── reference
    │   ├── api.rst
    │   ├── api_examples.yml
    │   ├── index.rst
    │   └── leases.rst
    ├── releasenotes
    │   └── index.rst
    ├── spelling_wordlist.txt
    ├── supported
    │   ├── flockercontainers.rst
    │   └── index.rst
    └── version.rst
├── flocker
    ├── __init__.py
    ├── _twisted.py
    ├── _version.py
    ├── acceptance
    │   ├── __init__.py
    │   ├── endtoend
    │   │   ├── __init__.py
    │   │   ├── test_benchmark.py
    │   │   ├── test_dataset.py
    │   │   ├── test_diagnostics.py
    │   │   ├── test_dockerplugin.py
    │   │   └── test_leases.py
    │   ├── integration
    │   │   ├── __init__.py
    │   │   ├── test_mongodb.py
    │   │   ├── test_platform.py
    │   │   ├── test_postgres.py
    │   │   └── testtools.py
    │   ├── node_scripts
    │   │   ├── __init__.py
    │   │   ├── disable_service.py
    │   │   ├── enable_service.py
    │   │   └── service_running.py
    │   ├── obsolete
    │   │   ├── __init__.py
    │   │   └── test_containers.py
    │   ├── scripts
    │   │   ├── __init__.py
    │   │   ├── datahttp.py
    │   │   ├── envhttp.py
    │   │   ├── exitinghttp.py
    │   │   ├── hellohttp.py
    │   │   ├── lsblkhttp.py
    │   │   ├── nonrootwritehttp.py
    │   │   ├── proxyhttp.py
    │   │   └── remember_boot_id.py
    │   ├── test
    │   │   ├── __init__.py
    │   │   └── test_testtools.py
    │   └── testtools.py
    ├── apiclient
    │   ├── __init__.py
    │   ├── _client.py
    │   └── test
    │   │   ├── __init__.py
    │   │   └── test_client.py
    ├── ca
    │   ├── __init__.py
    │   ├── _ca.py
    │   ├── _script.py
    │   ├── _validation.py
    │   ├── functional
    │   │   ├── __init__.py
    │   │   ├── test_ca.py
    │   │   └── test_validation.py
    │   ├── test
    │   │   ├── __init__.py
    │   │   ├── test_ca.py
    │   │   ├── test_script.py
    │   │   └── test_validation.py
    │   └── testtools.py
    ├── cli
    │   ├── __init__.py
    │   ├── _sshconfig.py
    │   └── functional
    │   │   ├── __init__.py
    │   │   └── test_sshconfig.py
    ├── common
    │   ├── __init__.py
    │   ├── _defer.py
    │   ├── _era.py
    │   ├── _filepath.py
    │   ├── _interface.py
    │   ├── _ipc.py
    │   ├── _net.py
    │   ├── _retry.py
    │   ├── _thread.py
    │   ├── algebraic.py
    │   ├── configuration.py
    │   ├── functional
    │   │   ├── __init__.py
    │   │   ├── test_era.py
    │   │   ├── test_ipc.py
    │   │   ├── test_runner.py
    │   │   └── test_script.py
    │   ├── logging.py
    │   ├── plugin.py
    │   ├── process.py
    │   ├── runner.py
    │   ├── script.py
    │   ├── test
    │   │   ├── __init__.py
    │   │   ├── sample_script.py
    │   │   ├── test_algebraic.py
    │   │   ├── test_defer.py
    │   │   ├── test_era.py
    │   │   ├── test_filepath.py
    │   │   ├── test_interface.py
    │   │   ├── test_ipc.py
    │   │   ├── test_logging.py
    │   │   ├── test_openstack.py
    │   │   ├── test_plugin.py
    │   │   ├── test_process.py
    │   │   ├── test_retry.py
    │   │   ├── test_runner.py
    │   │   ├── test_script.py
    │   │   ├── test_thread.py
    │   │   └── test_version.py
    │   └── version.py
    ├── control
    │   ├── __init__.py
    │   ├── _clusterstate.py
    │   ├── _config.py
    │   ├── _diffing.py
    │   ├── _generations.py
    │   ├── _model.py
    │   ├── _persistence.py
    │   ├── _protocol.py
    │   ├── _registry.py
    │   ├── functional
    │   │   ├── __init__.py
    │   │   └── test_script.py
    │   ├── httpapi.py
    │   ├── schema
    │   │   ├── endpoints.yml
    │   │   └── types.yml
    │   ├── script.py
    │   ├── test
    │   │   ├── __init__.py
    │   │   ├── clusterstatetools.py
    │   │   ├── configurations
    │   │   │   ├── configuration_1_v1.json
    │   │   │   ├── configuration_1_v2.json
    │   │   │   ├── configuration_1_v3.json
    │   │   │   ├── configuration_1_v4.json
    │   │   │   ├── configuration_1_v5.json
    │   │   │   ├── configuration_1_v6.json
    │   │   │   ├── configuration_2_v4.json
    │   │   │   ├── configuration_2_v5.json
    │   │   │   ├── configuration_2_v6.json
    │   │   │   ├── configuration_v1.py
    │   │   │   ├── configuration_v2.py
    │   │   │   ├── configuration_v3.py
    │   │   │   ├── configuration_v4.py
    │   │   │   └── configuration_v5.py
    │   │   ├── persisted_model.json
    │   │   ├── test_clusterstate.py
    │   │   ├── test_config.py
    │   │   ├── test_diffing.py
    │   │   ├── test_generations.py
    │   │   ├── test_httpapi.py
    │   │   ├── test_model.py
    │   │   ├── test_model_change.py
    │   │   ├── test_persistence.py
    │   │   ├── test_protocol.py
    │   │   ├── test_registry.py
    │   │   ├── test_schemas.py
    │   │   └── test_script.py
    │   └── testtools.py
    ├── dockerplugin
    │   ├── __init__.py
    │   ├── _api.py
    │   ├── _script.py
    │   ├── schema
    │   │   ├── endpoints.yml
    │   │   └── types.yml
    │   └── test
    │   │   ├── __init__.py
    │   │   ├── test_api.py
    │   │   ├── test_schemas.py
    │   │   └── test_script.py
    ├── docs
    │   ├── __init__.py
    │   ├── bootstrap
    │   │   ├── __init__.py
    │   │   ├── _extension.py
    │   │   ├── _logo.py
    │   │   ├── _simple.py
    │   │   └── _tabs.py
    │   ├── test
    │   │   ├── __init__.py
    │   │   └── test_version_extensions.py
    │   └── version_extensions.py
    ├── node
    │   ├── __init__.py
    │   ├── _change.py
    │   ├── _container.py
    │   ├── _deploy.py
    │   ├── _docker.py
    │   ├── _loop.py
    │   ├── _p2p.py
    │   ├── agents
    │   │   ├── __init__.py
    │   │   ├── _logging.py
    │   │   ├── blockdevice.py
    │   │   ├── blockdevice_manager.py
    │   │   ├── cinder.py
    │   │   ├── ebs.py
    │   │   ├── functional
    │   │   │   ├── __init__.py
    │   │   │   ├── logging.py
    │   │   │   ├── test_cinder.py
    │   │   │   ├── test_cinder_behaviour.py
    │   │   │   ├── test_ebs.py
    │   │   │   └── test_gce.py
    │   │   ├── gce.py
    │   │   ├── loopback.py
    │   │   ├── test
    │   │   │   ├── __init__.py
    │   │   │   ├── strategies.py
    │   │   │   ├── test_blockdevice.py
    │   │   │   ├── test_blockdevice_manager.py
    │   │   │   ├── test_cinder.py
    │   │   │   ├── test_ebs.py
    │   │   │   ├── test_gce.py
    │   │   │   └── test_loopback.py
    │   │   └── testtools
    │   │   │   ├── __init__.py
    │   │   │   ├── _blockdevice.py
    │   │   │   ├── _cinder.py
    │   │   │   └── _loopback.py
    │   ├── backends.py
    │   ├── benchmark.py
    │   ├── diagnostics.py
    │   ├── exceptions.py
    │   ├── functional
    │   │   ├── __init__.py
    │   │   ├── env-docker
    │   │   │   └── Dockerfile
    │   │   ├── retry-docker
    │   │   │   ├── Dockerfile
    │   │   │   └── run
    │   │   ├── sendbytes-docker
    │   │   │   ├── Dockerfile.in
    │   │   │   └── run.sh
    │   │   ├── test_deploy.py
    │   │   ├── test_docker.py
    │   │   └── test_script.py
    │   ├── script.py
    │   ├── test
    │   │   ├── __init__.py
    │   │   ├── dummybackend.py
    │   │   ├── istatechange.py
    │   │   ├── test_change.py
    │   │   ├── test_container.py
    │   │   ├── test_deploy.py
    │   │   ├── test_diagnostics.py
    │   │   ├── test_docker.py
    │   │   ├── test_loop.py
    │   │   ├── test_p2p.py
    │   │   ├── test_script.py
    │   │   └── test_testtools.py
    │   └── testtools.py
    ├── provision
    │   ├── __init__.py
    │   ├── _aws.py
    │   ├── _ca.py
    │   ├── _common.py
    │   ├── _effect.py
    │   ├── _gce.py
    │   ├── _install.py
    │   ├── _libcloud.py
    │   ├── _rackspace.py
    │   ├── _sphinx.py
    │   ├── _ssh
    │   │   ├── __init__.py
    │   │   ├── _conch.py
    │   │   ├── _keys.py
    │   │   └── _model.py
    │   ├── _tasks.py
    │   └── test
    │   │   ├── __init__.py
    │   │   ├── test_ca.py
    │   │   ├── test_common.py
    │   │   ├── test_gce.py
    │   │   ├── test_install.py
    │   │   ├── test_ssh_conch.py
    │   │   └── test_ssh_keys.py
    ├── restapi
    │   ├── __init__.py
    │   ├── _error.py
    │   ├── _infrastructure.py
    │   ├── _logging.py
    │   ├── _schema.py
    │   ├── docs
    │   │   ├── __init__.py
    │   │   ├── hidden_code_block.py
    │   │   ├── publicapi.py
    │   │   └── test
    │   │   │   ├── __init__.py
    │   │   │   └── test_publicapi.py
    │   ├── test
    │   │   ├── __init__.py
    │   │   ├── test_infrastructure.py
    │   │   ├── test_schema.py
    │   │   └── utils.py
    │   └── testtools.py
    ├── test
    │   ├── __init__.py
    │   ├── test_flocker.py
    │   ├── test_meta.py
    │   └── test_testtools.py
    ├── testtools
    │   ├── __init__.py
    │   ├── _base.py
    │   ├── _flaky.py
    │   ├── _testhelpers.py
    │   ├── amp.py
    │   ├── cluster_utils.py
    │   ├── matchers.py
    │   ├── ssh.py
    │   ├── strategies.py
    │   └── test
    │   │   ├── __init__.py
    │   │   ├── test_amp.py
    │   │   ├── test_base.py
    │   │   ├── test_cluster_utils.py
    │   │   ├── test_flaky.py
    │   │   └── test_matchers.py
    └── volume
    │   ├── __init__.py
    │   ├── _ipc.py
    │   ├── _model.py
    │   ├── filesystems
    │       ├── __init__.py
    │       ├── errors.py
    │       ├── interfaces.py
    │       ├── memory.py
    │       └── zfs.py
    │   ├── functional
    │       ├── __init__.py
    │       ├── test_filesystems_zfs.py
    │       ├── test_ipc.py
    │       ├── test_script.py
    │       └── test_service.py
    │   ├── script.py
    │   ├── service.py
    │   ├── test
    │       ├── __init__.py
    │       ├── filesystemtests.py
    │       ├── test_filesystems_memory.py
    │       ├── test_filesystems_zfs.py
    │       ├── test_ipc.py
    │       ├── test_script.py
    │       └── test_service.py
    │   └── testtools.py
├── jobs.groovy
├── requirements
    ├── admin-dev.txt
    ├── admin-dev.txt.in
    ├── admin.txt
    ├── admin.txt.in
    ├── all.txt
    ├── all.txt.latest
    ├── constraints.txt
    ├── flocker-dev.txt
    ├── flocker-dev.txt.in
    ├── flocker.txt
    ├── flocker.txt.in
    ├── lint.txt
    └── lint.txt.in
├── setup.cfg
├── setup.py
├── tox.ini
└── versioneer.py


/.coveragerc:
--------------------------------------------------------------------------------
1 | [run]
2 | omit =
3 |     */flocker/_version.py
4 | 


--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | flocker/_version.py export-subst
2 | 


--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
 1 | # Floobits
 2 | .floo
 3 | .flooignore
 4 | 
 5 | # Byte-compiled / optimized / DLL files
 6 | __pycache__/
 7 | *.py[cod]
 8 | 
 9 | # Editor artifacts
10 | *~
11 | 
12 | # C extensions
13 | *.so
14 | 
15 | # Distribution / packaging
16 | .Python
17 | env/
18 | bin/
19 | build/
20 | develop-eggs/
21 | dist/
22 | eggs/
23 | lib/
24 | lib64/
25 | parts/
26 | sdist/
27 | var/
28 | *.egg-info/
29 | .installed.cfg
30 | *.egg
31 | twisted/plugins/dropin.cache
32 | MANIFEST
33 | flocker.spec
34 | 
35 | # Installer logs
36 | pip-log.txt
37 | pip-delete-this-directory.txt
38 | 
39 | # Unit test / coverage reports
40 | htmlcov/
41 | .tox/
42 | .coverage
43 | .cache
44 | nosetests.xml
45 | coverage.xml
46 | _trial_temp*
47 | .hypothesis
48 | 
49 | # Translations
50 | *.mo
51 | 
52 | # Mr Developer
53 | .mr.developer.cfg
54 | .project
55 | .pydevproject
56 | 
57 | # Rope
58 | .ropeproject
59 | 
60 | # Django stuff:
61 | *.log
62 | *.pot
63 | 
64 | # Sphinx documentation
65 | docs/_build/
66 | 
67 | # Mac stuff
68 | .DS_Store
69 | .DS_Store?
70 | ._*
71 | .Spotlight-V100
72 | .Trashes
73 | ehthumbs.db
74 | Thumbs.db
75 | jobs.groovy
76 | 
77 | # Vagrant dev items
78 | Vagrantfile
79 | .vagrant/
80 | 


--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | #
 3 | # Run a subset of Flocker tests on Travis-CI.
 4 | sudo: false
 5 | 
 6 | dist: trusty
 7 | 
 8 | language: python
 9 | 
10 | python: 2.7
11 | 
12 | cache:
13 |   pip: true
14 |   apt: true
15 | 
16 | install:
17 |   - pip install tox awscli
18 | 
19 | env:
20 |   - FLOCKER_BUILDER=test-admin
21 |   - FLOCKER_BUILDER=test-benchmark
22 |   - FLOCKER_BUILDER=test-flocker
23 |   - FLOCKER_BUILDER=lint
24 |   - FLOCKER_BUILDER=docs-lint
25 |   - FLOCKER_BUILDER=docs-spelling
26 |   - FLOCKER_BUILDER=docs-linkcheck
27 |   - FLOCKER_BUILDER=docs-html
28 | 
29 | matrix:
30 |   allow_failures:
31 |   - env: FLOCKER_BUILDER=docs-linkcheck
32 | 
33 | script:
34 |   - .travis/script
35 | 
36 | after_script:
37 |   - .travis/after_script
38 | 
39 | addons:
40 |   apt:
41 |     packages:
42 |     - python-enchant
43 | 
44 | # Only run tests on push on a few branches.
45 | # Test on PR should be execute for all branches and forks.
46 | branches:
47 |   only:
48 |   - master
49 |   - /^release\/flocker-.*$/
50 | 


--------------------------------------------------------------------------------
/.travis/script:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python2
 2 | #
 3 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 4 | 
 5 | """
 6 | Run a build step.
 7 | 
 8 | Travis calls this during the `script` phase of its build lifecycle.
 9 |  * https://docs.travis-ci.com/user/customizing-the-build
10 | 
11 | Set ``FLOCKER_BUILDER`` environment variable before calling this script.
12 | """
13 | 
14 | from os import environ
15 | from subprocess import call
16 | 
17 | 
18 | def tox(tox_env):
19 |     return call([
20 |         "tox",
21 |         # XXX This is a hack to work around broken code and tests that rely on
22 |         # dictionary keys and sets having a consistent order, which they don't.
23 |         # See FLOC-4554.
24 |         "--hashseed", "noset",
25 |         "-e", tox_env
26 |     ])
27 | 
28 | 
29 | BUILDERS = {
30 |     "test-admin": tox,
31 |     "test-benchmark": tox,
32 |     "test-flocker": tox,
33 |     "lint": tox,
34 |     "docs-lint": tox,
35 |     "docs-spelling": tox,
36 |     "docs-linkcheck": tox,
37 |     "docs-html": tox,
38 | }
39 | 
40 | 
41 | def main():
42 |     builder_name = environ["FLOCKER_BUILDER"]
43 |     builder = BUILDERS[builder_name]
44 |     return builder(builder_name)
45 | 
46 | if __name__ == "__main__":
47 |     raise SystemExit(main())
48 | 


--------------------------------------------------------------------------------
/AUTHORS.rst:
--------------------------------------------------------------------------------
 1 | Flocker is maintained by ClusterHQ and is licensed under the Apache Software License 2.0.
 2 | 
 3 | The following people and organizations contributed to its development; please add your name in alphabetical order with your first pull request:
 4 | 
 5 | * ClusterHQ Inc. (formerly Hybrid Logic Ltd.)
 6 | * Scotch Media (Base for documentation theme)
 7 | * Wentao Zhang (zhangwentao234@huaewi.com, Huawei Ltd.)
 8 | * Sean McGinnis (Dell SC Series storage configuration documentation)
 9 | * Huai Cheng Zheng <huaicheng.zheng@transwarp.io>
10 | 


--------------------------------------------------------------------------------
/MANIFEST.in:
--------------------------------------------------------------------------------
 1 | include README.rst
 2 | include versioneer.py
 3 | include flocker/_version.py
 4 | graft requirements
 5 | include dev-requirements.txt
 6 | recursive-include admin *.py
 7 | 
 8 | # These data files are used by the volumes API to define input and output
 9 | # schemas.
10 | recursive-include flocker/control/schema *.yml
11 | 
12 | # JSON files used by persistence service tests.
13 | recursive-include flocker/control/test/configurations *.json
14 | 


--------------------------------------------------------------------------------
/admin/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """
4 | Admin scripts and modules which should not be shipped with Flocker.
5 | 
6 | Since :module:`admin.release` is imported from setup.py, we need to ensure that
7 | this only imports things from the stdlib.
8 | """
9 | 


--------------------------------------------------------------------------------
/admin/_preamble.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | """
 3 | Inserts flocker on to sys.path.
 4 | 
 5 | This module should only be imported by scripts living in :file:`admin`, as the
 6 | first thing they do.
 7 | 
 8 | :var FilePath TOPLEVEL: The top-level of the flocker repository.
 9 | :var FilePath BASEPATH: The executable being run.
10 | """
11 | 
12 | from twisted.python.filepath import FilePath
13 | import sys
14 | 
15 | path = BASEPATH = FilePath(sys.argv[0])
16 | for parent in path.parents():
17 |     if parent.descendant(['flocker', '__init__.py']).exists():
18 |         TOPLEVEL = parent
19 |         sys.path.insert(0, parent.path)
20 |         break
21 | else:
22 |     raise ImportError("Could not find top-level.")
23 | 
24 | __all__ = ['TOPLEVEL', 'BASEPATH']
25 | 


--------------------------------------------------------------------------------
/admin/add-cluster-nodes:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Provision new nodes and add them to an existing cluster
 5 | """
 6 | 
 7 | from _preamble import TOPLEVEL, BASEPATH
 8 | 
 9 | import sys
10 | 
11 | from twisted.internet.task import react
12 | 
13 | from admin.cluster_add_nodes import main
14 | 
15 | if __name__ == '__main__':
16 |     react(main, (sys.argv[1:], BASEPATH, TOPLEVEL))
17 | 


--------------------------------------------------------------------------------
/admin/ami-search-ubuntu:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Create and switch to a release branch.
 5 | """
 6 | 
 7 | from _preamble import TOPLEVEL, BASEPATH
 8 | 
 9 | import sys
10 | 
11 | if __name__ == '__main__':
12 |     from admin.ubuntu import ami_search_ubuntu_main as main
13 |     main(sys.argv[1:], top_level=TOPLEVEL, base_path=BASEPATH)
14 | 


--------------------------------------------------------------------------------
/admin/build-package:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Build operating system packages for Flocker.
 5 | 
 6 | This script calls ``build-package-entrypoint`` inside a docker image.
 7 | """
 8 | 
 9 | from _preamble import TOPLEVEL, BASEPATH
10 | 
11 | from admin.packaging import main
12 | 
13 | main(top_level=TOPLEVEL, base_path=BASEPATH)
14 | 


--------------------------------------------------------------------------------
/admin/build-package-entrypoint:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Build operating system packages for Flocker.
 5 | 
 6 | This script is for use as an entry point inside a docker image.
 7 | """
 8 | 
 9 | from _preamble import TOPLEVEL, BASEPATH
10 | 
11 | from admin.packaging import docker_main
12 | 
13 | docker_main(top_level=TOPLEVEL, base_path=BASEPATH)
14 | 


--------------------------------------------------------------------------------
/admin/build_targets/centos-7/Dockerfile:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc. See LICENSE file for details.
 2 | #
 3 | # A Docker image for building RPMs in a clean CentOS 7 build environment.
 4 | #
 5 | 
 6 | FROM clusterhqci/fpm-centos-7
 7 | MAINTAINER ClusterHQ <contact@clusterhq.com>
 8 | COPY requirements/*.txt /requirements/
 9 | RUN ["pip", "install", "--upgrade", "pip==8.1.2", "setuptools==23.0.0"]
10 | RUN ["pip", "install",\
11 |      "--requirement", "/requirements/all.txt",\
12 |      "--constraint", "/requirements/constraints.txt"]
13 | VOLUME /flocker
14 | WORKDIR /
15 | ENTRYPOINT ["/flocker/admin/build-package-entrypoint", "--destination-path=/output"]
16 | 


--------------------------------------------------------------------------------
/admin/build_targets/ubuntu-14.04/Dockerfile:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc. See LICENSE file for details.
 2 | #
 3 | # A Docker image for building packages in a clean Ubuntu 14.04 build
 4 | # environment.
 5 | #
 6 | 
 7 | FROM clusterhqci/fpm-ubuntu-trusty
 8 | MAINTAINER ClusterHQ <contact@clusterhq.com>
 9 | COPY requirements/*.txt /requirements/
10 | RUN echo UMASK 022 >> /etc/logins.defs
11 | RUN ["pip", "install", "--upgrade", "pip==8.1.2", "setuptools==23.0.0"]
12 | RUN ["pip", "install",\
13 |      "--requirement", "/requirements/all.txt",\
14 |      "--constraint", "/requirements/constraints.txt"]
15 | VOLUME /flocker
16 | ENTRYPOINT ["/flocker/admin/build-package-entrypoint", "--destination-path=/output"]
17 | 


--------------------------------------------------------------------------------
/admin/build_targets/ubuntu-16.04/Dockerfile:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc. See LICENSE file for details.
 2 | #
 3 | # A Docker image for building packages in a clean Ubuntu 16.04 build
 4 | # environment.
 5 | #
 6 | 
 7 | FROM clusterhqci/fpm-ubuntu-xenial
 8 | MAINTAINER ClusterHQ <contact@clusterhq.com>
 9 | COPY requirements/*.txt /requirements/
10 | RUN ["pip", "install", "--upgrade", "pip==8.1.2", "setuptools==23.0.0"]
11 | RUN ["pip", "install",\
12 |      "--requirement", "/requirements/all.txt",\
13 |      "--constraint", "/requirements/constraints.txt"]
14 | VOLUME /flocker
15 | ENTRYPOINT ["/flocker/admin/build-package-entrypoint", "--destination-path=/output"]
16 | 


--------------------------------------------------------------------------------
/admin/cleanup_cloud_resources:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Cleanup unused cloud resources
 5 | """
 6 | 
 7 | from _preamble import TOPLEVEL, BASEPATH
 8 | 
 9 | import sys
10 | 
11 | if __name__ == '__main__':
12 |     from admin.cleanup import cleanup_cloud_resources_main as main
13 |     main(sys.argv[1:], BASEPATH, TOPLEVEL)
14 | 


--------------------------------------------------------------------------------
/admin/create-cloudformation-template:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Create a CloudFormation template for Flocker installation on AWS.
 5 | """
 6 | 
 7 | from _preamble import TOPLEVEL, BASEPATH
 8 | 
 9 | import sys
10 | 
11 | if __name__ == '__main__':
12 |     from admin.installer import create_cloudformation_template_main
13 |     raise SystemExit(
14 |           create_cloudformation_template_main(
15 |                 argv=sys.argv[1:],
16 |                 basepath=BASEPATH,
17 |                 toplevel=TOPLEVEL
18 |           )
19 |     )
20 | 


--------------------------------------------------------------------------------
/admin/create-release-branch:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Create and switch to a release branch.
 5 | """
 6 | 
 7 | from _preamble import TOPLEVEL, BASEPATH
 8 | 
 9 | import sys
10 | 
11 | if __name__ == '__main__':
12 |     from admin.release import create_release_branch_main as main
13 |     main(sys.argv[1:], top_level=TOPLEVEL, base_path=BASEPATH)
14 | 


--------------------------------------------------------------------------------
/admin/filter-eliot:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Filter Eliot messages out of Twisted test.log files.
 5 | """
 6 | 
 7 | from _preamble import TOPLEVEL, BASEPATH
 8 | 
 9 | import sys
10 | 
11 | if __name__ == '__main__':
12 |     from admin.eliotlogging import filter_eliot_main as main
13 |     main(sys.argv[1:], top_level=TOPLEVEL, base_path=BASEPATH)
14 | 


--------------------------------------------------------------------------------
/admin/find-flaky-tests:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Find and report on tests marked as flaky.
 5 | """
 6 | 
 7 | from _preamble import TOPLEVEL, BASEPATH
 8 | 
 9 | import sys
10 | 
11 | if __name__ == '__main__':
12 |     from admin.flaky import find_flaky_tests_main as main
13 |     main(sys.argv[1:], top_level=TOPLEVEL, base_path=BASEPATH)
14 | 


--------------------------------------------------------------------------------
/admin/functional/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/admin/functional/__init__.py


--------------------------------------------------------------------------------
/admin/initialize-release:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Clone the Flocker repo in to a new path and initialize a release branch.
 5 | """
 6 | 
 7 | from _preamble import TOPLEVEL, BASEPATH
 8 | 
 9 | import sys
10 | 
11 | if __name__ == '__main__':
12 |     from admin.release import initialize_release_main as main
13 |     main(sys.argv[1:], top_level=TOPLEVEL, base_path=BASEPATH)
14 | 


--------------------------------------------------------------------------------
/admin/installer/__init__.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Helper utilities for the CloudFormation installer.
 5 | """
 6 | 
 7 | from ._images import publish_installer_images_main
 8 | from .cloudformation import create_cloudformation_template_main
 9 | 
10 | __all__ = [
11 |     "publish_installer_images_main",
12 |     'create_cloudformation_template_main'
13 | ]
14 | 


--------------------------------------------------------------------------------
/admin/installer/common.sh:
--------------------------------------------------------------------------------
 1 | #!/bin/bash
 2 | #
 3 | # Shared helper functions.
 4 | #
 5 | set -ex
 6 | 
 7 | # Retry a command line until it succeeds.
 8 | # With a delay between attempts and a limited number of attempts.
 9 | 
10 | RETRY_COMMAND_SLEEP_INTERVAL=5
11 | RETRY_COMMAND_RETRY_LIMIT=10
12 | 
13 | function retry_command () {
14 |     local count=0
15 |     local last_return_code=1
16 |     echo "RETRY_COMMAND_SLEEP_INTERVAL=${RETRY_COMMAND_SLEEP_INTERVAL}" >&2
17 |     echo "RETRY_COMMAND_RETRY_LIMIT=${RETRY_COMMAND_RETRY_LIMIT}" >&2
18 | 
19 |     while true; do
20 |         count=$((count+1))
21 |         if "${@}"; then
22 |             return 0
23 |         else
24 |             last_return_code=$?
25 |         fi
26 |         echo "RETRY_COMMAND: command '${@}' failed with exit_code '${last_return_code}'" >&2
27 |         echo "RETRY_COMMAND: failure_count: ${count}" >&2
28 |         if [[ "${count}" -eq "${RETRY_COMMAND_RETRY_LIMIT}" ]]; then
29 |             break
30 |         fi
31 |         echo "RETRY_COMMAND: sleeping for ${RETRY_COMMAND_SLEEP_INTERVAL}s" >&2
32 |         sleep "${RETRY_COMMAND_SLEEP_INTERVAL}"
33 |     done
34 |     echo "RETRY_COMMAND: stopping after '${count}' failed attempts" >&2
35 |     return ${last_return_code}
36 | }
37 | 


--------------------------------------------------------------------------------
/admin/installer/packer/provision_ubuntu-16.04_flocker.sh:
--------------------------------------------------------------------------------
 1 | #!/bin/bash
 2 | set -ex
 3 | 
 4 | UBUNTU_VERSION="$(lsb_release --release --short)"
 5 | 
 6 | # Install Flocker
 7 | apt-get install -qq -y apt-transport-https software-properties-common
 8 | 
 9 | if test -z "${FLOCKER_VERSION}"; then
10 |     add-apt-repository -y "deb https://clusterhq-archive.s3.amazonaws.com/ubuntu/${UBUNTU_VERSION}/\$(ARCH) /"
11 | else
12 |     add-apt-repository -y "deb http://build.clusterhq.com/results/omnibus/${FLOCKER_VERSION}/ubuntu-${UBUNTU_VERSION} /"
13 | fi
14 | apt-get update -qq -y
15 | apt-get install -qq -y --force-yes clusterhq-flocker-node clusterhq-flocker-docker-plugin
16 | 


--------------------------------------------------------------------------------
/admin/installer/packer/template_ubuntu-16.04_docker.json:
--------------------------------------------------------------------------------
 1 | {
 2 |     "variables": {
 3 |         "DOCKER_VERSION": "{{env `DOCKER_VERSION`}}",
 4 |         "SWARM_VERSION": "{{env `SWARM_VERSION`}}"
 5 |     },
 6 |     "builders": [{
 7 |         "type": "amazon-ebs",
 8 |         "region": "",
 9 |         "source_ami": "",
10 |         "instance_type": "m3.medium",
11 |         "ssh_username": "ubuntu",
12 |         "ami_name": "clusterhq_ubuntu-16.04_docker_{{timestamp}}",
13 |         "ami_groups": ["all"],
14 |         "ami_regions": [],
15 |         "tags": {
16 |             "DOCKER_VERSION": "{{user `DOCKER_VERSION`}}",
17 |             "SWARM_VERSION": "{{user `SWARM_VERSION`}}"
18 |         }
19 |     }],
20 |     "provisioners": [
21 |         {
22 |             "type": "shell",
23 |             "script": "{{template_dir}}/provision_ubuntu-16.04_docker.sh",
24 |             "environment_vars": [
25 |                 "DOCKER_VERSION={{user `DOCKER_VERSION`}}",
26 |                 "SWARM_VERSION={{user `SWARM_VERSION`}}"
27 |             ],
28 |             "execute_command": "{{ .Vars }} sudo -E -S sh '{{ .Path }}'"
29 |         }
30 |     ]
31 | }
32 | 


--------------------------------------------------------------------------------
/admin/installer/packer/template_ubuntu-16.04_flocker.json:
--------------------------------------------------------------------------------
 1 | {
 2 |     "variables": {
 3 |         "FLOCKER_VERSION": "{{env `FLOCKER_VERSION`}}"
 4 |     },
 5 |     "builders": [{
 6 |         "type": "amazon-ebs",
 7 |         "region": "",
 8 |         "source_ami": "",
 9 |         "instance_type": "m3.medium",
10 |         "ssh_username": "ubuntu",
11 |         "ami_name": "clusterhq_ubuntu-16.04_flocker_{{timestamp}}",
12 |         "ami_groups": ["all"],
13 |         "ami_regions": [],
14 |         "tags": {
15 |             "FLOCKER_VERSION": "{{user `FLOCKER_VERSION`}}"
16 |         }
17 |     }],
18 |     "provisioners": [
19 |         {
20 |             "type": "shell",
21 |             "script": "{{template_dir}}/provision_ubuntu-16.04_flocker.sh",
22 |             "environment_vars": [
23 |                 "FLOCKER_VERSION={{user `FLOCKER_VERSION`}}"
24 |             ],
25 |             "execute_command": "{{ .Vars }} sudo -E -S sh '{{ .Path }}'"
26 |         }
27 |     ]
28 | }
29 | 


--------------------------------------------------------------------------------
/admin/installer/setup_s3.sh:
--------------------------------------------------------------------------------
 1 | #!/bin/bash
 2 | # Install and configure S3 with a minimal configuration file.
 3 | #
 4 | set -ex
 5 | 
 6 | : ${access_key_id:?}
 7 | : ${secret_access_key:?}
 8 | 
 9 | cat <<EOF > /root/.s3cfg
10 | [default]
11 | access_key = ${access_key_id}
12 | secret_key = ${secret_access_key}
13 | EOF
14 | 
15 | retry_command apt-get --yes install s3cmd
16 | 
17 | # Wrapper around S3 command to allow retry until
18 | # bucket of interest is available and populated.
19 | s3cmd_wrapper () {
20 |     retry_command /usr/bin/s3cmd --force $@
21 | }
22 | 


--------------------------------------------------------------------------------
/admin/installer/setup_swarm_manager.sh:
--------------------------------------------------------------------------------
 1 | #!/bin/bash
 2 | # Pull image for Docker Swarm and start Swarm Manager with TLS.
 3 | 
 4 | set -ex
 5 | 
 6 | : ${s3_bucket:?}
 7 | 
 8 | # Default directory where Docker (started as root) looks for certificates.
 9 | DOCKER_CERT_HOME='/root/.docker'
10 | 
11 | # Create Swarm cluster, and publish Swarm cluster ID to S3 bucket.
12 | rm -rf /tmp/swarm-config
13 | mkdir -p /tmp/swarm-config
14 | docker pull swarm:1.2.5
15 | docker run --rm -v ${DOCKER_CERT_HOME}:${DOCKER_CERT_HOME} swarm:1.2.5 create > /tmp/swarm-config/swarm_cluster_id
16 | /usr/bin/s3cmd put --config=/root/.s3cfg --recursive /tmp/swarm-config/ s3://${s3_bucket}/swarm-config/
17 | 
18 | # Start Swarm Manager.
19 | swarm_cluster_id=$(cat /tmp/swarm-config/swarm_cluster_id)
20 | docker run -d -v ${DOCKER_CERT_HOME}:${DOCKER_CERT_HOME} -p 2376:2375 swarm:1.2.5 manage --tlsverify --tlscacert=${DOCKER_CERT_HOME}/ca.pem --tlskey=${DOCKER_CERT_HOME}/key.pem --tlscert=${DOCKER_CERT_HOME}/cert.pem token://$swarm_cluster_id
21 | 


--------------------------------------------------------------------------------
/admin/installer/setup_swarm_node.sh:
--------------------------------------------------------------------------------
 1 | #!/bin/bash
 2 | # Create and join a Swarm node to a Swarm cluster identified by cluster id in S3 bucket.
 3 | set -ex
 4 | 
 5 | : ${s3_bucket:?}
 6 | 
 7 | DOCKER_CERT_HOME='/root/.docker'
 8 | 
 9 | # Gather Swarm cluster id from S3 bucket.
10 | swarm_cluster_id=$(s3cmd_wrapper get --config=/root/.s3cfg s3://${s3_bucket}/swarm-config/swarm_cluster_id -)
11 | 
12 | # Start the Swarm node.
13 | docker pull swarm:1.2.5
14 | docker run -d -v ${DOCKER_CERT_HOME}:${DOCKER_CERT_HOME} swarm:1.2.5 join --addr=$(/usr/bin/ec2metadata --public-ipv4):2375 token://$swarm_cluster_id
15 | 


--------------------------------------------------------------------------------
/admin/installer/setup_volumehub.sh:
--------------------------------------------------------------------------------
 1 | #!/bin/bash
 2 | # Set up Volume Hub if a token has been supplied.
 3 | set -ex
 4 | 
 5 | : ${flocker_node_type:?}
 6 | 
 7 | if test -n "${volumehub_token}"; then
 8 |     export TOKEN="${volumehub_token}"
 9 | 
10 |     if test "${flocker_node_type}" == "control"; then
11 |         export TARGET="control-service"
12 |         curl -ssL https://get-volumehub.clusterhq.com/ |sh
13 |     fi
14 | 
15 |     if test "${flocker_node_type}" == "agent"; then
16 |         : ${flocker_agent_number:?}
17 |         export TARGET="agent-node"
18 |         if test "${flocker_agent_number}" -eq "1"; then
19 |             export RUN_FLOCKER_AGENT_HERE="1"
20 |         fi
21 |         curl -ssL https://get-volumehub.clusterhq.com/ |sh
22 |     fi
23 | fi
24 | 


--------------------------------------------------------------------------------
/admin/installer/signal_config_completion.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # Signal CloudFormation that user data setup is done.
3 | 
4 | set -ex
5 | 
6 | curl -v -X PUT -H 'Content-Type:' \
7 |     -d '{"Status" : "SUCCESS","Reason" : "Configuration OK","UniqueId" : "FlockerSwarm","Data" : "Flocker and Swarm configured."}' \
8 |     "${wait_condition_handle}"
9 | 


--------------------------------------------------------------------------------
/admin/merge-pr:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Merge a Pull Request when the tests pass.
 5 | """
 6 | 
 7 | import _preamble
 8 | 
 9 | import sys
10 | 
11 | # We don't use the module, we need the sys.path
12 | # mangling it provides though.
13 | del _preamble
14 | 
15 | 
16 | if __name__ == '__main__':
17 |     from admin.merge_pr import main
18 |     sys.exit(main(sys.argv[1:]))
19 | 


--------------------------------------------------------------------------------
/admin/package-files/after-install.sh:
--------------------------------------------------------------------------------
1 | # https://git.fedorahosted.org/cgit/firewalld.git/tree/config/macros.firewalld
2 | test -f /usr/bin/firewall-cmd && firewall-cmd --reload --quiet || :
3 | which systemctl && systemctl reload-or-restart rsyslog.service || :
4 | 


--------------------------------------------------------------------------------
/admin/package-files/docker-plugin/systemd/flocker-docker-plugin.service:
--------------------------------------------------------------------------------
 1 | [Unit]
 2 | Description=Flocker Docker Plugin
 3 | Before=docker.service
 4 | 
 5 | [Service]
 6 | ExecStart=/usr/sbin/flocker-docker-plugin --journald
 7 | Restart=always
 8 | 
 9 | [Install]
10 | WantedBy=multi-user.target
11 | 


--------------------------------------------------------------------------------
/admin/package-files/docker-plugin/upstart/flocker-docker-plugin.conf:
--------------------------------------------------------------------------------
 1 | # flocker-docker-plugin - flocker-docker-plugin job file
 2 | 
 3 | description "Flocker Docker Plugin"
 4 | author "ClusterHQ <support@clusterhq.com>"
 5 | 
 6 | start on starting docker
 7 | stop on stopped docker
 8 | respawn
 9 | 
10 | # Start the process
11 | exec /usr/sbin/flocker-docker-plugin --logfile=/var/log/flocker/flocker-docker-plugin.log
12 | 


--------------------------------------------------------------------------------
/admin/package-files/firewalld-services/flocker-control-agent.xml:
--------------------------------------------------------------------------------
1 | <?xml version="1.0" encoding="utf-8"?>
2 | <service>
3 |   <short>Flocker Control Service Agent Port</short>
4 |   <description>The Flocker control service manages the state of a flocker cluster.</description>
5 |   <port protocol="tcp" port="4524"/>
6 | </service>
7 | 


--------------------------------------------------------------------------------
/admin/package-files/firewalld-services/flocker-control-api.xml:
--------------------------------------------------------------------------------
1 | <?xml version="1.0" encoding="utf-8"?>
2 | <service>
3 |   <short>Flocker Control Service REST API</short>
4 |   <description>The Flocker control service manages the state of a flocker cluster.</description>
5 |   <port protocol="tcp" port="4523"/>
6 | </service>
7 | 


--------------------------------------------------------------------------------
/admin/package-files/rsyslog/flocker.conf:
--------------------------------------------------------------------------------
1 | # Flocker logs will end up in journald and can be accessed via journalctl. There
2 | # is therefore no need to duplicate them in /var/log/messages; instead they
3 | # should be discarded by rsyslog.
4 | if $programname == 'flocker-control' then ~
5 | if $programname == 'flocker-dataset-agent' then ~
6 | if $programname == 'flocker-container-agent' then ~
7 | 


--------------------------------------------------------------------------------
/admin/package-files/systemd/flocker-container-agent.service:
--------------------------------------------------------------------------------
 1 | [Unit]
 2 | Description=Flocker Container Agent
 3 | After=docker.service
 4 | Wants=docker.service
 5 | 
 6 | [Service]
 7 | ExecStart=/usr/sbin/flocker-container-agent --journald
 8 | Restart=always
 9 | 
10 | [Install]
11 | WantedBy=multi-user.target
12 | 


--------------------------------------------------------------------------------
/admin/package-files/systemd/flocker-control.service:
--------------------------------------------------------------------------------
 1 | [Unit]
 2 | Description=Flocker Control Service
 3 | 
 4 | [Service]
 5 | ExecStart=/usr/sbin/flocker-control --port tcp:4523 --agent-port tcp:4524 --journald
 6 | Restart=always
 7 | 
 8 | PrivateTmp=true
 9 | PrivateDev=true
10 | ProtectSystem=true
11 | ProtectHome=true
12 | ReadonlyDirectories=/
13 | ReadWriteDirectories=/var/lib/flocker
14 | 
15 | [Install]
16 | WantedBy=multi-user.target
17 | 


--------------------------------------------------------------------------------
/admin/package-files/systemd/flocker-dataset-agent.service:
--------------------------------------------------------------------------------
 1 | [Unit]
 2 | Description=Flocker Dataset Agent
 3 | 
 4 | [Service]
 5 | ExecStart=/usr/sbin/flocker-dataset-agent --journald
 6 | Restart=always
 7 | 
 8 | # We can't have a private mount namespace, since we need to create mounts visible to Docker.
 9 | 
10 | [Install]
11 | WantedBy=multi-user.target
12 | 


--------------------------------------------------------------------------------
/admin/package-files/ufw-applications.d/flocker-control-agent:
--------------------------------------------------------------------------------
1 | [flocker-control-agent]
2 | title=Flocker Control Service Agent Port
3 | description=The Flocker control service manages the state of a flocker cluster.
4 | ports=4524/tcp
5 | 


--------------------------------------------------------------------------------
/admin/package-files/ufw-applications.d/flocker-control-api:
--------------------------------------------------------------------------------
1 | [flocker-control-api]
2 | title=Flocker Control Service REST API
3 | description=The Flocker control service manages the state of a flocker cluster.
4 | ports=4523/tcp
5 | 


--------------------------------------------------------------------------------
/admin/package-files/upstart/flocker-container-agent.conf:
--------------------------------------------------------------------------------
 1 | # flocker-container-agent - flocker-container-agent job file
 2 | 
 3 | description "Flocker Container Agent service"
 4 | author "ClusterHQ <support@clusterhq.com>"
 5 | 
 6 | start on runlevel [2345]
 7 | stop on runlevel [016]
 8 | 
 9 | respawn
10 | 
11 | pre-start script
12 |         if [ ! -r /etc/flocker/agent.yml ]; then
13 |                 echo "Cannot read configuration file '/etc/flocker/agent.yml'."
14 |                 exit 1
15 |         fi
16 |         while [ ! -S /var/run/docker.sock ];
17 |         do
18 |                 echo "Cannot find Docker daemon (required)."
19 |                 sleep 5
20 |         done
21 | end script
22 | 
23 | script
24 |         exec /usr/sbin/flocker-container-agent --logfile=/var/log/flocker/flocker-container-agent.log
25 | end script
26 | 


--------------------------------------------------------------------------------
/admin/package-files/upstart/flocker-control.conf:
--------------------------------------------------------------------------------
 1 | # flocker-control - flocker-control job file
 2 | 
 3 | description "Flocker Control service"
 4 | author "ClusterHQ <support@clusterhq.com>"
 5 | 
 6 | # Port Numbers
 7 | env api_port=4523
 8 | env agent_port=4524
 9 | 
10 | respawn
11 | 
12 | # Start the process
13 | exec /usr/sbin/flocker-control --port tcp:$api_port --agent-port tcp:$agent_port --logfile=/var/log/flocker/flocker-control.log
14 | 


--------------------------------------------------------------------------------
/admin/package-files/upstart/flocker-dataset-agent.conf:
--------------------------------------------------------------------------------
 1 | # flocker-dataset-agent - flocker-dataset-agent job file
 2 | 
 3 | description "Flocker Agent service"
 4 | author "ClusterHQ <support@clusterhq.com>"
 5 | 
 6 | start on runlevel [2345]
 7 | stop on runlevel [016]
 8 | 
 9 | respawn
10 | 
11 | pre-start script
12 |         if [ ! -r /etc/flocker/agent.yml ]; then
13 |                 echo "Cannot read configuration file '/etc/flocker/agent.yml'."
14 |                 exit 1
15 |         fi
16 | end script
17 | 
18 | script
19 |         exec /usr/sbin/flocker-dataset-agent --logfile=/var/log/flocker/flocker-dataset-agent.log
20 | end script
21 | 


--------------------------------------------------------------------------------
/admin/publish-artifacts:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Publish release artifacts.
 5 | """
 6 | 
 7 | from _preamble import TOPLEVEL, BASEPATH
 8 | 
 9 | import logging
10 | import sys
11 | 
12 | # Log information about network connections
13 | logging.basicConfig()
14 | requests_log = logging.getLogger("requests.packages.urllib3")
15 | requests_log.setLevel(logging.DEBUG)
16 | requests_log.propagate = True
17 | 
18 | if __name__ == '__main__':
19 |     from admin.release import publish_artifacts_main as main
20 |     main(sys.argv[1:], top_level=TOPLEVEL, base_path=BASEPATH)
21 | 


--------------------------------------------------------------------------------
/admin/publish-docs:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Publish documentation to S3 and CloudFront.
 5 | """
 6 | 
 7 | from _preamble import TOPLEVEL, BASEPATH
 8 | 
 9 | import sys
10 | 
11 | if __name__ == '__main__':
12 |     from admin.release import publish_docs_main as main
13 |     main(sys.argv[1:], top_level=TOPLEVEL, base_path=BASEPATH)
14 | 


--------------------------------------------------------------------------------
/admin/publish-installer-images:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Publish Installer images.
 5 | """
 6 | 
 7 | from _preamble import TOPLEVEL, BASEPATH
 8 | 
 9 | import sys
10 | 
11 | if __name__ == '__main__':
12 |     from twisted.internet.task import react
13 |     from admin.installer import publish_installer_images_main as main
14 |     react(main, (sys.argv[1:], BASEPATH, TOPLEVEL))
15 | 


--------------------------------------------------------------------------------
/admin/release-packaging/README.rst:
--------------------------------------------------------------------------------
1 | Packages which point to repositories where Flocker packages are stored.
2 | 
3 | See the `documentation <../../docs/gettinginvolved/infrastructure/packaging.rst>`_ for details.
4 | 


--------------------------------------------------------------------------------
/admin/release-packaging/centos/clusterhq.repo:
--------------------------------------------------------------------------------
 1 | [clusterhq]
 2 | name=ClusterHQ for CentOS $releasever
 3 | baseurl=https://s3.amazonaws.com/clusterhq-archive/centos/$releasever/$basearch/
 4 | enabled=1
 5 | gpgcheck=0
 6 | 
 7 | [clusterhq-testing]
 8 | name=ClusterHQ development for CentOS $releasever
 9 | baseurl=https://s3.amazonaws.com/clusterhq-archive/centos-testing/$releasever/$basearch/
10 | enabled=0
11 | gpgcheck=0
12 | 


--------------------------------------------------------------------------------
/admin/release-packaging/rhel/clusterhq-release.spec:
--------------------------------------------------------------------------------
 1 | # See README for instructions on how to build.
 2 | Name:           clusterhq-release
 3 | Version:        1
 4 | Release:        1%{?dist}
 5 | Summary:        ClusterHQ Repository Configuration
 6 | 
 7 | License:        ASL 2.0
 8 | URL:            https://clusterhq.com/
 9 | Source0:        clusterhq.repo
10 | 
11 | BuildArch:      noarch
12 | 
13 | %description
14 | ClusterHQ repository for RHEL
15 | 
16 | %install
17 | cd %{_sourcedir}
18 | install -d -m 755 $RPM_BUILD_ROOT/etc/yum.repos.d
19 | install -m 644 clusterhq.repo $RPM_BUILD_ROOT/etc/yum.repos.d
20 | 
21 | %files
22 | %config(noreplace) /etc/yum.repos.d/clusterhq.repo
23 | 
24 | 
25 | %changelog
26 | * Thu Dec 16 2016 Richard Wall <richard.wall@clusterhq.com> 1-1.el7
27 | - Initial Package
28 | 


--------------------------------------------------------------------------------
/admin/release-packaging/rhel/clusterhq.repo:
--------------------------------------------------------------------------------
 1 | [clusterhq]
 2 | name=ClusterHQ for RHEL $releasever
 3 | baseurl=https://s3.amazonaws.com/clusterhq-archive/centos/7/$basearch/
 4 | enabled=1
 5 | gpgcheck=0
 6 | 
 7 | [clusterhq-testing]
 8 | name=ClusterHQ development for RHEL $releasever
 9 | baseurl=https://s3.amazonaws.com/clusterhq-archive/centos-testing/7/$basearch/
10 | enabled=0
11 | gpgcheck=0
12 | 


--------------------------------------------------------------------------------
/admin/requirements.Dockerfile:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc. See LICENSE file for details.
 2 | #
 3 | # A Docker image for updating Flocker pinned requirements.
 4 | #
 5 | # This Dockerfile will be built by a script which will have constructed a
 6 | # temporary directory containing a copy of Flocker/requirements and the
 7 | # entrypoint script.
 8 | 
 9 | FROM alpine:latest
10 | MAINTAINER ClusterHQ <contact@clusterhq.com>
11 | RUN apk add --update alpine-sdk py-pip git python-dev openssl-dev linux-headers libffi-dev enchant-dev
12 | COPY entrypoint /entrypoint
13 | RUN ["chmod", "+x", "/entrypoint"]
14 | # Some packages for compiling CFFI and cryptography
15 | RUN ["/usr/bin/pip", "install", "--upgrade", "pip==8.1.2"]
16 | RUN ["/usr/bin/pip", "install", "wheel"]
17 | COPY requirements /requirements
18 | RUN ["/usr/bin/pip", "wheel",\
19 |      "--wheel-dir", "/wheelhouse",\
20 |      "--constraint", "/requirements/constraints.txt",\
21 |      "--requirement", "/requirements/all.txt.latest"]
22 | ENTRYPOINT ["/entrypoint"]
23 | 


--------------------------------------------------------------------------------
/admin/run-acceptance-tests:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Run the cluster acceptance tests.
 5 | """
 6 | 
 7 | from _preamble import TOPLEVEL, BASEPATH
 8 | 
 9 | import sys
10 | 
11 | if __name__ == '__main__':
12 |     from twisted.internet.task import react
13 |     from admin.acceptance import main
14 |     react(main, (sys.argv[1:], BASEPATH, TOPLEVEL))
15 | 


--------------------------------------------------------------------------------
/admin/run-client-tests:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Run the client acceptance tests.
 5 | """
 6 | 
 7 | from _preamble import TOPLEVEL, BASEPATH
 8 | 
 9 | import sys
10 | 
11 | if __name__ == '__main__':
12 |     from admin.client import main
13 |     main(sys.argv[1:], BASEPATH, TOPLEVEL)
14 | 


--------------------------------------------------------------------------------
/admin/setup-cluster:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright 2015 ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Set up a cluster.
 5 | """
 6 | 
 7 | from _preamble import TOPLEVEL, BASEPATH
 8 | 
 9 | import sys
10 | 
11 | if __name__ == '__main__':
12 |     from twisted.internet.task import react
13 |     from admin.cluster_setup import main
14 |     react(main, (sys.argv[1:], BASEPATH, TOPLEVEL))
15 | 


--------------------------------------------------------------------------------
/admin/test/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/admin/test/__init__.py


--------------------------------------------------------------------------------
/admin/test/apt-repo/clusterhq-flocker-cli_0.3.3-0.dev.7_all.deb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/admin/test/apt-repo/clusterhq-flocker-cli_0.3.3-0.dev.7_all.deb


--------------------------------------------------------------------------------
/admin/test/apt-repo/clusterhq-flocker-docker-plugin_0.3.3-0.dev.7_all.deb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/admin/test/apt-repo/clusterhq-flocker-docker-plugin_0.3.3-0.dev.7_all.deb


--------------------------------------------------------------------------------
/admin/test/apt-repo/clusterhq-flocker-node_0.3.3-0.dev.7_all.deb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/admin/test/apt-repo/clusterhq-flocker-node_0.3.3-0.dev.7_all.deb


--------------------------------------------------------------------------------
/admin/test/installer/postgres/docker-compose-node1.yml:
--------------------------------------------------------------------------------
 1 | version: "2"
 2 | 
 3 | volumes:
 4 |   postgres:
 5 |     driver: "flocker"
 6 |     driver_opts:
 7 |       size: "10GiB"
 8 |       profile: "bronze"
 9 | 
10 | services:
11 |   postgres:
12 |     image: "postgres:9.5"
13 |     ports:
14 |        -  "5432:5432"
15 |     environment:
16 |        - "constraint:flocker-node==1"
17 |        - "POSTGRES_USER=flocker"
18 |        - "POSTGRES_PASSWORD=flocker"
19 |        - "PGDATA=/var/lib/postgresql/data"
20 |     network_mode: "bridge"
21 |     volumes:
22 |        - "postgres:/var/lib/postgresql/data"
23 | 


--------------------------------------------------------------------------------
/admin/test/installer/postgres/docker-compose-node2.yml:
--------------------------------------------------------------------------------
 1 | version: "2"
 2 | 
 3 | volumes:
 4 |   postgres:
 5 |     driver: "flocker"
 6 |     driver_opts:
 7 |       size: "10GiB"
 8 |       profile: "bronze"
 9 | 
10 | services:
11 |   postgres:
12 |     image: "postgres:9.5"
13 |     ports:
14 |        -  "5432:5432"
15 |     environment:
16 |        - "constraint:flocker-node==2"
17 |        - "POSTGRES_USER=flocker"
18 |        - "POSTGRES_PASSWORD=flocker"
19 |        - "PGDATA=/var/lib/postgresql/data"
20 |     network_mode: "bridge"
21 |     volumes:
22 |        - "postgres:/var/lib/postgresql/data"
23 | 


--------------------------------------------------------------------------------
/admin/test/packer_outputs/PACKER_OUTPUT_NONE:
--------------------------------------------------------------------------------
1 | 1450420216,,ui,say,Build 'amazon-ebs' finished.
2 | 


--------------------------------------------------------------------------------
/admin/test/packer_outputs/PACKER_OUTPUT_US_ALL:
--------------------------------------------------------------------------------
 1 | 1450420216,,ui,say,Build 'amazon-ebs' finished.
 2 | 1450420216,,ui,say,\n==> Builds finished. The artifacts of successful builds are:
 3 | 1450420216,amazon-ebs,artifact-count,1
 4 | 1450420216,amazon-ebs,artifact,0,builder-id,mitchellh.amazonebs
 5 | 1450420216,amazon-ebs,artifact,0,id,us-east-1:ami-dc4410b6%!(PACKER_COMMA)us-west-1:ami-e098f380%!(PACKER_COMMA)us-west-2:ami-8c8f90ed
 6 | 1450420216,amazon-ebs,artifact,0,string,AMIs were created:\n\nus-east-1: ami-dc4410b6\nus-west-1: ami-e098f380\nus-west-2: ami-8c8f90ed
 7 | 1450420216,amazon-ebs,artifact,0,files-count,0
 8 | 1450420216,amazon-ebs,artifact,0,end
 9 | 1450420216,,ui,say,--> amazon-ebs: AMIs were created:\n\nus-east-1: ami-dc4410b6\nus-west-1: ami-e098f380\nus-west-2: ami-8c8f90ed
10 | 


--------------------------------------------------------------------------------
/admin/test/packer_outputs/PACKER_OUTPUT_US_WEST_1:
--------------------------------------------------------------------------------
 1 | 1450420216,,ui,say,Build 'amazon-ebs' finished.
 2 | 1450420216,,ui,say,\n==> Builds finished. The artifacts of successful builds are:
 3 | 1450420216,amazon-ebs,artifact-count,1
 4 | 1450420216,amazon-ebs,artifact,0,builder-id,mitchellh.amazonebs
 5 | 1450420216,amazon-ebs,artifact,0,id,us-west-1:ami-e098f380
 6 | 1450420216,amazon-ebs,artifact,0,string,AMIs were created:\n\nus-west-1: ami-e098f380
 7 | 1450420216,amazon-ebs,artifact,0,files-count,0
 8 | 1450420216,amazon-ebs,artifact,0,end
 9 | 1450420216,,ui,say,--> amazon-ebs: AMIs were created:\n\nus-west-1: ami-e098f380
10 | 


--------------------------------------------------------------------------------
/admin/test/test_cluster_setup.py:
--------------------------------------------------------------------------------
 1 | from flocker.testtools import TestCase
 2 | 
 3 | from ..cluster_setup import RunOptions
 4 | 
 5 | 
 6 | class RunOptionsForTest(RunOptions):
 7 | 
 8 |     """
 9 |     Patch this so it's not run during the test, which
10 |     would result in quite a lot of logic related to
11 |     connecting to a cloud provider being run.
12 |     """
13 |     def postOptions(self):
14 |         pass
15 | 
16 | 
17 | class RunOptionsTest(TestCase):
18 | 
19 |     def test_purpose(self):
20 |         """
21 |         RunOptions are parsed correctly when a purpose is provided
22 |         """
23 |         arg_options = (
24 |             "--distribution", "ubuntu-14.04",
25 |             "--provider", "aws",
26 |             "--purpose", "test"
27 |         )
28 |         run_options = RunOptionsForTest(self.mktemp())
29 |         run_options.parseOptions(arg_options)
30 |         self.assertEquals(run_options['purpose'], 'test')
31 | 


--------------------------------------------------------------------------------
/admin/test/yum-repo/clusterhq-flocker-cli-0.3.3-0.dev.7.noarch.rpm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/admin/test/yum-repo/clusterhq-flocker-cli-0.3.3-0.dev.7.noarch.rpm


--------------------------------------------------------------------------------
/admin/test/yum-repo/clusterhq-flocker-docker-plugin-0.3.3-0.dev.7.noarch.rpm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/admin/test/yum-repo/clusterhq-flocker-docker-plugin-0.3.3-0.dev.7.noarch.rpm


--------------------------------------------------------------------------------
/admin/test/yum-repo/clusterhq-flocker-node-0.3.3-0.dev.7.noarch.rpm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/admin/test/yum-repo/clusterhq-flocker-node-0.3.3-0.dev.7.noarch.rpm


--------------------------------------------------------------------------------
/admin/update-license:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Update the Copyright years in the LICENSE file.
 5 | """
 6 | 
 7 | from _preamble import TOPLEVEL
 8 | 
 9 | import sys
10 | 
11 | if __name__ == '__main__':
12 |     from admin.release import update_license_file as main
13 |     main(sys.argv[1:], top_level=TOPLEVEL)
14 | 


--------------------------------------------------------------------------------
/admin/update-requirements:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Regenerate the requirements files.
 5 | """
 6 | 
 7 | from _preamble import TOPLEVEL, BASEPATH
 8 | 
 9 | import sys
10 | 
11 | if __name__ == '__main__':
12 |     from admin.requirements import update_requirements_main as main
13 |     main(sys.argv[1:], BASEPATH, TOPLEVEL)
14 | 


--------------------------------------------------------------------------------
/admin/update-requirements-entrypoint:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | 
 4 | """
 5 | This is the entrypoint for ``requirements.Dockerfile``.
 6 | The container must be run with a ``--volume`` argument binding a ``pip``
 7 | requirements file to the path ``/requirements.txt`` inside the container.
 8 | """
 9 | 
10 | import argparse
11 | import sys
12 | from subprocess import check_call
13 | 
14 | PIP = "/usr/bin/pip"
15 | 
16 | parser = argparse.ArgumentParser()
17 | args = parser.parse_args()
18 | 
19 | check_call(
20 |     [PIP, "install",
21 |      "--no-index",
22 |      "--find-links", "/wheelhouse",
23 |      "--requirement", "/requirements.txt",
24 |      "--constraint", "/requirements/constraints.txt"],
25 |     stdout=sys.stderr
26 | )
27 | 
28 | check_call(
29 |     [PIP, "freeze", "--requirement", "/requirements.txt"],
30 | )
31 | 


--------------------------------------------------------------------------------
/benchmark/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/benchmark/__init__.py


--------------------------------------------------------------------------------
/benchmark/_method.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | """
 3 | Functions for checking a method name provided by the user.
 4 | """
 5 | 
 6 | 
 7 | class InvalidMethod(Exception):
 8 |     """
 9 |     Method not meeting requested criteria.
10 |     """
11 | 
12 | 
13 | def validate_no_arg_method(interface, method_name):
14 |     """
15 |     Check that method name exists in interface and requires no parameters.
16 | 
17 |     :param zope.interface.Interface interface: Interface to validate against.
18 |     :param str method_name: Method name to validate.
19 |     :raise InvalidMethod: if name is not valid or requires parameters.
20 |     """
21 |     for name, method in interface.namesAndDescriptions():
22 |         if name == method_name:
23 |             if len(method.getSignatureInfo()['required']) > 0:
24 |                 raise InvalidMethod(
25 |                     'Method {!r} requires parameters'.format(method_name)
26 |                 )
27 |             return
28 |     raise InvalidMethod(
29 |         'Method {!r} not found in interface {}'.format(
30 |             method_name, interface.__name__)
31 |     )
32 | 


--------------------------------------------------------------------------------
/benchmark/benchmark:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | 
3 | exec python -m benchmark.script "$@"
4 | 


--------------------------------------------------------------------------------
/benchmark/cleanup-cluster:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Clean up all containers and datasets in a cluster.
 5 | """
 6 | import sys
 7 | 
 8 | from twisted.internet.task import react
 9 | 
10 | from benchmark.cluster_cleanup import main
11 | 
12 | if __name__ == '__main__':
13 |     react(main, [sys.argv[1:]])
14 | 


--------------------------------------------------------------------------------
/benchmark/metrics-parser:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Read JSON metrics files from the benchmarking tool and produce a CSV report.
 5 | """
 6 | import sys
 7 | 
 8 | from benchmark.metrics_parser import main
 9 | 
10 | if __name__ == '__main__':
11 |     main(sys.argv[1:])
12 | 


--------------------------------------------------------------------------------
/benchmark/metrics/__init__.py:
--------------------------------------------------------------------------------
1 | from .cputime import CPUTime
2 | from .wallclock import WallClock
3 | 
4 | __all__ = [
5 |     'CPUTime',
6 |     'WallClock',
7 | ]
8 | 


--------------------------------------------------------------------------------
/benchmark/metrics/test/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/benchmark/metrics/test/__init__.py


--------------------------------------------------------------------------------
/benchmark/metrics/test/test_wallclock.py:
--------------------------------------------------------------------------------
 1 | # Copyright 2015 ClusterHQ Inc.  See LICENSE file for details.
 2 | """
 3 | Wallclock metric tests for the control service benchmarks.
 4 | """
 5 | 
 6 | from twisted.internet.task import Clock
 7 | from twisted.internet.defer import maybeDeferred
 8 | 
 9 | from benchmark.metrics import WallClock
10 | from flocker.testtools import TestCase
11 | 
12 | 
13 | class WallClockTests(TestCase):
14 | 
15 |     def test_wallclock(self):
16 |         """
17 |         Returns the difference in time from before and after call to
18 |         function.
19 |         """
20 |         clock = Clock()
21 |         wallclock = WallClock(clock, None)
22 |         d = wallclock.measure(maybeDeferred, clock.advance, 1.23)
23 |         self.assertEqual(self.successResultOf(d), 1.23)
24 | 


--------------------------------------------------------------------------------
/benchmark/metrics/wallclock.py:
--------------------------------------------------------------------------------
 1 | # Copyright 2015 ClusterHQ Inc.  See LICENSE file for details.
 2 | """
 3 | Wallclock time metric for the control service benchmarks.
 4 | """
 5 | 
 6 | from zope.interface import implementer
 7 | 
 8 | from .._interfaces import IMetric
 9 | 
10 | 
11 | @implementer(IMetric)
12 | class WallClock(object):
13 |     """
14 |     Measure the elapsed wallclock time during an operation.
15 |     """
16 | 
17 |     def __init__(self, reactor, cluster):
18 |         self.reactor = reactor
19 | 
20 |     def measure(self, f, *a, **kw):
21 |         def finished(ignored):
22 |             end = self.reactor.seconds()
23 |             elapsed = end - start
24 |             return elapsed
25 | 
26 |         start = self.reactor.seconds()
27 |         d = f(*a, **kw)
28 |         d.addCallback(finished)
29 |         return d
30 | 


--------------------------------------------------------------------------------
/benchmark/operations/__init__.py:
--------------------------------------------------------------------------------
 1 | from .create_container import CreateContainer
 2 | from .create_dataset import CreateDataset
 3 | from .no_op import NoOperation
 4 | from .read_request import ReadRequest
 5 | from .wait import Wait
 6 | 
 7 | __all__ = [
 8 |     'CreateContainer',
 9 |     'CreateDataset',
10 |     'NoOperation',
11 |     'ReadRequest',
12 |     'Wait',
13 | ]
14 | 


--------------------------------------------------------------------------------
/benchmark/operations/_common.py:
--------------------------------------------------------------------------------
 1 | import random
 2 | 
 3 | 
 4 | class EmptyClusterError(Exception):
 5 |     """
 6 |     Exception indicating that the cluster contains no nodes.
 7 |     """
 8 | 
 9 | 
10 | def select_node(nodes):
11 |     """
12 |     Select a node from a list of nodes.
13 | 
14 |     :param Sequence[Node] nodes: Sequence of nodes.
15 |     :return Node: Selected node.
16 |     """
17 |     if nodes:
18 |         return random.choice(nodes)
19 |     else:
20 |         raise EmptyClusterError("Cluster contains no nodes.")
21 | 


--------------------------------------------------------------------------------
/benchmark/operations/no_op.py:
--------------------------------------------------------------------------------
 1 | from zope.interface import implementer
 2 | 
 3 | from twisted.internet.defer import succeed
 4 | 
 5 | from .._interfaces import IProbe, IOperation
 6 | 
 7 | 
 8 | @implementer(IProbe)
 9 | class NoOpProbe(object):
10 |     """
11 |     A probe that performs no operation.
12 |     """
13 | 
14 |     def run(self):
15 |         return succeed(None)
16 | 
17 |     def cleanup(self):
18 |         return succeed(None)
19 | 
20 | 
21 | @implementer(IOperation)
22 | class NoOperation(object):
23 |     """
24 |     A no-op operation.
25 |     """
26 | 
27 |     def __init__(self, reactor, cluster):
28 |         pass
29 | 
30 |     def get_probe(self):
31 |         return NoOpProbe()
32 | 


--------------------------------------------------------------------------------
/benchmark/operations/read_request.py:
--------------------------------------------------------------------------------
 1 | from zope.interface import implementer
 2 | 
 3 | from twisted.internet.defer import succeed
 4 | 
 5 | from flocker.apiclient import IFlockerAPIV1Client
 6 | 
 7 | from .._interfaces import IProbe, IOperation
 8 | from .._method import validate_no_arg_method
 9 | 
10 | 
11 | @implementer(IProbe)
12 | class ReadRequestProbe(object):
13 |     """
14 |     A probe to perform a read request on the control service.
15 |     """
16 | 
17 |     def __init__(self, request):
18 |         self.request = request
19 | 
20 |     def run(self):
21 |         return self.request()
22 | 
23 |     def cleanup(self):
24 |         return succeed(None)
25 | 
26 | 
27 | @implementer(IOperation)
28 | class ReadRequest(object):
29 |     """
30 |     An operation to perform a read request on the control service.
31 |     """
32 | 
33 |     def __init__(self, reactor, cluster, method='version'):
34 |         validate_no_arg_method(IFlockerAPIV1Client, method)
35 |         self.request = getattr(cluster.get_control_service(reactor), method)
36 | 
37 |     def get_probe(self):
38 |         return ReadRequestProbe(self.request)
39 | 


--------------------------------------------------------------------------------
/benchmark/operations/test/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/benchmark/operations/test/__init__.py


--------------------------------------------------------------------------------
/benchmark/operations/test/test_no_op.py:
--------------------------------------------------------------------------------
 1 | # Copyright 2015 ClusterHQ Inc.  See LICENSE file for details.
 2 | """
 3 | Operations tests for the control service benchmarks.
 4 | """
 5 | from zope.interface.verify import verifyClass
 6 | 
 7 | from flocker.testtools import TestCase
 8 | 
 9 | from benchmark._interfaces import IOperation
10 | from benchmark.operations import NoOperation
11 | 
12 | 
13 | class NoOpTests(TestCase):
14 | 
15 |     def test_implements_IOperation(self):
16 |         """
17 |         NoOp provides the IOperation interface.
18 |         """
19 |         verifyClass(IOperation, NoOperation)
20 | 


--------------------------------------------------------------------------------
/benchmark/operations/test/test_wait.py:
--------------------------------------------------------------------------------
 1 | # Copyright 2015 ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | from twisted.internet.task import Clock
 4 | 
 5 | from flocker.testtools import TestCase
 6 | from benchmark.operations import Wait
 7 | 
 8 | 
 9 | class WaitOperationTests(TestCase):
10 |     """
11 |     Test Wait operation
12 |     """
13 | 
14 |     def test_wait(self):
15 |         """
16 |         Wait operation fires after specified time.
17 |         """
18 |         seconds = 10
19 |         clock = Clock()
20 |         op = Wait(clock, None, wait_seconds=seconds)
21 |         probe = op.get_probe()
22 |         d = probe.run()
23 |         d.addCallback(lambda ignored: probe.cleanup)
24 |         self.assertNoResult(d)
25 |         # Time passes
26 |         clock.advance(seconds)
27 |         self.successResultOf(d)
28 | 


--------------------------------------------------------------------------------
/benchmark/operations/wait.py:
--------------------------------------------------------------------------------
 1 | # Copyright 2015 ClusterHQ Inc.  See LICENSE file for details.
 2 | """
 3 | Wait operation for the control service benchmarks.
 4 | """
 5 | 
 6 | from zope.interface import implementer
 7 | 
 8 | from twisted.internet.defer import Deferred, succeed
 9 | 
10 | from benchmark._interfaces import IProbe, IOperation
11 | 
12 | 
13 | @implementer(IProbe)
14 | class WaitProbe(object):
15 |     """
16 |     A probe to wait for a specified time period.
17 |     """
18 | 
19 |     def __init__(self, reactor, wait_seconds):
20 |         self.reactor = reactor
21 |         self.wait_seconds = wait_seconds
22 | 
23 |     def run(self):
24 |         d = Deferred()
25 |         self.reactor.callLater(self.wait_seconds, d.callback, None)
26 |         return d
27 | 
28 |     def cleanup(self):
29 |         return succeed(None)
30 | 
31 | 
32 | @implementer(IOperation)
33 | class Wait(object):
34 |     """
35 |     An operation to wait for a number of seconds.
36 |     """
37 | 
38 |     def __init__(self, reactor, cluster, wait_seconds=10):
39 |         self.reactor = reactor
40 |         self.wait_seconds = wait_seconds
41 | 
42 |     def get_probe(self):
43 |         return WaitProbe(self.reactor, self.wait_seconds)
44 | 


--------------------------------------------------------------------------------
/benchmark/scenarios/__init__.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Shared benchmarking scenarios components.
 5 | 
 6 | :var int DEFAULT_SAMPLE_SIZE: default size of the benchmarking
 7 |     sample size.
 8 | """
 9 | 
10 | from .no_load import NoLoadScenario
11 | from .read_request_load import read_request_load_scenario
12 | from .write_request_load import (
13 |     write_request_load_scenario, DatasetCreationTimeout,
14 | )
15 | from ._request_load import (
16 |     RequestRateTooLow, RequestRateNotReached, RequestOverload, NoNodesFound,
17 |     RequestScenarioAlreadyStarted,
18 | )
19 | 
20 | __all__ = [
21 |     'NoLoadScenario',
22 |     'read_request_load_scenario',
23 |     'write_request_load_scenario',
24 |     'DatasetCreationTimeout',
25 |     'RequestRateTooLow',
26 |     'RequestRateNotReached',
27 |     'RequestOverload',
28 |     'NoNodesFound',
29 |     'RequestScenarioAlreadyStarted',
30 | ]
31 | 


--------------------------------------------------------------------------------
/benchmark/scenarios/no_load.py:
--------------------------------------------------------------------------------
 1 | # Copyright 2015 ClusterHQ Inc.  See LICENSE file for details.
 2 | """
 3 | No load scenario for the control service benchmarks.
 4 | """
 5 | 
 6 | from zope.interface import implementer
 7 | 
 8 | from twisted.internet.defer import Deferred, succeed
 9 | 
10 | from .._interfaces import IScenario
11 | 
12 | 
13 | @implementer(IScenario)
14 | class NoLoadScenario(object):
15 |     """
16 |     A scenario that places no additional load on the cluster.
17 |     """
18 | 
19 |     def __init__(self, clock, cluster):
20 |         self._maintained = Deferred()
21 | 
22 |     def start(self):
23 |         """
24 |         :return: A Deferred that fires when the desired scenario is
25 |             established (e.g. that a certain load is being applied).
26 |         """
27 |         return succeed(self)  # no setup needed
28 | 
29 |     def maintained(self):
30 |         """
31 |         :return: A Deferred that fires with an errback if the desired
32 |             scenario fails to hold between being established and being
33 |             stopped.  This Deferred never fires with a callback.
34 |         """
35 |         return self._maintained
36 | 
37 |     def stop(self):
38 |         """
39 |         Stop the scenario from being maintained.
40 | 
41 |         :return Deferred[None]: No scenario metrics.
42 |         """
43 |         return succeed(None)
44 | 


--------------------------------------------------------------------------------
/benchmark/scenarios/test/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/benchmark/scenarios/test/__init__.py


--------------------------------------------------------------------------------
/benchmark/scenarios/test/test_no_load.py:
--------------------------------------------------------------------------------
 1 | from zope.interface.verify import verifyClass
 2 | 
 3 | from twisted.internet.task import Clock
 4 | 
 5 | from flocker.testtools import TestCase
 6 | from benchmark.scenarios import NoLoadScenario
 7 | 
 8 | from benchmark._interfaces import IScenario
 9 | 
10 | 
11 | class NoLoadScenarioTests(TestCase):
12 |     """
13 |     NoLoadScenario tests
14 |     """
15 | 
16 |     def test_implements_IScenario(self):
17 |         """
18 |         NoLoadScenario provides the IScenario interface.
19 |         """
20 |         verifyClass(IScenario, NoLoadScenario)
21 | 
22 |     def test_no_load_happy(self):
23 |         """
24 |         NoLoadScenario starts and stops without collapsing.
25 |         """
26 |         s = NoLoadScenario(Clock(), None)
27 |         d = s.start()
28 |         s.maintained().addBoth(lambda x: self.fail())
29 |         d.addCallback(lambda _ignore: s.stop())
30 |         self.successResultOf(d)
31 | 


--------------------------------------------------------------------------------
/benchmark/setup-cluster-containers:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | """
 4 | Set up a cluster.
 5 | """
 6 | 
 7 | import sys
 8 | 
 9 | import os
10 | 
11 | from twisted.internet.task import react
12 | from benchmark.cluster_containers_setup import main
13 | 
14 | if __name__ == '__main__':
15 |     react(main, (sys.argv, os.environ))
16 | 


--------------------------------------------------------------------------------
/benchmark/test/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/benchmark/test/__init__.py


--------------------------------------------------------------------------------
/dev-requirements.txt:
--------------------------------------------------------------------------------
1 | # Install everything required for local development.
2 | --requirement requirements/all.txt
3 | --editable .
4 | 


--------------------------------------------------------------------------------
/dockerfiles/control/Dockerfile:
--------------------------------------------------------------------------------
 1 | FROM ubuntu:16.04
 2 | 
 3 | MAINTAINER ClusterHQ <contact@clusterhq.com>
 4 | 
 5 | RUN \
 6 |     apt-get --yes update \
 7 |     && apt-get --yes install --no-install-recommends \
 8 |         apt-transport-https \
 9 |         ca-certificates \
10 |     && apt-get --yes clean
11 | 
12 | ARG FLOCKER_VERSION="*"
13 | ARG FLOCKER_REPOSITORY="https://clusterhq-archive.s3.amazonaws.com/ubuntu/16.04/amd64"
14 | RUN echo "deb ${FLOCKER_REPOSITORY} /" > /etc/apt/sources.list.d/clusterhq.list
15 | RUN \
16 |     apt-get --yes update \
17 |     && apt-get --yes install --no-install-recommends --allow-unauthenticated \
18 |         clusterhq-python-flocker=${FLOCKER_VERSION} \
19 |         clusterhq-flocker-node=${FLOCKER_VERSION}
20 | 
21 | VOLUME /etc/flocker
22 | VOLUME /var/lib/flocker
23 | 
24 | EXPOSE 4523
25 | EXPOSE 4524
26 | 
27 | ENTRYPOINT ["/usr/sbin/flocker-control", "--port=tcp:4523", "--agent-port=tcp:4524", "--certificates-directory=/etc/flocker", "--data-path=/var/lib/flocker"] 
28 | 


--------------------------------------------------------------------------------
/dockerfiles/dataset/Dockerfile:
--------------------------------------------------------------------------------
 1 | FROM ubuntu:16.04
 2 | 
 3 | MAINTAINER ClusterHQ <contact@clusterhq.com>
 4 | 
 5 | RUN \
 6 |     apt-get --yes update \
 7 |     && apt-get --yes install --no-install-recommends \
 8 |         apt-transport-https \
 9 |         ca-certificates \
10 |     && apt-get --yes clean
11 | 
12 | ARG FLOCKER_VERSION="*"
13 | ARG FLOCKER_REPOSITORY="https://clusterhq-archive.s3.amazonaws.com/ubuntu/16.04/amd64"
14 | RUN echo "deb ${FLOCKER_REPOSITORY} /" > /etc/apt/sources.list.d/clusterhq.list
15 | RUN \
16 |     apt-get --yes update \
17 |     && apt-get --yes install --no-install-recommends --allow-unauthenticated \
18 |         clusterhq-python-flocker=${FLOCKER_VERSION} \
19 |         clusterhq-flocker-node=${FLOCKER_VERSION}
20 | 
21 | VOLUME /etc/flocker
22 | 
23 | ENTRYPOINT ["/usr/sbin/flocker-dataset-agent", "--agent-config=/etc/flocker/agent.yml"]
24 | 


--------------------------------------------------------------------------------
/dockerfiles/docker-plugin/Dockerfile:
--------------------------------------------------------------------------------
 1 | FROM ubuntu:16.04
 2 | 
 3 | MAINTAINER ClusterHQ <contact@clusterhq.com>
 4 | 
 5 | RUN \
 6 |     apt-get --yes update \
 7 |     && apt-get --yes install --no-install-recommends \
 8 |         apt-transport-https \
 9 |         ca-certificates \
10 |     && apt-get --yes clean
11 | 
12 | ARG FLOCKER_VERSION="*"
13 | ARG FLOCKER_REPOSITORY="https://clusterhq-archive.s3.amazonaws.com/ubuntu/16.04/amd64"
14 | RUN echo "deb ${FLOCKER_REPOSITORY} /" > /etc/apt/sources.list.d/clusterhq.list
15 | RUN \
16 |     apt-get --yes update \
17 |     && apt-get --yes install --no-install-recommends --allow-unauthenticated \
18 |         clusterhq-python-flocker=${FLOCKER_VERSION} \
19 |         clusterhq-flocker-node=${FLOCKER_VERSION}
20 | 
21 | VOLUME /etc/flocker
22 | 
23 | ENTRYPOINT ["/opt/flocker/bin/flocker-docker-plugin", "--agent-config=/etc/flocker/agent.yml"]
24 | 


--------------------------------------------------------------------------------
/docs/_static/.placeholder:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_static/.placeholder


--------------------------------------------------------------------------------
/docs/_templates/.placeholder:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_templates/.placeholder


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/layout.html:
--------------------------------------------------------------------------------
1 | {%- if pagename =='version' -%}
2 | {%- extends 'layout_version.html' -%}
3 | {%- else -%}
4 | {%- extends 'layout_docs.html' -%}
5 | {%- endif -%}
6 | 


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/layout_version.html:
--------------------------------------------------------------------------------
1 | {% block body %}{% endblock %}
2 | 


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/files:
--------------------------------------------------------------------------------
1 | flocker.png
2 | signup.png
3 | arrow.png
4 | flocker.png
5 | flocker@2x.png
6 | signup@2x.png
7 | arrow@2x.png
8 | 


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/fonts/glyphicons-halflings-regular.eot


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/fonts/glyphicons-halflings-regular.ttf


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/fonts/glyphicons-halflings-regular.woff


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/AWS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/AWS.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/GCE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/GCE.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/Untitled-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/Untitled-2.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/amazon-docker2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/amazon-docker2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/arrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/arrow.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/arrow@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/arrow@2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/centos2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/centos2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/ceph2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/ceph2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/clusterhq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/clusterhq.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/clusterhq@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/clusterhq@2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/convergeio2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/convergeio2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/coprhd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/coprhd.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/coreos2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/coreos2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/default2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/default2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/dell2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/dell2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/docker2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/docker2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/download@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/download@2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/emc2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/emc2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/exclamation@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/exclamation@2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/flocker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/flocker.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/flocker@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/flocker@2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/gce2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/gce2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/hedvig2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/hedvig2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/huawei2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/huawei2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/icon-community2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/icon-community2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/icon-labs2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/icon-labs2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/icon-question2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/icon-question2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/icon-soon2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/icon-soon2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/kaminario.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/kaminario.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/kubernetes2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/kubernetes2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/logo-woodmark@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/logo-woodmark@2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/macbook@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/macbook@2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/menu@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/menu@2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/mesos2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/mesos2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/migration@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/migration@2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/netapp2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/netapp2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/nexenta2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/nexenta2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/nodes@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/nodes@2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/open-vstorage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/open-vstorage.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/openstack2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/openstack2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/pure-storage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/pure-storage.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/rhel72x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/rhel72x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/saratoga2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/saratoga2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/search-icon@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/search-icon@2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/signup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/signup.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/signup@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/signup@2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/ubuntu2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/ubuntu2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/vmware2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/vmware2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/images/warning@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/_themes/clusterhq/static/images/warning@2x.png


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/js/feedback.js:
--------------------------------------------------------------------------------
 1 | $("#feedback").submit(function() {
 2 |     event.preventDefault();
 3 | 
 4 |     $.ajax({
 5 |         url: "https://www.formstack.com/forms/index.php",
 6 |         method: "POST",
 7 |         data: $("#feedback").serialize(),
 8 |         dataType: "json"
 9 |     });
10 | 
11 |     $("#feedback").html("<p>Thanks for your feedback, if you gave your email address we'll be in touch with you shortly.</p>");
12 | });
13 | 


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/js/main.js:
--------------------------------------------------------------------------------
 1 | $(document).ready(function() {
 2 |     $('div.signup, .nav-tabs, .tab-content').show();
 3 |     $('#form-signup').submit(function(e) {
 4 |         var email_addr = $('#email').val();
 5 |         if (email_addr == '') {
 6 |             return false;
 7 |         }
 8 |         intercomSettings = {
 9 |             email: email_addr,
10 |             created_at: Date.now() / 1000 | 0,
11 |             app_id: "6f60bd754398773e9bb9976f4ca3e630d9fffeed"
12 |         };
13 |         $('#signup-content').fadeOut("slow", function() { $('#signup-content').html("<h1>Thanks for registering</h1><p>We'll be in touch soon.</p>").fadeIn("slow"); });
14 |         window.Intercom('boot', intercomSettings); 
15 |         return false;
16 |     });
17 | });
18 | 


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/js/plugins.js:
--------------------------------------------------------------------------------
 1 | // Avoid `console` errors in browsers that lack a console.
 2 | (function() {
 3 |     var method;
 4 |     var noop = function () {};
 5 |     var methods = [
 6 |         'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
 7 |         'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
 8 |         'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
 9 |         'timeStamp', 'trace', 'warn'
10 |     ];
11 |     var length = methods.length;
12 |     var console = (window.console = window.console || {});
13 | 
14 |     while (length--) {
15 |         method = methods[length];
16 | 
17 |         // Only stub undefined methods.
18 |         if (!console[method]) {
19 |             console[method] = noop;
20 |         }
21 |     }
22 | }());
23 | 
24 | // Place any jQuery/helper plugins in here.
25 | 


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/js/segment.js:
--------------------------------------------------------------------------------
 1 | $(document).ready(function() {
 2 |     // For every anchor on the page, create an analytics track event onclick
 3 |     $('a').each(function(index, val){
 4 |         analytics.trackLink($(this), 'Clicked', {
 5 |             object: 'link',
 6 |             anchor_text:  $(this).text(),
 7 |             destination_url: $(this).attr("href"),
 8 |             page_name: window.location.pathname
 9 |         });
10 |     });
11 | });
12 | 
13 | // On form submit event, send analytics track event
14 | $('form').submit(function( event ) {
15 |     analytics.track('Form Submit', {
16 |         form_id: $(this).attr("id")
17 |     });
18 | });
19 | 


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/static/js/vendor/npm.js:
--------------------------------------------------------------------------------
 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.
 2 | require('../../js/transition.js')
 3 | require('../../js/alert.js')
 4 | require('../../js/button.js')
 5 | require('../../js/carousel.js')
 6 | require('../../js/collapse.js')
 7 | require('../../js/dropdown.js')
 8 | require('../../js/modal.js')
 9 | require('../../js/tooltip.js')
10 | require('../../js/popover.js')
11 | require('../../js/scrollspy.js')
12 | require('../../js/tab.js')
13 | require('../../js/affix.js')


--------------------------------------------------------------------------------
/docs/_themes/clusterhq/theme.conf:
--------------------------------------------------------------------------------
1 | [theme]
2 | inherit = basic
3 | stylesheet = docs.css
4 | 
5 | [options]
6 | disqus_shortname = clusterhq
7 | analytics_code = UA-5968423-9
8 | analytics_domain = clusterhq.com
9 | 


--------------------------------------------------------------------------------
/docs/administering/index.rst:
--------------------------------------------------------------------------------
 1 | =====================
 2 | Administering Flocker
 3 | =====================
 4 | 
 5 | .. toctree::
 6 |    :maxdepth: 2
 7 | 
 8 |    upgrading
 9 |    debugging
10 | 


--------------------------------------------------------------------------------
/docs/docker-integration/configuring-authentication.rst:
--------------------------------------------------------------------------------
 1 | .. _authentication-docker:
 2 | 
 3 | ==================================
 4 | Configuring Cluster Authentication
 5 | ==================================
 6 | 
 7 | .. include:: ../installation/configuring-authentication.rst
 8 |    :start-after: .. begin-body-config-authentication
 9 |    :end-before: .. end-body-config-authentication
10 | 
11 | Next Step
12 | =========
13 | 
14 | .. raw:: html
15 | 
16 |    <a href="generate-api-certificates.html" class="button">Generate an API Client Certificate</a>
17 |    <br/><br/>
18 | 
19 | Or, :ref:`return to the installation menu <installing-flocker-with-docker>`.
20 | 


--------------------------------------------------------------------------------
/docs/docker-integration/configuring-nodes-storage.rst:
--------------------------------------------------------------------------------
 1 | .. _configuring-nodes-backends-docker:
 2 | 
 3 | ==========================================
 4 | Configuring the Nodes and Storage Backends
 5 | ==========================================
 6 | 
 7 | .. include:: ../installation/configuring-nodes-storage.rst
 8 |    :start-after: .. begin-body-nodeconfig-agent-yml
 9 |    :end-before: .. end-body-nodeconfig-agent-yml
10 | 
11 | Next Step
12 | =========
13 | 
14 | .. raw:: html
15 | 
16 |    <a href="enabling-agent-service.html" class="button">Enable the Flocker Agent Service</a>
17 |    <br/><br/>
18 | 
19 | Or, :ref:`return to the installation menu <installing-flocker-with-docker>`.
20 | 


--------------------------------------------------------------------------------
/docs/docker-integration/enabling-control-service.rst:
--------------------------------------------------------------------------------
 1 | .. _enabling-control-service-docker:
 2 | 
 3 | ====================================
 4 | Enabling the Flocker Control Service 
 5 | ====================================
 6 | 
 7 | .. include:: ../installation/enabling-control-service.rst
 8 |    :start-after: .. begin-body
 9 |    :end-before: .. end-body
10 | 
11 | Next Step
12 | =========
13 | 
14 | .. raw:: html
15 | 
16 |    <a href="configuring-nodes-storage.html" class="button">Configure the Nodes and Storage Backends</a>
17 |    <br/><br/>
18 | 
19 | Or, :ref:`return to the installation menu <installing-flocker-with-docker>`.
20 | 


--------------------------------------------------------------------------------
/docs/docker-integration/generate-api-certificates.rst:
--------------------------------------------------------------------------------
 1 | .. _generate-api-docker:
 2 | 
 3 | ====================================
 4 | Generating an API Client Certificate
 5 | ====================================
 6 | 
 7 | .. include:: ../installation/generate-api-certificates.rst
 8 |    :start-after: .. begin-body
 9 |    :end-before: .. end-body
10 | 
11 | Next Step
12 | =========
13 | 
14 | .. raw:: html
15 | 
16 |    <a href="generate-api-plugin.html" class="button">Generate an API Client Certificate for the Flocker Plugin for Docker</a>
17 |    <br/><br/>
18 | 
19 | Or, :ref:`return to the installation menu <installing-flocker-with-docker>`.
20 | 


--------------------------------------------------------------------------------
/docs/docker-integration/generate-api-plugin.rst:
--------------------------------------------------------------------------------
 1 | .. _generate-api-docker-plugin:
 2 | 
 3 | ======================================================================
 4 | Generating an API Client Certificate for the Flocker Plugin for Docker
 5 | ======================================================================
 6 | 
 7 | The Flocker plugin for Docker requires access to the Flocker REST API.
 8 | To use the plugin, you will need to create an API client certificate and key for a user named ``plugin`` on each node. 
 9 | For more information, see the :ref:`generate-api-docker` instructions.
10 | 
11 | #. Generate an API client certificate for a user named ``plugin``:
12 | 
13 |    .. prompt:: bash $
14 | 
15 |       flocker-ca create-api-certificate plugin
16 | 
17 | #. Upload the :file:`plugin.key` and :file:`plugin.crt` file via a secure communication medium, such as SSH, SCP or SFTP, to the  :file:`/etc/flocker/` folder on each node in your cluster.
18 |    For example:
19 | 
20 |    .. prompt:: bash $
21 |    
22 |       scp ./plugin.crt root@172.16.255.251:/etc/flocker/plugin.crt
23 |       scp ./plugin.key root@172.16.255.251:/etc/flocker/plugin.key
24 | 
25 | Next Step
26 | =========
27 | 
28 | .. raw:: html
29 | 
30 |    <a href="enabling-control-service.html" class="button">Enable the Flocker Control Service</a>
31 |    <br/><br/>
32 | 
33 | Or, :ref:`return to the installation menu <installing-flocker-with-docker>`.
34 | 


--------------------------------------------------------------------------------
/docs/docker-integration/setup-aws.rst:
--------------------------------------------------------------------------------
 1 | .. _aws-install-docker:
 2 | 
 3 | ==========================================
 4 | Setting Up Nodes Using Amazon Web Services
 5 | ==========================================
 6 | 
 7 | .. include:: ../installation/setup-aws.rst
 8 |    :start-after: .. begin-body
 9 |    :end-before: .. end-body
10 | 
11 | Next Step
12 | =========
13 | 
14 | Return to the installation instructions specific to your operating system to install ``clusterhq-flocker-node`` on each node in your cluster:
15 | 
16 | .. raw:: html
17 | 
18 |    <br/><a href="install-node.html#centos-7-install-docker" class="button">Installing on CentOS 7</a>
19 |    <a href="install-node.html#ubuntu-16-04-install-docker" class="button">Installing on Ubuntu 16.04</a>
20 |    <a href="install-node.html#ubuntu-14-04-install-docker" class="button">Installing on Ubuntu 14.04</a>
21 |    <br/><br/>
22 | 
23 | Or, :ref:`return to the installation menu <installing-flocker-with-docker>`.
24 | 


--------------------------------------------------------------------------------
/docs/docker-integration/setup-gce.rst:
--------------------------------------------------------------------------------
 1 | .. _gce-install-docker:
 2 | 
 3 | ============================================
 4 | Setting Up Nodes Using Google Compute Engine
 5 | ============================================
 6 | 
 7 | .. include:: ../installation/setup-gce.rst
 8 |    :start-after: .. begin-body
 9 |    :end-before: .. end-body
10 | 
11 | Next Step
12 | =========
13 | 
14 | Return to the installation instructions specific to your operating system to install ``clusterhq-flocker-node`` on each node in your cluster:
15 | 
16 | .. raw:: html
17 | 
18 |    <br/><a href="install-node.html#centos-7-install-docker" class="button">Installing on CentOS 7</a>
19 |    <a href="install-node.html#ubuntu-16-04-install-docker" class="button">Installing on Ubuntu 16.04</a>
20 |    <a href="install-node.html#ubuntu-14-04-install-docker" class="button">Installing on Ubuntu 14.04</a>
21 |    <br/><br/>
22 | 
23 | Or, :ref:`return to the installation menu <installing-flocker-with-docker>`.
24 | 


--------------------------------------------------------------------------------
/docs/docker-integration/setup-rackspace.rst:
--------------------------------------------------------------------------------
 1 | .. _rackspace-install-docker:
 2 | 
 3 | ================================
 4 | Setting Up Nodes Using Rackspace
 5 | ================================
 6 | 
 7 | .. include:: ../installation/setup-rackspace.rst
 8 |    :start-after: .. begin-body
 9 |    :end-before: .. end-body
10 | 
11 | Next Step
12 | =========
13 | 
14 | Return to the installation instructions specific to your operating system to install ``clusterhq-flocker-node`` on each node in your cluster:
15 | 
16 | .. raw:: html
17 | 
18 |    <br/><a href="install-node.html#centos-7-install-docker" class="button">Installing on CentOS 7</a>
19 |    <a href="install-node.html#ubuntu-16-04-install-docker" class="button">Installing on Ubuntu 16.04</a>
20 |    <a href="install-node.html#ubuntu-14-04-install-docker" class="button">Installing on Ubuntu 14.04</a>
21 |    <br/><br/>
22 | 
23 | Or, :ref:`return to the installation menu <installing-flocker-with-docker>`.
24 | 


--------------------------------------------------------------------------------
/docs/docker-integration/tutorial-downloads/flocker-swarm-tutorial-node1.yml:
--------------------------------------------------------------------------------
 1 | version: "2"
 2 | 
 3 | volumes:
 4 |    postgres:
 5 |       driver: "flocker"
 6 |       driver_opts:
 7 |         size: "10GiB"
 8 |         profile: "bronze"
 9 | 
10 | services:
11 |    web:
12 |      image: binocarlos/moby-counter
13 |      ports:
14 |         -  "80:80"
15 |      environment:
16 |         - "constraint:flocker-node==1"
17 |         - "USE_POSTGRES_HOST=postgres"
18 |         - "POSTGRES_USER=flocker"
19 |         - "POSTGRES_PASSWORD=flockerdemo"
20 |      network_mode: "bridge"
21 |      links:
22 |         - "postgres:postgres"
23 |    postgres:
24 |      image: postgres:9.5
25 |      ports:
26 |         -  "5432:5432"
27 |      environment:
28 |         - "constraint:flocker-node==1"
29 |         - "POSTGRES_USER=flocker"
30 |         - "POSTGRES_PASSWORD=flockerdemo"
31 |         - "POSTGRES_DB=postgres"
32 |         - "PGDATA=/var/lib/postgresql/data"
33 |      network_mode: "bridge"
34 |      volumes:
35 |         - 'postgres:/var/lib/postgresql/data'
36 | 


--------------------------------------------------------------------------------
/docs/docker-integration/tutorial-downloads/flocker-swarm-tutorial-node2.yml:
--------------------------------------------------------------------------------
 1 | version: "2"
 2 | 
 3 | volumes:
 4 |    postgres:
 5 |       driver: "flocker"
 6 |       driver_opts:
 7 |         size: "10GiB"
 8 |         profile: "bronze"
 9 | 
10 | services:
11 |    web:
12 |      image: binocarlos/moby-counter
13 |      ports:
14 |         -  "80:80"
15 |      environment:
16 |         - "constraint:flocker-node==2"
17 |         - "USE_POSTGRES_HOST=postgres"
18 |         - "POSTGRES_USER=flocker"
19 |         - "POSTGRES_PASSWORD=flockerdemo"
20 |      network_mode: "bridge"
21 |      links:
22 |         - "postgres:postgres"
23 |    postgres:
24 |      image: postgres:9.5
25 |      ports:
26 |         -  "5432:5432"
27 |      environment:
28 |         - "constraint:flocker-node==2"
29 |         - "POSTGRES_USER=flocker"
30 |         - "POSTGRES_PASSWORD=flockerdemo"
31 |         - "POSTGRES_DB=postgres"
32 |         - "PGDATA=/var/lib/postgresql/data"
33 |      network_mode: "bridge"
34 |      volumes:
35 |         - 'postgres:/var/lib/postgresql/data'
36 | 


--------------------------------------------------------------------------------
/docs/error_pages/404.rst:
--------------------------------------------------------------------------------
 1 | :orphan:
 2 | 
 3 | .. We don't want this page included in the TOC.
 4 | .. See http://sphinx-doc.org/latest/markup/misc.html#metadata
 5 | 
 6 | Error 404 - Not Found
 7 | ~~~~~~~~~~~~~~~~~~~~~
 8 | 
 9 | Sorry but the page you are looking for cannot be found.
10 | 


--------------------------------------------------------------------------------
/docs/filters.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Filters for Sphinx.
 5 | 
 6 | A separate module than conf.py so that Sphinx can pickle instances of classes
 7 | defined here.
 8 | """
 9 | 
10 | from characteristic import attributes
11 | from enchant.tokenize import Filter
12 | 
13 | 
14 | # See http://doughellmann.com/2011/05/26/creating-a-spelling-checker-for-restructuredtext-documents.html
15 | @attributes(['words'])
16 | class IgnoreWordsFilter(Filter):
17 |     """
18 |     Given a set of words ignore them all.
19 |     """
20 |     def __init__(self, tokenizer):
21 |         Filter.__init__(self, tokenizer)
22 | 
23 |     def _skip(self, word):
24 |         return word in self.words
25 | 
26 | 
27 | @attributes(['words'])
28 | class IgnoreWordsFilterFactory(object):
29 |     """
30 |     Factory for ``IgnoreWordsFilter``.
31 |     """
32 | 
33 |     def __call__(self, tokenizer):
34 |         return IgnoreWordsFilter(tokenizer, words=self.words)
35 | 


--------------------------------------------------------------------------------
/docs/flocker-features/convergeio-configuration.rst:
--------------------------------------------------------------------------------
 1 | .. _convergeio-backend:
 2 | 
 3 | ===============================
 4 | ConvergeIO Block Device Backend 
 5 | ===============================
 6 | 
 7 | .. begin-body
 8 | 
 9 | ConvergeIO provides a plugin for Flocker integration with their storage solution, allowing Dockerized applications to use ConvergeIO storage.
10 | 
11 | For more information, visit the following GitHub repository: `ConvergeIO Flocker driver on GitHub`_
12 | 
13 | ConvergeIO also support `Flocker Storage Profiles`_.
14 | 
15 | .. XXX FLOC 2443 to expand this Backend storage section
16 | 
17 | .. _ConvergeIO Flocker driver on GitHub: https://github.com/ConvergeIO/cio-flocker-driver
18 | .. _Flocker Storage Profiles: https://github.com/ConvergeIO/cio-flocker-driver/blob/gh-pages/driver/cio.py#L133
19 | 
20 | .. end-body
21 | 


--------------------------------------------------------------------------------
/docs/flocker-features/coprhd-configuration.rst:
--------------------------------------------------------------------------------
 1 | .. _coprhd-backend:
 2 | 
 3 | =============================
 4 |  CoprHD Block Device Backend
 5 | =============================
 6 | 
 7 | .. begin-body
 8 | 
 9 | CoprHD is an open-source, software defined storage controller and API platform.
10 | It enables policy-based management and cloud automation of storage resources for block, object and file storage providers.
11 | 
12 | CoprHD-Flocker integration enables CoprHD to provide persistent storage to Docker containers via Flocker.
13 | 
14 | * Read the `CoprHD and Flocker Integration Guide <https://coprhd.atlassian.net/wiki/display/COP/CoprHD+and+Flocker+Integration>`_.
15 | * View the `CoprHD Flocker Backend Source Code <https://review.coprhd.org/projects/CE/repos/flocker-driver>`_
16 | 
17 | .. end-body
18 | 


--------------------------------------------------------------------------------
/docs/flocker-features/dell-configuration.rst:
--------------------------------------------------------------------------------
 1 | .. _dell-dataset-backend:
 2 | 
 3 | ===================================
 4 | Dell SC Series Block Device Backend
 5 | ===================================
 6 | 
 7 | .. begin-body
 8 | 
 9 | Dell provides a plugin for Flocker integration with `SC Series`_ storage arrays.
10 | 
11 | For more information and installation instructions, visit the following GitHub repository: `Dell Storage Center Flocker driver on GitHub`_
12 | 
13 | Dell SC Series also support `Flocker Storage Profiles`_.
14 | 
15 | .. _SC Series: http://www.dell.com/us/business/p/dell-compellent
16 | .. _Dell Storage Center Flocker driver on GitHub: https://github.com/dellstorage/storagecenter-flocker-driver
17 | .. _Flocker Storage Profiles: https://github.com/dellstorage/storagecenter-flocker-driver/blob/master/dell_storagecenter_driver/dell_storagecenter_blockdevice.py
18 | 
19 | .. end-body
20 | 


--------------------------------------------------------------------------------
/docs/flocker-features/emc-configuration.rst:
--------------------------------------------------------------------------------
 1 | .. _emc-dataset-backend:
 2 | 
 3 | ========================
 4 | EMC Block Device Backend
 5 | ========================
 6 | 
 7 | .. begin-body
 8 | 
 9 | EMC provide plugins for Flocker integration with `ScaleIO`_, `XtremIO`_ and `VMAX`_.
10 | For more information, including installation, testing and usage instructions, visit the following links to their GitHub repositories:
11 | 
12 | * `EMC ScaleIO Flocker driver on GitHub`_
13 | * `EMC XtremIO Flocker driver on GitHub`_
14 | * `EMC VMAX Flocker driver on GitHub`_
15 | 
16 | .. XXX FLOC 2443 to expand this EMC/Backend storage section
17 | 
18 | .. _ScaleIO: https://www.emc.com/storage/scaleio/index.htm
19 | .. _XtremIO: https://www.emc.com/storage/xtremio/overview.htm
20 | .. _VMAX: https://www.emc.com/en-us/storage/vmax.htm
21 | .. _EMC ScaleIO Flocker driver on GitHub: https://github.com/emccode/flocker-drivers/tree/master/scaleio
22 | .. _EMC XtremIO Flocker driver on GitHub: https://github.com/emccode/flocker-drivers/tree/master/xtremio
23 | .. _EMC VMAX Flocker driver on GitHub: https://github.com/emccode/flocker-drivers/tree/master/vmax
24 | 
25 | .. end-body
26 | 


--------------------------------------------------------------------------------
/docs/flocker-features/hedvig-configuration.rst:
--------------------------------------------------------------------------------
 1 | .. _hedvig-backend:
 2 | 
 3 | ===========================
 4 | Hedvig Block Device Backend
 5 | ===========================
 6 | 
 7 | .. begin-body
 8 | 
 9 | Hedvig provides a plugin for Flocker integration with their storage solution, allowing Dockerized applications to use Hedvig storage.
10 | 
11 | For more information, visit the following GitHub repository: `Hedvig Flocker driver on GitHub`_
12 | 
13 | Hedvig also support `Flocker Storage Profiles`_.
14 | 
15 | .. XXX FLOC 2443 to expand this Backend storage section
16 | 
17 | .. _Hedvig Flocker driver on GitHub: https://github.com/hedvig/hedvig-flocker-driver
18 | .. _Flocker Storage Profiles: http://hedviginc.com/blog/flocker-storage-profiles-for-docker
19 | 
20 | .. end-body
21 | 


--------------------------------------------------------------------------------
/docs/flocker-features/huawei-configuration.rst:
--------------------------------------------------------------------------------
 1 | .. _huawei-backend:
 2 | 
 3 | ===========================
 4 | Huawei Block Device Backend
 5 | ===========================
 6 | 
 7 | .. begin-body
 8 | 
 9 | Huawei provides a plugin for Flocker integration with Huawei storage.
10 | 
11 | For more information, including installation, testing and usage instructions, visit the following GitHub repository: `Huawei Flocker driver on GitHub`_
12 | 
13 | .. _Huawei Flocker driver on GitHub: https://github.com/huaweistorage/huawei-oceanstor-flocker-plugin
14 | 
15 | .. end-body
16 | 


--------------------------------------------------------------------------------
/docs/flocker-features/index.rst:
--------------------------------------------------------------------------------
 1 | .. _features:
 2 | 
 3 | ================
 4 | Flocker Features
 5 | ================
 6 | 
 7 | .. toctree::
 8 |    :maxdepth: 2
 9 | 
10 |    architecture
11 |    flockerctl
12 |    security
13 |    storage-backends
14 |    storage-profiles
15 | 


--------------------------------------------------------------------------------
/docs/flocker-features/kaminario-configuration.rst:
--------------------------------------------------------------------------------
 1 | .. _kaminario-backend:
 2 | 
 3 | =================================
 4 | Kaminario K2 Block Device Backend
 5 | =================================
 6 | 
 7 | .. begin-body
 8 | 
 9 | Kaminario provides a Flocker driver for the `K2 all-flash storage array <http://kaminario.com/all-flash-array/>`_.
10 | Kaminario K2 is the world's only all-flash storage solution that delivers the predictability needed to handle the highly unpredictable world of modern businesses, where customers demand speed and ease of use.
11 | 
12 | The driver can be found at the `Kaminario Flocker Driver on GitHub <https://github.com/Kaminario/flocker-driver>`_
13 | 
14 | .. end-body
15 | 


--------------------------------------------------------------------------------
/docs/flocker-features/loopback-configuration.rst:
--------------------------------------------------------------------------------
 1 | .. _loopback-dataset-backend:
 2 | 
 3 | ================================================
 4 | Loopback Block Device Backend (INTERNAL TESTING)
 5 | ================================================
 6 | 
 7 | .. begin-body
 8 | 
 9 | The Loopback backend uses node-local storage as storage for datasets.
10 | It has no data movement functionality.
11 | It serves primarily as a development and testing tool for the other block device backend implementations.
12 | You may find it useful if you plan to work on Flocker itself.
13 | This backend has no infrastructure requirements: it can run no matter where the Flocker dataset agents run.
14 | The configuration item to use Loopback should look like:
15 | 
16 | .. code-block:: yaml
17 | 
18 |    "dataset":
19 |       "backend": "loopback"
20 |       "root_path": "/var/lib/flocker/loopback"
21 | 
22 | The ``root_path`` is a local path on each Flocker dataset agent node where dataset storage will reside.
23 | 
24 | .. end-body
25 | 


--------------------------------------------------------------------------------
/docs/flocker-features/netapp-configuration.rst:
--------------------------------------------------------------------------------
 1 | .. _netapp-backend:
 2 | 
 3 | ===========================
 4 | NetApp Block Device Backend
 5 | ===========================
 6 | 
 7 | .. begin-body
 8 | 
 9 | NetApp provides a plugin for Flocker integration with Clustered Data ONTAP, allowing Dockerized applications to use NetApp storage.
10 | 
11 | For more information, visit the following GitHub repository: `NetApp Flocker driver on GitHub`_
12 | 
13 | .. XXX FLOC 2443 to expand this Backend storage section
14 | 
15 | .. _NetApp Flocker driver on GitHub: https://github.com/netapp/flocker
16 | 
17 | .. end-body
18 | 


--------------------------------------------------------------------------------
/docs/flocker-features/nexenta-configuration.rst:
--------------------------------------------------------------------------------
 1 | .. _nexenta-backend:
 2 | 
 3 | ================================
 4 | NexentaEdge Block Device Backend
 5 | ================================
 6 | 
 7 | .. begin-body
 8 | 
 9 | Nexenta provides a plugin for Flocker integration with NexentaEdge storage.
10 | 
11 | For more information, including installation, testing and usage instructions, visit the following GitHub repository: `NexentaEdge Flocker driver on GitHub`_
12 | 
13 | .. _NexentaEdge Flocker driver on GitHub: https://github.com/Nexenta/nedge-flocker-driver
14 | 
15 | .. end-body
16 | 


--------------------------------------------------------------------------------
/docs/flocker-features/open-vstorage-configuration.rst:
--------------------------------------------------------------------------------
 1 | .. _open-vstorage-backend:
 2 | 
 3 | ==================================
 4 | Open vStorage Block Device Backend
 5 | ==================================
 6 | 
 7 | .. begin-body
 8 | 
 9 | Open vStorage provides a plugin for Flocker integration allowing Dockerized applications to use a vPool on Open vStorage.
10 | 
11 | For more information, visit the following GitHub repository: `Open vStorage Flocker driver on GitHub`_
12 | 
13 | To start using the Open vStorage Flocker plugin, see the `Open vStorage documentation`_.
14 | 
15 | .. _Open vStorage Flocker driver on GitHub: https://github.com/openvstorage/openvstorage-flocker-driver
16 | .. _Open vStorage documentation: https://openvstorage.gitbooks.io/openvstorage/content/Administration/createvdisk.html#docker
17 | 
18 | .. end-body
19 | 


--------------------------------------------------------------------------------
/docs/flocker-features/pure-storage-configuration.rst:
--------------------------------------------------------------------------------
 1 | .. _pure-storage-backend:
 2 | 
 3 | =================================
 4 | Pure Storage Block Device Backend
 5 | =================================
 6 | 
 7 | .. begin-body
 8 | 
 9 | Pure Storage provides a Flocker backend plugin for the **FlashArray//m** all-flash storage array.
10 | **FlashArray//m** enables you to transform your rack, data center, or cloud, with an affordable all-flash array capable of consolidating all your key business applications.
11 | 
12 | For more information, including installation, testing and usage instructions, visit the `Pure Storage Flocker Driver on GitHub <https://github.com/PureStorage-OpenConnect/purestorage-flocker-driver>`_
13 | 
14 | .. end-body
15 | 


--------------------------------------------------------------------------------
/docs/flocker-features/saratogaspeed-configuration.rst:
--------------------------------------------------------------------------------
 1 | .. _saratogaspeed-backend:
 2 | 
 3 | ===================================
 4 | Saratoga Speed Block Device Backend
 5 | ===================================
 6 | 
 7 | .. begin-body
 8 | 
 9 | Saratoga Speed provides a plugin for Flocker integration with their storage solution, allowing Dockerized applications to use Saratoga Speed storage.
10 | 
11 | For more information, visit the following GitHub repository: `Saratoga Speed Flocker driver on GitHub`_
12 | 
13 | .. XXX FLOC 2443 to expand this Backend storage section
14 | 
15 | .. _Saratoga Speed Flocker driver on GitHub: https://github.com/saratogaadmin/saratoga_flocker
16 | 
17 | .. end-body
18 | 


--------------------------------------------------------------------------------
/docs/flocker-features/vmware-configuration.rst:
--------------------------------------------------------------------------------
 1 | .. _vmware-backend:
 2 | 
 3 | ===========================
 4 | VMware Block Device Backend
 5 | ===========================
 6 | 
 7 | .. begin-body
 8 | 
 9 | VMware provides a plugin for Flocker integration with `vSphere`_, allowing Dockerized applications to use vSphere storage.
10 | This driver allows you to provision persistent data volumes on VMware's vSphere storage data stores (VMFS, NFS, VSAN, VVOL).
11 | 
12 | For more information, visit the following GitHub repository: `VMware vSphere Flocker driver on GitHub`_
13 | 
14 | .. XXX FLOC 2443 to expand this Backend storage section
15 | 
16 | .. _vSphere: http://www.vmware.com/products/vsphere/
17 | .. _VMware vSphere Flocker driver on GitHub: https://github.com/vmware/vsphere-flocker-driver
18 | 
19 | .. end-body
20 | 


--------------------------------------------------------------------------------
/docs/flocker-standalone/configuring-authentication.rst:
--------------------------------------------------------------------------------
 1 | .. _authentication-standalone-flocker:
 2 | 
 3 | ==================================
 4 | Configuring Cluster Authentication
 5 | ==================================
 6 | 
 7 | .. include:: ../installation/configuring-authentication.rst
 8 |    :start-after: .. begin-body-config-authentication
 9 |    :end-before: .. end-body-config-authentication
10 | 
11 | Next Step
12 | =========
13 | 
14 | .. raw:: html
15 | 
16 |    <a href="generate-api-certificates.html" class="button">Generate an API Client Certificate</a>
17 |    <br/><br/>
18 | 
19 | Or, :ref:`return to the installation menu <installing-standalone-flocker>`.
20 | 


--------------------------------------------------------------------------------
/docs/flocker-standalone/configuring-nodes-storage.rst:
--------------------------------------------------------------------------------
 1 | .. _configuring-nodes-backends-standalone-flocker:
 2 | 
 3 | ==========================================
 4 | Configuring the Nodes and Storage Backends
 5 | ==========================================
 6 | 
 7 | .. include:: ../installation/configuring-nodes-storage.rst
 8 |    :start-after: .. begin-body-nodeconfig-agent-yml
 9 |    :end-before: .. end-body-nodeconfig-agent-yml
10 | 
11 | Next Step
12 | =========
13 | 
14 | .. raw:: html
15 | 
16 |    <a href="enabling-agent-service.html" class="button">Enable the Flocker Agent Service</a>
17 |    <br/><br/>
18 | 
19 | Or, :ref:`return to the installation menu <installing-standalone-flocker>`.
20 | 


--------------------------------------------------------------------------------
/docs/flocker-standalone/enabling-agent-service.rst:
--------------------------------------------------------------------------------
 1 | .. _enabling-agent-service-standalone-flocker:
 2 | 
 3 | ==================================
 4 | Enabling the Flocker Agent Service
 5 | ==================================
 6 | 
 7 | .. include:: ../installation/enabling-agent-service.rst
 8 |    :start-after: .. begin-body-enable-agent-intro
 9 |    :end-before: .. end-body-enable-agent-intro
10 | 
11 | .. include:: ../installation/enabling-agent-service.rst
12 |    :start-after: .. begin-body-enable-agent-other
13 |    :end-before: .. end-body-enable-agent-other
14 | 
15 | This completes the manual installation and configuration of Flocker.
16 | 


--------------------------------------------------------------------------------
/docs/flocker-standalone/enabling-control-service.rst:
--------------------------------------------------------------------------------
 1 | .. _enabling-control-service-standalone-flocker:
 2 | 
 3 | ====================================
 4 | Enabling the Flocker Control Service 
 5 | ====================================
 6 | 
 7 | .. include:: ../installation/enabling-control-service.rst
 8 |    :start-after: .. begin-body
 9 |    :end-before: .. end-body
10 | 
11 | Next Step
12 | =========
13 | 
14 | .. raw:: html
15 | 
16 |    <a href="configuring-nodes-storage.html" class="button">Configure the Nodes and Storage Backends</a>
17 |    <br/><br/>
18 | 
19 | Or, :ref:`return to the installation menu <installing-standalone-flocker>`.
20 | 


--------------------------------------------------------------------------------
/docs/flocker-standalone/generate-api-certificates.rst:
--------------------------------------------------------------------------------
 1 | .. _generate-api-standalone-flocker:
 2 | 
 3 | ====================================
 4 | Generating an API Client Certificate
 5 | ====================================
 6 | 
 7 | .. include:: ../installation/generate-api-certificates.rst
 8 |    :start-after: .. begin-body
 9 |    :end-before: .. end-body
10 | 
11 | Next Step
12 | =========
13 | 
14 | .. raw:: html
15 | 
16 |    <a href="enabling-control-service.html" class="button">Enable the Flocker Control Service</a>
17 |    <br/><br/>
18 | 
19 | Or, :ref:`return to the installation menu <installing-standalone-flocker>`.
20 | 


--------------------------------------------------------------------------------
/docs/flocker-standalone/index.rst:
--------------------------------------------------------------------------------
 1 | .. _flocker-standalone:
 2 | 
 3 | =============
 4 | Other Systems
 5 | =============
 6 | 
 7 | Flocker can be used with other systems by integrating them with the :ref:`api`.
 8 | 
 9 | If you are interested in integrating Flocker with other systems, we would love to hear from you.
10 | Please :ref:`talk-to-us`!
11 | 
12 | Flocker Installation Options
13 | ============================
14 | 
15 | .. raw:: html
16 | 
17 |     <div class="pods-eq">
18 |             <div class="pod-boxout pod-boxout--2up pod-boxout--short">
19 |                    <span>Install Flocker manually
20 |            <em><a href="../supported/index.html">Works with all Supported Configurations</a></em></span>
21 |            </span>
22 |                      <a href="manual-install.html" class="button">Install Manually</a>
23 |             </div>
24 |         </div>
25 | 
26 | .. the following causes the toctree to be hidden on page but not in the navigation, meaning that when on the linked page, the navigation shows you where you are, which is crucial for UX.
27 | 
28 | .. raw:: html
29 | 
30 |    <style>
31 |    .toctree-wrapper { display: none; }
32 |    </style>
33 | 
34 | .. toctree::
35 | 
36 |    manual-install
37 | 


--------------------------------------------------------------------------------
/docs/flocker-standalone/manual-install.rst:
--------------------------------------------------------------------------------
 1 | .. _installing-standalone-flocker:
 2 | 
 3 | ===========================
 4 | Manually Installing Flocker
 5 | ===========================
 6 | 
 7 | #. :ref:`Install Flocker <full-installation-standalone-flocker>`. 
 8 |    Follow these steps to install Flocker.
 9 | #. :ref:`Configure Flocker <post-installation-configuration-standalone-flocker>`.
10 |    Follow these steps to configure authentication and your chosen backend.
11 |    You will also enable the control service and the agent services. 
12 | 
13 | .. _full-installation-standalone-flocker:
14 | 
15 | .. include:: ../installation/index.rst
16 |    :start-after: .. begin-body-full-installation
17 |    :end-before: .. end-body-full-installation
18 | 
19 | .. toctree::
20 |    :maxdepth: 2
21 | 
22 |    install-client
23 |    install-node
24 | 
25 | .. toctree::
26 |    :hidden:
27 |    
28 |    setup-aws
29 |    setup-gce
30 |    setup-rackspace
31 | 
32 | .. _post-installation-configuration-standalone-flocker:
33 | 
34 | .. include:: ../installation/index.rst
35 |    :start-after: .. begin-body-configuring-flocker
36 |    :end-before: .. end-body-configuring-flocker
37 | 
38 | .. toctree::
39 |    :maxdepth: 2
40 | 
41 |    configuring-authentication
42 |    generate-api-certificates
43 |    enabling-control-service
44 |    configuring-nodes-storage
45 |    enabling-agent-service
46 | 


--------------------------------------------------------------------------------
/docs/flocker-standalone/setup-aws.rst:
--------------------------------------------------------------------------------
 1 | .. _aws-install-standalone-flocker:
 2 | 
 3 | ==========================================
 4 | Setting Up Nodes Using Amazon Web Services
 5 | ==========================================
 6 | 
 7 | .. include:: ../installation/setup-aws.rst
 8 |    :start-after: .. begin-body
 9 |    :end-before: .. end-body
10 | 
11 | Next Step
12 | =========
13 | 
14 | Return to the installation instructions specific to your operating system to install ``clusterhq-flocker-node`` on each node in your cluster:
15 | 
16 | .. raw:: html
17 | 
18 |    <br/><a href="install-node.html#centos-7-install-flocker" class="button">Installing on CentOS 7</a>
19 |    <a href="install-node.html#ubuntu-16-04-install-flocker" class="button">Installing on Ubuntu 16.04</a>
20 |    <a href="install-node.html#ubuntu-14-04-install-flocker" class="button">Installing on Ubuntu 14.04</a>
21 |    <br/><br/>
22 | 
23 | Or, :ref:`return to the installation menu <installing-standalone-flocker>`.
24 | 


--------------------------------------------------------------------------------
/docs/flocker-standalone/setup-gce.rst:
--------------------------------------------------------------------------------
 1 | .. _gce-install-standalone-flocker:
 2 | 
 3 | ============================================
 4 | Setting Up Nodes Using Google Compute Engine
 5 | ============================================
 6 | 
 7 | .. include:: ../installation/setup-gce.rst
 8 |    :start-after: .. begin-body
 9 |    :end-before: .. end-body
10 | 
11 | Next Step
12 | =========
13 | 
14 | Return to the installation instructions specific to your operating system to install ``clusterhq-flocker-node`` on each node in your cluster:
15 | 
16 | .. raw:: html
17 | 
18 |    <br/><a href="install-node.html#centos-7-install-flocker" class="button">Installing on CentOS 7</a>
19 |    <a href="install-node.html#ubuntu-16-04-install-flocker" class="button">Installing on Ubuntu 16.04</a>
20 |    <a href="install-node.html#ubuntu-14-04-install-flocker" class="button">Installing on Ubuntu 14.04</a>
21 |    <br/><br/>
22 | 
23 | Or, :ref:`return to the installation menu <installing-standalone-flocker>`.
24 | 


--------------------------------------------------------------------------------
/docs/flocker-standalone/setup-rackspace.rst:
--------------------------------------------------------------------------------
 1 | .. _rackspace-install-standalone-flocker:
 2 | 
 3 | ================================
 4 | Setting Up Nodes Using Rackspace
 5 | ================================
 6 | 
 7 | .. include:: ../installation/setup-rackspace.rst
 8 |    :start-after: .. begin-body
 9 |    :end-before: .. end-body
10 | 
11 | Next Step
12 | =========
13 | 
14 | Return to the installation instructions specific to your operating system to install ``clusterhq-flocker-node`` on each node in your cluster:
15 | 
16 | .. raw:: html
17 | 
18 |    <br/><a href="install-node.html#centos-7-install-flocker" class="button">Installing on CentOS 7</a>
19 |    <a href="install-node.html#ubuntu-16-04-install-flocker" class="button">Installing on Ubuntu 16.04</a>
20 |    <a href="install-node.html#ubuntu-14-04-install-flocker" class="button">Installing on Ubuntu 14.04</a>
21 |    <br/><br/>
22 | 
23 | Or, :ref:`return to the installation menu <installing-standalone-flocker>`.
24 | 


--------------------------------------------------------------------------------
/docs/gettinginvolved/authors.rst:
--------------------------------------------------------------------------------
1 | =======
2 | Authors
3 | =======
4 | 
5 | .. ifconfig:: not is_spelling_check
6 | 
7 |    .. include:: ../../AUTHORS.rst
8 | 


--------------------------------------------------------------------------------
/docs/gettinginvolved/index.rst:
--------------------------------------------------------------------------------
 1 | .. _getting-involved:
 2 | 
 3 | ================
 4 | Getting Involved
 5 | ================
 6 | 
 7 | .. toctree::
 8 |    :maxdepth: 2
 9 | 
10 |    contributing
11 |    plugins/index
12 |    acceptance-testing
13 |    functional-testing
14 |    cluster-setup
15 |    benchmarking
16 |    client-testing
17 |    infrastructure/index
18 |    authors
19 | 


--------------------------------------------------------------------------------
/docs/gettinginvolved/infrastructure/index.rst:
--------------------------------------------------------------------------------
 1 | Infrastructure
 2 | ==============
 3 | 
 4 | Contents:
 5 | 
 6 | .. toctree::
 7 |    :maxdepth: 2
 8 | 
 9 |    packaging
10 |    release-process
11 |    release-schedule-versioning
12 |    documentation
13 |    maintaining-cloudformation
14 | 


--------------------------------------------------------------------------------
/docs/gettinginvolved/plugins/prereqs.rst:
--------------------------------------------------------------------------------
 1 | .. _build-flocker-driver-prereq:
 2 | 
 3 | ===================================
 4 | Prerequisites For Building a Driver
 5 | ===================================
 6 | 
 7 | When contributing a new Flocker storage driver, you will need to consider the following prerequisites:
 8 | 
 9 | * Your driver needs support for storing metadata for each volume on the storage backend.
10 | * The driver needs a way to programmatically map a compute instance ID to the input format expected by your storage backend for the attach operation.
11 |   For example, if you have a 2 node compute+storage cluster on AWS, and your storage solution refers to the compute nodes as ``aws1`` and ``aws2``, your driver running on ``aws1`` would need to be able to find out its compute instance name as ``aws1``, not ``i-1cf275d9`` (which is the EC2 naming convention).
12 | * The driver needs a way to request default storage features like compression, data deduplication, IOPs, and SSD/HDD while creating a volume.
13 | * Optional - Please consider adding driver logs for debugging.


--------------------------------------------------------------------------------
/docs/images/3rd-party.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/3rd-party.png


--------------------------------------------------------------------------------
/docs/images/AWS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/AWS.png


--------------------------------------------------------------------------------
/docs/images/GCE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/GCE.png


--------------------------------------------------------------------------------
/docs/images/Untitled-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/Untitled-2.png


--------------------------------------------------------------------------------
/docs/images/amazon-docker2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/amazon-docker2x.png


--------------------------------------------------------------------------------
/docs/images/amazon2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/amazon2x.png


--------------------------------------------------------------------------------
/docs/images/apache-mesos-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/apache-mesos-logo.png


--------------------------------------------------------------------------------
/docs/images/centos.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/centos.png


--------------------------------------------------------------------------------
/docs/images/ceph.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/ceph.png


--------------------------------------------------------------------------------
/docs/images/client-swarmhost.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/client-swarmhost.png


--------------------------------------------------------------------------------
/docs/images/cloudformation.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/cloudformation.png


--------------------------------------------------------------------------------
/docs/images/coming-soon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/coming-soon.png


--------------------------------------------------------------------------------
/docs/images/convergeio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/convergeio.png


--------------------------------------------------------------------------------
/docs/images/coreos.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/coreos.png


--------------------------------------------------------------------------------
/docs/images/default2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/default2x.png


--------------------------------------------------------------------------------
/docs/images/dell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/dell.png


--------------------------------------------------------------------------------
/docs/images/docker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/docker.png


--------------------------------------------------------------------------------
/docs/images/docker2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/docker2.png


--------------------------------------------------------------------------------
/docs/images/docker2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/docker2x.png


--------------------------------------------------------------------------------
/docs/images/emc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/emc.png


--------------------------------------------------------------------------------
/docs/images/experimental.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/experimental.png


--------------------------------------------------------------------------------
/docs/images/flocker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/flocker.png


--------------------------------------------------------------------------------
/docs/images/flockerctl-status.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/flockerctl-status.png


--------------------------------------------------------------------------------
/docs/images/gce2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/gce2x.png


--------------------------------------------------------------------------------
/docs/images/hedvig.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/hedvig.png


--------------------------------------------------------------------------------
/docs/images/high-level-flocker-architecture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/high-level-flocker-architecture.png


--------------------------------------------------------------------------------
/docs/images/huawei.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/huawei.png


--------------------------------------------------------------------------------
/docs/images/icon-docker2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/icon-docker2x.png


--------------------------------------------------------------------------------
/docs/images/icon-kubernetes2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/icon-kubernetes2x.png


--------------------------------------------------------------------------------
/docs/images/icon-mesos2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/icon-mesos2x.png


--------------------------------------------------------------------------------
/docs/images/icon-question2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/icon-question2x.png


--------------------------------------------------------------------------------
/docs/images/installer-swarm-compose/01-keys-menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/installer-swarm-compose/01-keys-menu.png


--------------------------------------------------------------------------------
/docs/images/installer-swarm-compose/02-create-key.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/installer-swarm-compose/02-create-key.png


--------------------------------------------------------------------------------
/docs/images/installer-swarm-compose/03-pem-downloaded.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/installer-swarm-compose/03-pem-downloaded.png


--------------------------------------------------------------------------------
/docs/images/installer-swarm-compose/10-cloudformation-firstpage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/installer-swarm-compose/10-cloudformation-firstpage.png


--------------------------------------------------------------------------------
/docs/images/installer-swarm-compose/11-cloudformation-stackname.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/installer-swarm-compose/11-cloudformation-stackname.png


--------------------------------------------------------------------------------
/docs/images/installer-swarm-compose/12-cloudformation-settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/installer-swarm-compose/12-cloudformation-settings.png


--------------------------------------------------------------------------------
/docs/images/installer-swarm-compose/13-cloudformation-create.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/installer-swarm-compose/13-cloudformation-create.png


--------------------------------------------------------------------------------
/docs/images/installer-swarm-compose/21-refresh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/installer-swarm-compose/21-refresh.png


--------------------------------------------------------------------------------
/docs/images/installer-swarm-compose/22-create-in-progress.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/installer-swarm-compose/22-create-in-progress.png


--------------------------------------------------------------------------------
/docs/images/installer-swarm-compose/23-create-complete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/installer-swarm-compose/23-create-complete.png


--------------------------------------------------------------------------------
/docs/images/installer-swarm-compose/31-stack-outputs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/installer-swarm-compose/31-stack-outputs.png


--------------------------------------------------------------------------------
/docs/images/installer-swarm-compose/32-volume-hub-verification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/installer-swarm-compose/32-volume-hub-verification.png


--------------------------------------------------------------------------------
/docs/images/kettle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/kettle.png


--------------------------------------------------------------------------------
/docs/images/keypair.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/keypair.png


--------------------------------------------------------------------------------
/docs/images/kubernetes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/kubernetes.png


--------------------------------------------------------------------------------
/docs/images/kubernetes2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/kubernetes2x.png


--------------------------------------------------------------------------------
/docs/images/mesos-rancher-logos.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/mesos-rancher-logos.png


--------------------------------------------------------------------------------
/docs/images/mesos.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/mesos.png


--------------------------------------------------------------------------------
/docs/images/mesos2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/mesos2x.png


--------------------------------------------------------------------------------
/docs/images/mesosphere.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/mesosphere.png


--------------------------------------------------------------------------------
/docs/images/netapp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/netapp.png


--------------------------------------------------------------------------------
/docs/images/nexenta.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/nexenta.png


--------------------------------------------------------------------------------
/docs/images/node1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/node1.png


--------------------------------------------------------------------------------
/docs/images/node2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/node2.png


--------------------------------------------------------------------------------
/docs/images/open-vstorage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/open-vstorage.png


--------------------------------------------------------------------------------
/docs/images/open_in_new_window.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/open_in_new_window.png


--------------------------------------------------------------------------------
/docs/images/openstack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/openstack.png


--------------------------------------------------------------------------------
/docs/images/openstack2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/openstack2x.png


--------------------------------------------------------------------------------
/docs/images/parameters.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/parameters.png


--------------------------------------------------------------------------------
/docs/images/questionmark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/questionmark.png


--------------------------------------------------------------------------------
/docs/images/rhel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/rhel.png


--------------------------------------------------------------------------------
/docs/images/saratoga.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/saratoga.png


--------------------------------------------------------------------------------
/docs/images/scaleio.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/scaleio.jpeg


--------------------------------------------------------------------------------
/docs/images/stack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/stack.png


--------------------------------------------------------------------------------
/docs/images/swarm-status.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/swarm-status.png


--------------------------------------------------------------------------------
/docs/images/ubuntu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/ubuntu.png


--------------------------------------------------------------------------------
/docs/images/vmware.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/vmware.png


--------------------------------------------------------------------------------
/docs/images/vmware2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/vmware2x.png


--------------------------------------------------------------------------------
/docs/images/volumes-gui-screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/docs/images/volumes-gui-screenshot.png


--------------------------------------------------------------------------------
/docs/installation/linux-install.sh.template:
--------------------------------------------------------------------------------
 1 | #!/bin/sh
 2 | 
 3 | # Create a virtualenv, an isolated Python environment, in a new directory called
 4 | # "flocker-tutorial":
 5 | virtualenv --python=/usr/bin/python2.7 flocker-tutorial
 6 | 
 7 | # Upgrade the pip Python package manager to its latest version inside the
 8 | # virtualenv. Some older versions of pip have issues installing Python wheel
 9 | # packages.
10 | flocker-tutorial/bin/pip install --upgrade pip
11 | 
12 | # Install flocker-cli and dependencies inside the virtualenv:
13 | echo "Installing Flocker and dependencies, this may take a few minutes with no output to the terminal..."
14 | flocker-tutorial/bin/pip install --quiet https://clusterhq-archive.s3.amazonaws.com/python/Flocker-|latest-installable|-py2-none-any.whl
15 | echo "Done!"
16 | 


--------------------------------------------------------------------------------
/docs/installation/setup-rackspace.rst:
--------------------------------------------------------------------------------
 1 | .. Single Source Instructions
 2 | 
 3 | ================================
 4 | Setting Up Nodes Using Rackspace
 5 | ================================
 6 | 
 7 | .. begin-body
 8 | 
 9 | You can get a Flocker cluster running using Rackspace.
10 | You'll need to setup at least two nodes.
11 | 
12 | #. Create a new cloud server:
13 | 
14 |    * Visit https://mycloud.rackspace.com.
15 |    * Click "Create Server".
16 |    * Choose a supported Linux distribution (either RHEL 7, CentOS 7, Ubuntu 16.04 or Ubuntu 14.04) as your image.
17 |    * Choose a Flavor.
18 |      We recommend at least "8 GB General Purpose v1".
19 |    * Add your SSH key.
20 | 
21 | #. SSH in:
22 | 
23 |    You can find the IP in the Server Details page after each node is created:
24 | 
25 |    .. prompt:: bash alice@mercury:~$
26 | 
27 |       ssh root@203.0.113.109
28 | 
29 | .. end-body
30 | 


--------------------------------------------------------------------------------
/docs/kubernetes-integration/about.rst:
--------------------------------------------------------------------------------
 1 | .. _about-kubernetes-integration:
 2 | 
 3 | ================================
 4 | About the Kubernetes Integration
 5 | ================================
 6 | 
 7 | Kubernetes 1.1 and later has native support for Flocker volumes.
 8 | 
 9 | See `Kubernetes Flocker docs <http://kubernetes.io/docs/user-guide/volumes/#flocker>`_ for more details and example usage.
10 | 
11 | .. _concepts-kubernetes-integration:
12 | 
13 | Concepts
14 | ========
15 | 
16 | Flocker Volumes
17 | ---------------
18 | 
19 | Flocker volumes represent actual underlying storage, typically allocated from IaaS block device provider, such as EBS.
20 | They have names, sizes, profiles and metadata.
21 | 


--------------------------------------------------------------------------------
/docs/kubernetes-integration/configuring-authentication.rst:
--------------------------------------------------------------------------------
 1 | .. _authentication-kubernetes:
 2 | 
 3 | ==================================
 4 | Configuring Cluster Authentication
 5 | ==================================
 6 | 
 7 | .. include:: ../installation/configuring-authentication.rst
 8 |    :start-after: .. begin-body-config-authentication
 9 |    :end-before: .. end-body-config-authentication
10 | 
11 | Next Step
12 | =========
13 | 
14 | .. raw:: html
15 | 
16 |    <a href="generate-api-certificates.html" class="button">Generate an API Client Certificate</a>
17 |    <br/><br/>
18 | 
19 | Or, :ref:`return to the installation menu <installing-flocker-with-kubernetes>`.
20 | 


--------------------------------------------------------------------------------
/docs/kubernetes-integration/configuring-nodes-storage.rst:
--------------------------------------------------------------------------------
 1 | .. _configuring-nodes-backends-kubernetes:
 2 | 
 3 | ==========================================
 4 | Configuring the Nodes and Storage Backends
 5 | ==========================================
 6 | 
 7 | .. include:: ../installation/configuring-nodes-storage.rst
 8 |    :start-after: .. begin-body-nodeconfig-agent-yml
 9 |    :end-before: .. end-body-nodeconfig-agent-yml
10 | 
11 | Next Step
12 | =========
13 | 
14 | .. raw:: html
15 | 
16 |    <a href="enabling-agent-service.html" class="button">Enable the Flocker Agent Service</a>
17 |    <br/><br/>
18 | 
19 | Or, :ref:`return to the installation menu <installing-flocker-with-kubernetes>`.
20 | 


--------------------------------------------------------------------------------
/docs/kubernetes-integration/enabling-agent-service.rst:
--------------------------------------------------------------------------------
 1 | .. _enabling-agent-service-kubernetes:
 2 | 
 3 | ==================================
 4 | Enabling the Flocker Agent Service
 5 | ==================================
 6 | 
 7 | .. include:: ../installation/enabling-agent-service.rst
 8 |    :start-after: .. begin-body-enable-agent-intro
 9 |    :end-before: .. end-body-enable-agent-intro
10 | 
11 | .. include:: ../installation/enabling-agent-service.rst
12 |    :start-after: .. begin-body-enable-agent-other
13 |    :end-before: .. end-body-enable-agent-other
14 | 
15 | Next Step
16 | =========
17 | 
18 | This completes the manual installation of Flocker for an integration with Kubernetes.
19 | 
20 | The next step is to install Kubernetes.
21 | Click the button below to open the Kubernetes installation instructions - this will open in a new window:
22 | 
23 | .. raw:: html
24 | 
25 |    <br/>
26 |    <a href="http://kubernetes.io/gettingstarted/" class="button" target="blank">Install Kubernetes</a>
27 |    <br/><br/>
28 | 
29 | Or, :ref:`return to the installation menu <installing-flocker-with-kubernetes>`.
30 | 


--------------------------------------------------------------------------------
/docs/kubernetes-integration/enabling-control-service.rst:
--------------------------------------------------------------------------------
 1 | .. _enabling-control-service-kubernetes:
 2 | 
 3 | ====================================
 4 | Enabling the Flocker Control Service 
 5 | ====================================
 6 | 
 7 | .. include:: ../installation/enabling-control-service.rst
 8 |    :start-after: .. begin-body
 9 |    :end-before: .. end-body
10 | 
11 | Next Step
12 | =========
13 | 
14 | .. raw:: html
15 | 
16 |    <a href="configuring-nodes-storage.html" class="button">Configure the Nodes and Storage Backends</a>
17 |    <br/><br/>
18 | 
19 | Or, :ref:`return to the installation menu <installing-flocker-with-kubernetes>`.
20 | 


--------------------------------------------------------------------------------
/docs/kubernetes-integration/generate-api-certificates.rst:
--------------------------------------------------------------------------------
 1 | .. _generate-api-kubernetes:
 2 | 
 3 | ====================================
 4 | Generating an API Client Certificate
 5 | ====================================
 6 | 
 7 | .. include:: ../installation/generate-api-certificates.rst
 8 |    :start-after: .. begin-body
 9 |    :end-before: .. end-body
10 | 
11 | Next Step
12 | =========
13 | 
14 | .. raw:: html
15 | 
16 |    <a href="enabling-control-service.html" class="button">Enable the Flocker Control Service</a>
17 |    <br/><br/>
18 | 
19 | Or, :ref:`return to the installation menu <installing-flocker-with-kubernetes>`.
20 | 


--------------------------------------------------------------------------------
/docs/kubernetes-integration/setup-aws.rst:
--------------------------------------------------------------------------------
 1 | .. _aws-install-kubernetes:
 2 | 
 3 | ==========================================
 4 | Setting Up Nodes Using Amazon Web Services
 5 | ==========================================
 6 | 
 7 | .. include:: ../installation/setup-aws.rst
 8 |    :start-after: .. begin-body
 9 |    :end-before: .. end-body
10 | 
11 | Next Step
12 | =========
13 | 
14 | Return to the installation instructions specific to your operating system to install ``clusterhq-flocker-node`` on each node in your cluster:
15 | 
16 | .. raw:: html
17 | 
18 |    <br/><a href="install-node.html#centos-7-install-docker" class="button">Installing on CentOS 7</a>
19 |    <a href="install-node.html#ubuntu-14-04-install-docker" class="button">Installing on Ubuntu 14.04</a>
20 |    <br/><br/>
21 | 
22 | Or, :ref:`return to the installation menu <installing-flocker-with-kubernetes>`.
23 | 


--------------------------------------------------------------------------------
/docs/kubernetes-integration/setup-gce.rst:
--------------------------------------------------------------------------------
 1 | .. _gce-install-kubernetes:
 2 | 
 3 | ============================================
 4 | Setting Up Nodes Using Google Compute Engine
 5 | ============================================
 6 | 
 7 | .. include:: ../installation/setup-gce.rst
 8 |    :start-after: .. begin-body
 9 |    :end-before: .. end-body
10 | 
11 | Next Step
12 | =========
13 | 
14 | Return to the installation instructions specific to your operating system to install ``clusterhq-flocker-node`` on each node in your cluster:
15 | 
16 | .. raw:: html
17 | 
18 |    <br/><a href="install-node.html#centos-7-install-docker" class="button">Installing on CentOS 7</a>
19 |    <a href="install-node.html#ubuntu-14-04-install-docker" class="button">Installing on Ubuntu 14.04</a>
20 |    <br/><br/>
21 | 
22 | Or, :ref:`return to the installation menu <installing-flocker-with-kubernetes>`.
23 | 


--------------------------------------------------------------------------------
/docs/kubernetes-integration/setup-rackspace.rst:
--------------------------------------------------------------------------------
 1 | .. _rackspace-install-kubernetes:
 2 | 
 3 | ================================
 4 | Setting Up Nodes Using Rackspace
 5 | ================================
 6 | 
 7 | .. include:: ../installation/setup-rackspace.rst
 8 |    :start-after: .. begin-body
 9 |    :end-before: .. end-body
10 | 
11 | Next Step
12 | =========
13 | 
14 | Return to the installation instructions specific to your operating system to install ``clusterhq-flocker-node`` on each node in your cluster:
15 | 
16 | .. raw:: html
17 | 
18 |    <br/><a href="install-node.html#centos-7-install-kubernetes" class="button">Installing on CentOS 7</a>
19 |    <a href="install-node.html#ubuntu-14-06-install-kubernetes" class="button">Installing on Ubuntu 16.04</a>
20 |    <a href="install-node.html#ubuntu-14-04-install-kubernetes" class="button">Installing on Ubuntu 14.04</a>
21 |    <br/><br/>
22 | 
23 | Or, :ref:`return to the installation menu <installing-flocker-with-kubernetes>`.
24 | 


--------------------------------------------------------------------------------
/docs/reference/leases.rst:
--------------------------------------------------------------------------------
 1 | .. _leases:
 2 | 
 3 | ==============
 4 | Flocker Leases
 5 | ==============
 6 | 
 7 | .. begin-body
 8 | 
 9 | Leases prevent multiple applications from requesting the same dataset on different nodes at the same time.
10 | 
11 | .. end-body
12 | 
13 | Requesting Leases
14 | =================
15 | 
16 | Leases are accessed via the :ref:`api` exposed by the Flocker control service, however most users will interact with leases through the :ref:`plugin`, which will handle requesting leases for you.
17 | 
18 | Acquiring and Releasing Leases
19 | ==============================
20 | 
21 | After a dataset has been moved to a node, an application can acquire a lease for that dataset.
22 | While the lease is active, any other requests for that dataset on a different node will be rejected with an error.
23 | When an application no longer requires a dataset it can **release** the lease.
24 | 
25 | Leases can be released by any user of the API, so if an application does not release a lease, it can be released manually.
26 | 
27 | Lease Expiration
28 | ================
29 | 
30 | Leases can be configured to expire after a given time.
31 | Before that time has passed, a lease can be refreshed with a new expiration time.
32 | 


--------------------------------------------------------------------------------
/docs/version.rst:
--------------------------------------------------------------------------------
1 | |version|
2 | 


--------------------------------------------------------------------------------
/flocker/__init__.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Flocker is an open-source container data volume manager for your
 5 | Dockerized applications.
 6 | """
 7 | 
 8 | from ._version import get_versions
 9 | 
10 | # Default port for REST API:
11 | REST_API_PORT = 4523
12 | 
13 | 
14 | def _suppress_warnings():
15 |     """
16 |     Suppress warnings when not running under trial.
17 |     """
18 |     import warnings
19 |     import sys
20 |     import os
21 |     if os.path.basename(sys.argv[0]) != "trial":
22 |         warnings.simplefilter("ignore")
23 | _suppress_warnings()
24 | del _suppress_warnings
25 | 
26 | 
27 | __version__ = get_versions()['version']
28 | del get_versions
29 | 
30 | 
31 | def _redirect_eliot_logs_for_trial():
32 |     """
33 |     Enable Eliot logging to the ``_trial/test.log`` file.
34 | 
35 |     This wrapper function allows flocker/__version__.py to be imported by
36 |     packaging tools without them having to install all the Flocker Eliot
37 |     dependencies.
38 |     """
39 |     import os
40 |     import sys
41 |     if os.path.basename(sys.argv[0]) == "trial":
42 |         from eliot.twisted import redirectLogsForTrial
43 |         redirectLogsForTrial()
44 | _redirect_eliot_logs_for_trial()
45 | del _redirect_eliot_logs_for_trial
46 | 


--------------------------------------------------------------------------------
/flocker/acceptance/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """
4 | Acceptance tests for ``flocker``.
5 | """
6 | 


--------------------------------------------------------------------------------
/flocker/acceptance/endtoend/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """
4 | Tests for the end-to-end internal operation of the Flocker cluster.
5 | 
6 | In particular this does not cover testing interactions with external systems.
7 | """
8 | 


--------------------------------------------------------------------------------
/flocker/acceptance/integration/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """
4 | Tests that run a full Flocker cluster with external software.
5 | """
6 | 


--------------------------------------------------------------------------------
/flocker/acceptance/node_scripts/__init__.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Python scripts to be run on nodes as part of tests.
 5 | """
 6 | 
 7 | from twisted.python.filepath import FilePath
 8 | 
 9 | 
10 | # Directory where scripts are stored:
11 | SCRIPTS = FilePath(__file__).parent()
12 | 
13 | 
14 | __all__ = ["SCRIPTS"]
15 | 


--------------------------------------------------------------------------------
/flocker/acceptance/node_scripts/disable_service.py:
--------------------------------------------------------------------------------
 1 | """
 2 | Stop a service and disable across reboots.
 3 | """
 4 | 
 5 | import sys
 6 | from subprocess import check_call, check_output, CalledProcessError
 7 | 
 8 | service = sys.argv[1]
 9 | 
10 | try:
11 |     check_output(["systemctl", "--version"])
12 | except (CalledProcessError, OSError):
13 |     systemd_system = False
14 | else:
15 |     systemd_system = True
16 | 
17 | if systemd_system:
18 |     check_call(["systemctl", "disable", service])
19 |     check_call(["systemctl", "stop", service])
20 | else:
21 |     # Ubuntu 14.04
22 |     override = "/etc/init/%s.override" % (service,)
23 |     with file(override, "w") as f:
24 |         f.write("manual\n")
25 |     if 'stop/waiting' not in check_output(["service", service, "status"]):
26 |         check_call(["service", service, "stop"])
27 | 


--------------------------------------------------------------------------------
/flocker/acceptance/node_scripts/enable_service.py:
--------------------------------------------------------------------------------
 1 | """
 2 | Start a service and enable across reboots.
 3 | """
 4 | 
 5 | import os
 6 | import sys
 7 | from subprocess import check_call, check_output, CalledProcessError
 8 | 
 9 | service = sys.argv[1]
10 | 
11 | try:
12 |     check_output(["systemctl", "--version"])
13 | except (CalledProcessError, OSError):
14 |     systemd_system = False
15 | else:
16 |     systemd_system = True
17 | 
18 | if systemd_system:
19 |     check_call(["systemctl", "enable", service])
20 |     check_call(["systemctl", "start", service])
21 | else:
22 |     # Ubuntu 14.04
23 |     override = "/etc/init/%s.override" % (service,)
24 |     if os.path.exists(override):
25 |         os.remove(override)
26 |     # `service <service-name> start` isn't idempotent.
27 |     # `service <service-name> status` will display the status in a format that
28 |     # looks like `<service-name> <goal>/<state>` possibly followed by a PID.
29 |     # If the service is running, the goal will be `start` and the state will be
30 |     # `running`.
31 |     if 'start/running' not in check_output(["service", service, "status"]):
32 |         check_call(["service", service, "start"])
33 | 


--------------------------------------------------------------------------------
/flocker/acceptance/node_scripts/service_running.py:
--------------------------------------------------------------------------------
 1 | """
 2 | Check if a service is running
 3 | """
 4 | 
 5 | # TODO: maybe check if it is enabled as well.
 6 | 
 7 | import sys
 8 | from subprocess import check_output, CalledProcessError
 9 | 
10 | service = sys.argv[1]
11 | 
12 | try:
13 |     check_output(["systemctl", "--version"])
14 | except (CalledProcessError, OSError):
15 |     systemd_system = False
16 | else:
17 |     systemd_system = True
18 | 
19 | if systemd_system:
20 |     if "active (running)" not in \
21 |        check_output(["systemctl", "status", service]):
22 |         sys.exit(1)
23 | else:
24 |     if 'start/running' not in check_output(["service", service, "status"]):
25 |         sys.exit(1)
26 | 


--------------------------------------------------------------------------------
/flocker/acceptance/obsolete/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """
4 | Acceptance tests for ``flocker`` components that are either deprecated
5 | or planned for deprecation in the near future.
6 | """
7 | 


--------------------------------------------------------------------------------
/flocker/acceptance/scripts/__init__.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Python scripts to be run in containers as part of tests.
 5 | """
 6 | 
 7 | from twisted.python.filepath import FilePath
 8 | 
 9 | 
10 | # Directory where scripts are stored:
11 | SCRIPTS = FilePath(__file__).parent()
12 | 
13 | 
14 | __all__ = ["SCRIPTS"]
15 | 


--------------------------------------------------------------------------------
/flocker/acceptance/scripts/envhttp.py:
--------------------------------------------------------------------------------
 1 | """
 2 | HTTP server that returns its environment variables as JSON.
 3 | """
 4 | 
 5 | from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
 6 | from json import dumps
 7 | from os import environ
 8 | 
 9 | 
10 | class Handler(BaseHTTPRequestHandler):
11 |     """
12 |     Return the current environment in HTTP response.
13 |     """
14 |     def do_GET(s):
15 |         s.send_response(200)
16 |         s.send_header("content-type", "text/json")
17 |         s.end_headers()
18 |         s.wfile.write(dumps(environ.items()))
19 |         s.wfile.close()
20 | 
21 | 
22 | httpd = HTTPServer((b"0.0.0.0", 8080), Handler)
23 | httpd.serve_forever()
24 | 


--------------------------------------------------------------------------------
/flocker/acceptance/scripts/exitinghttp.py:
--------------------------------------------------------------------------------
 1 | """
 2 | HTTP server that exits after responding to a GET request.
 3 | """
 4 | 
 5 | from os import urandom
 6 | 
 7 | from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
 8 | 
 9 | PROCESS_UNIQUE_VALUE = urandom(32).encode("hex")
10 | 
11 | 
12 | class Handler(BaseHTTPRequestHandler):
13 |     def do_GET(s):
14 |         s.send_response(200)
15 |         s.send_header(
16 |             b"content-length",
17 |             u"{}".format(len(PROCESS_UNIQUE_VALUE)).encode("ascii")
18 |         )
19 |         s.end_headers()
20 |         s.wfile.write(PROCESS_UNIQUE_VALUE)
21 |         s.wfile.flush()
22 |         s.wfile.close()
23 | 
24 | httpd = HTTPServer((b"0.0.0.0", 8080), Handler)
25 | httpd.handle_request()
26 | 


--------------------------------------------------------------------------------
/flocker/acceptance/scripts/hellohttp.py:
--------------------------------------------------------------------------------
 1 | """
 2 | HTTP server that returns a fixed string.
 3 | """
 4 | 
 5 | from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
 6 | 
 7 | 
 8 | class Handler(BaseHTTPRequestHandler):
 9 |     def do_GET(s):
10 |         s.send_response(200)
11 |         s.end_headers()
12 |         s.wfile.write(b"hi")
13 |         s.wfile.close()
14 | 
15 | httpd = HTTPServer((b"0.0.0.0", 8080), Handler)
16 | httpd.serve_forever()
17 | 


--------------------------------------------------------------------------------
/flocker/acceptance/scripts/nonrootwritehttp.py:
--------------------------------------------------------------------------------
 1 | """
 2 | HTTP server that ensures it can write to given directory as a non-root
 3 | user, then returns "hi".
 4 | """
 5 | 
 6 | from sys import argv
 7 | from os import setuid
 8 | from pwd import getpwnam
 9 | from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
10 | 
11 | 
12 | class Handler(BaseHTTPRequestHandler):
13 |     def do_GET(s):
14 |         s.send_response(200)
15 |         s.end_headers()
16 |         # Ensure we can write to given directory:
17 |         try:
18 |             with open(argv[1] + "/test", "w") as f:
19 |                 f.write(b"testing 123")
20 |         except Exception as e:
21 |             s.wfile.write(str(e.__class__) + ": " + str(e))
22 |         else:
23 |             s.wfile.write(b"hi")
24 |         s.wfile.close()
25 | 
26 | setuid(getpwnam("nobody")[2])
27 | httpd = HTTPServer((b"0.0.0.0", 8080), Handler)
28 | httpd.serve_forever()
29 | 


--------------------------------------------------------------------------------
/flocker/acceptance/scripts/proxyhttp.py:
--------------------------------------------------------------------------------
 1 | """
 2 | HTTP server that proxies requests to a remote server based on Docker
 3 | linking environment variables.
 4 | """
 5 | 
 6 | from urllib import urlopen
 7 | from os import getenv
 8 | from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
 9 | 
10 | DEST_URL = "http://%s:%s/" % (
11 |     getenv("DEST_PORT_80_TCP_ADDR"), getenv("DEST_PORT_80_TCP_PORT"))
12 | 
13 | 
14 | class Handler(BaseHTTPRequestHandler):
15 |     def do_GET(s):
16 |         s.send_response(200)
17 |         s.end_headers()
18 |         s.wfile.write(urlopen(DEST_URL).read())
19 |         s.wfile.close()
20 | 
21 | 
22 | httpd = HTTPServer((b"0.0.0.0", 8081), Handler)
23 | httpd.serve_forever()
24 | 


--------------------------------------------------------------------------------
/flocker/acceptance/scripts/remember_boot_id.py:
--------------------------------------------------------------------------------
 1 | """
 2 | HTTP server that reports both current and previously recorded boot_id,
 3 | the latter stored persistently on disk.
 4 | """
 5 | 
 6 | from sys import argv
 7 | from json import dumps
 8 | import os
 9 | 
10 | from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
11 | 
12 | 
13 | # Try to write out file ASAP, to increase chances of hitting race
14 | # condition with dataset setup:
15 | with file("/proc/sys/kernel/random/boot_id") as boot_f:
16 |     boot_id = boot_f.read()
17 | 
18 | file_path = os.path.join(argv[1], "written.json")
19 | if not os.path.exists(file_path):
20 |     with file(file_path, "w") as f:
21 |         f.write(boot_id)
22 | written = file(file_path).read()
23 | 
24 | 
25 | class Handler(BaseHTTPRequestHandler):
26 |     def do_GET(self):
27 |         self.send_response(200)
28 |         self.end_headers()
29 |         self.wfile.write(dumps({"current": boot_id,
30 |                                 "written": written}))
31 |         self.wfile.close()
32 | 
33 | 
34 | httpd = HTTPServer((b"0.0.0.0", 8080), Handler)
35 | httpd.serve_forever()
36 | 


--------------------------------------------------------------------------------
/flocker/acceptance/test/__init__.py:
--------------------------------------------------------------------------------
1 | """
2 | Tests for flocker.acceptance.
3 | """
4 | 


--------------------------------------------------------------------------------
/flocker/apiclient/__init__.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Client for the Flocker REST API.
 5 | 
 6 | This may eventually be a standalone package.
 7 | """
 8 | 
 9 | from ._client import (
10 |     IFlockerAPIV1Client, FakeFlockerClient, Dataset, DatasetState,
11 |     DatasetAlreadyExists, FlockerClient, Lease, LeaseAlreadyHeld,
12 |     conditional_create, DatasetsConfiguration, Node, MountedDataset,
13 | )
14 | 
15 | __all__ = ["IFlockerAPIV1Client", "FakeFlockerClient", "Dataset",
16 |            "DatasetState", "DatasetAlreadyExists", "FlockerClient",
17 |            "Lease", "LeaseAlreadyHeld", "conditional_create",
18 |            "DatasetsConfiguration", "Node", "MountedDataset", ]
19 | 


--------------------------------------------------------------------------------
/flocker/apiclient/test/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """
4 | Test package for the Flocker REST API client.
5 | """
6 | 


--------------------------------------------------------------------------------
/flocker/ca/__init__.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | A minimal certificate authority.
 5 | """
 6 | 
 7 | from ._ca import (
 8 |     RootCredential, ControlCredential, NodeCredential, UserCredential,
 9 |     ComparableKeyPair, PathError, CertificateAlreadyExistsError,
10 |     KeyAlreadyExistsError, EXPIRY_20_YEARS,
11 |     AUTHORITY_CERTIFICATE_FILENAME, AUTHORITY_KEY_FILENAME,
12 | )
13 | 
14 | from ._validation import (
15 |     amp_server_context_factory, rest_api_context_factory, ControlServicePolicy,
16 |     treq_with_authentication,
17 | )
18 | 
19 | __all__ = [
20 |     "RootCredential", "ControlCredential", "NodeCredential", "UserCredential",
21 |     "ComparableKeyPair", "PathError", "CertificateAlreadyExistsError",
22 |     "KeyAlreadyExistsError", "EXPIRY_20_YEARS",
23 |     "AUTHORITY_CERTIFICATE_FILENAME", "AUTHORITY_KEY_FILENAME",
24 |     "amp_server_context_factory", "rest_api_context_factory",
25 |     "ControlServicePolicy", "treq_with_authentication",
26 | ]
27 | 


--------------------------------------------------------------------------------
/flocker/ca/functional/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """
4 | Functional tests for ``flocker.ca``.
5 | """
6 | 


--------------------------------------------------------------------------------
/flocker/ca/test/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """
4 | Tests for ``flocker.ca``.
5 | """
6 | 


--------------------------------------------------------------------------------
/flocker/cli/__init__.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | The Flocker command line interface.
 5 | """
 6 | 
 7 | from ._sshconfig import configure_ssh
 8 | 
 9 | __all__ = ["configure_ssh"]
10 | 


--------------------------------------------------------------------------------
/flocker/cli/functional/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """
4 | Functional tests for the command line interface to Flocker.
5 | """
6 | 


--------------------------------------------------------------------------------
/flocker/common/functional/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ClusterHQ/flocker/eaa586248986d7cd681c99c948546c2b507e44de/flocker/common/functional/__init__.py


--------------------------------------------------------------------------------
/flocker/common/functional/test_era.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Functional tests for ``flocker-node-era`` command.
 5 | """
 6 | 
 7 | from unittest import skipUnless
 8 | from subprocess import check_output
 9 | 
10 | from twisted.python.procutils import which
11 | from twisted.python.runtime import platform
12 | 
13 | from .._era import get_era
14 | from ...testtools import make_script_tests
15 | 
16 | EXECUTABLE = b"flocker-node-era"
17 | 
18 | 
19 | class FlockerNodeEraTests(make_script_tests(EXECUTABLE)):
20 |     """
21 |     Tests for ``flocker-node-era``.
22 |     """
23 |     @skipUnless(which(EXECUTABLE), EXECUTABLE + " not installed")
24 |     @skipUnless(platform.isLinux(), "flocker-node-era only works on Linux")
25 |     def setUp(self):
26 |         super(FlockerNodeEraTests, self).setUp()
27 | 
28 |     def test_output(self):
29 |         """
30 |         The process outputs the same information as ``get_era()``.
31 |         """
32 |         self.assertEqual(check_output(EXECUTABLE),
33 |                          str(get_era()))
34 | 
35 |     def test_repeatable_output(self):
36 |         """
37 |         The process outputs the same information when called multiple times,
38 |         since it shoudl only change on reboot.
39 |         """
40 |         self.assertEqual(check_output(EXECUTABLE),
41 |                          check_output(EXECUTABLE))
42 | 


--------------------------------------------------------------------------------
/flocker/common/test/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """
4 | Tests for shared flocker components.
5 | """
6 | 


--------------------------------------------------------------------------------
/flocker/common/test/test_era.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Tests for ``flocker.common._era``.
 5 | """
 6 | 
 7 | from uuid import UUID
 8 | from unittest import skipUnless
 9 | 
10 | from twisted.python.runtime import platform
11 | from .._era import get_era
12 | from ...testtools import TestCase
13 | 
14 | 
15 | class EraTests(TestCase):
16 |     """
17 |     Tests for ``get_era``
18 |     """
19 |     @skipUnless(platform.isLinux(), "get_era() only supported on Linux.")
20 |     def setUp(self):
21 |         super(EraTests, self).setUp()
22 | 
23 |     def test_get_era(self):
24 |         """
25 |         The era is the current unique ``boot_id``.
26 | 
27 |         This rather duplicates the implementation, but can't do much
28 |         better.
29 |         """
30 |         with open("/proc/sys/kernel/random/boot_id") as f:
31 |             self.assertEqual(get_era(),
32 |                              UUID(hex=f.read().strip()))
33 | 
34 |     def test_repeated(self):
35 |         """
36 |         Repeated calls give the same result.
37 |         """
38 |         values = set(get_era() for i in range(100))
39 |         self.assertEqual(len(values), 1)
40 | 


--------------------------------------------------------------------------------
/flocker/control/functional/__init__.py:
--------------------------------------------------------------------------------
1 | """
2 | Functional tests for ``flocker.control``.
3 | """
4 | 


--------------------------------------------------------------------------------
/flocker/control/functional/test_script.py:
--------------------------------------------------------------------------------
 1 | """
 2 | Functional tests for ``flocker.control.script``.
 3 | """
 4 | 
 5 | from ...testtools import make_script_tests
 6 | 
 7 | 
 8 | class FlockerControlTests(make_script_tests(b"flocker-control")):
 9 |     """
10 |     Tests for ``flocker-control``.
11 |     """
12 | 


--------------------------------------------------------------------------------
/flocker/control/test/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """
4 | Tests for ``flocker.control``.
5 | """
6 | 


--------------------------------------------------------------------------------
/flocker/control/test/clusterstatetools.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Helpers for testing ``flocker.control._clusterstate`` interactions.
 5 | """
 6 | 
 7 | from .._clusterstate import EXPIRATION_TIME
 8 | 
 9 | 
10 | def advance_some(clock):
11 |     """
12 |     Move the clock forward by a little time.  Much less than
13 |     ``EXPIRATION_TIME``.
14 |     """
15 |     clock.advance(1)
16 | 
17 | 
18 | def advance_rest(clock):
19 |     """
20 |     Move the clock forward by a lot of time.  Enough to reach
21 |     ``EXPIRATION_TIME`` if ``advance_some`` is also used.
22 |     """
23 |     clock.advance(EXPIRATION_TIME.total_seconds() - 1)
24 | 


--------------------------------------------------------------------------------
/flocker/control/test/configurations/configuration_1_v1.json:
--------------------------------------------------------------------------------
1 | {"nodes": [{"applications": [{"volume": {"mountpoint": {"path": "/xxx/yyy", "$__class__
quot;: "FilePath"}, "$__class__
quot;: "AttachedVolume", "manifestation": {"$__class__
quot;: "Manifestation", "primary": true, "dataset": {"deleted": false, "dataset_id": "4e7e3241-0ec3-4df6-9e7c-3f7e75e08855", "$__class__
quot;: "Dataset", "maximum_size": null, "metadata": {"values": [["name", "myapp"]], "$__class__
quot;: "PMap"}}}}, "name": "myapp", "links": [], "memory_limit": null, "command_line": null, "image": {"tag": "7.6", "repository": "postgresql", "$__class__
quot;: "DockerImage"}, "$__class__
quot;: "Application", "restart_policy": {"$__class__
quot;: "RestartNever"}, "environment": {"values": [], "$__class__
quot;: "PMap"}, "running": true, "ports": [], "cpu_shares": null}], "manifestations": {"values": [["4e7e3241-0ec3-4df6-9e7c-3f7e75e08855", {"$__class__
quot;: "Manifestation", "primary": true, "dataset": {"deleted": false, "dataset_id": "4e7e3241-0ec3-4df6-9e7c-3f7e75e08855", "$__class__
quot;: "Dataset", "maximum_size": null, "metadata": {"values": [["name", "myapp"]], "$__class__
quot;: "PMap"}}}]], "$__class__
quot;: "PMap"}, "uuid": {"hex": "ab294ce4-a6c3-40cb-a0a2-484a1f09521c", "$__class__
quot;: "UUID"}, "$__class__
quot;: "Node"}], "$__class__
quot;: "Deployment"}
2 | 


--------------------------------------------------------------------------------
/flocker/control/test/configurations/configuration_1_v2.json:
--------------------------------------------------------------------------------
1 | {"$__class__
quot;: "Configuration", "version": 2, "deployment": {"nodes": [{"applications": [{"volume": {"mountpoint": {"path": "/xxx/yyy", "$__class__
quot;: "FilePath"}, "$__class__
quot;: "AttachedVolume", "manifestation": {"$__class__
quot;: "Manifestation", "primary": true, "dataset": {"deleted": false, "dataset_id": "4e7e3241-0ec3-4df6-9e7c-3f7e75e08855", "$__class__
quot;: "Dataset", "maximum_size": null, "metadata": {"values": [["name", "myapp"]], "$__class__
quot;: "PMap"}}}}, "name": "myapp", "links": [], "memory_limit": null, "command_line": null, "image": {"tag": "7.6", "repository": "postgresql", "$__class__
quot;: "DockerImage"}, "$__class__
quot;: "Application", "restart_policy": {"$__class__
quot;: "RestartNever"}, "environment": {"values": [], "$__class__
quot;: "PMap"}, "running": true, "ports": [], "cpu_shares": null}], "manifestations": {"values": [["4e7e3241-0ec3-4df6-9e7c-3f7e75e08855", {"$__class__
quot;: "Manifestation", "primary": true, "dataset": {"deleted": false, "dataset_id": "4e7e3241-0ec3-4df6-9e7c-3f7e75e08855", "$__class__
quot;: "Dataset", "maximum_size": null, "metadata": {"values": [["name", "myapp"]], "$__class__
quot;: "PMap"}}}]], "$__class__
quot;: "PMap"}, "uuid": {"hex": "ab294ce4-a6c3-40cb-a0a2-484a1f09521c", "$__class__
quot;: "UUID"}, "$__class__
quot;: "Node"}], "$__class__
quot;: "Deployment"}}


--------------------------------------------------------------------------------
/flocker/control/test/configurations/configuration_1_v3.json:
--------------------------------------------------------------------------------
1 | {"$__class__
quot;: "Configuration", "version": 3, "deployment": {"nodes": [{"applications": [{"volume": {"mountpoint": {"path": "/xxx/yyy", "$__class__
quot;: "FilePath"}, "$__class__
quot;: "AttachedVolume", "manifestation": {"$__class__
quot;: "Manifestation", "primary": true, "dataset": {"deleted": false, "dataset_id": "4e7e3241-0ec3-4df6-9e7c-3f7e75e08855", "$__class__
quot;: "Dataset", "maximum_size": null, "metadata": {"values": [["name", "myapp"]], "$__class__
quot;: "PMap"}}}}, "name": "myapp", "links": [], "memory_limit": null, "command_line": null, "image": {"tag": "7.6", "repository": "postgresql", "$__class__
quot;: "DockerImage"}, "$__class__
quot;: "Application", "restart_policy": {"$__class__
quot;: "RestartNever"}, "environment": {"values": [], "$__class__
quot;: "PMap"}, "running": true, "ports": [], "cpu_shares": null}], "manifestations": {"values": [["4e7e3241-0ec3-4df6-9e7c-3f7e75e08855", {"$__class__
quot;: "Manifestation", "primary": true, "dataset": {"deleted": false, "dataset_id": "4e7e3241-0ec3-4df6-9e7c-3f7e75e08855", "$__class__
quot;: "Dataset", "maximum_size": null, "metadata": {"values": [["name", "myapp"]], "$__class__
quot;: "PMap"}}}]], "$__class__
quot;: "PMap"}, "uuid": {"hex": "ab294ce4-a6c3-40cb-a0a2-484a1f09521c", "$__class__
quot;: "UUID"}, "$__class__
quot;: "Node"}], "leases": {"values": [], "$__class__
quot;: "PMap"}, "$__class__
quot;: "Deployment"}}
2 | 


--------------------------------------------------------------------------------
/flocker/control/test/configurations/configuration_v1.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | # Generate a v1 configuration.
 4 | # Commit Hash: 7bd476e2fdc7353018ff1fc446b9b4c76e7c7c17
 5 | 
 6 | from flocker.control._persistence import wire_encode
 7 | from flocker.control.test.test_persistence import TEST_DEPLOYMENT_1
 8 | 
 9 | if __name__ == "__main__":
10 |     print wire_encode(TEST_DEPLOYMENT_1)
11 | 


--------------------------------------------------------------------------------
/flocker/control/test/configurations/configuration_v2.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | # Generate a v2 configuration.
 4 | # Commit Hash: 9db24de578a3dfa3bfbbbac8e000d30da0a2ae48
 5 | 
 6 | from flocker.control._model import Configuration
 7 | from flocker.control._persistence import wire_encode
 8 | from flocker.control.test.test_persistence import TEST_DEPLOYMENT_1
 9 | 
10 | if __name__ == "__main__":
11 |     print wire_encode(Configuration(version=2, deployment=TEST_DEPLOYMENT_1))
12 | 


--------------------------------------------------------------------------------
/flocker/control/test/configurations/configuration_v3.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | # Generate a v3 configuration.
 4 | # Hash to recreate: 26ad636ace668dbbfd224fbcd19041af31db80da
 5 | 
 6 | from flocker.control._model import Configuration
 7 | from flocker.control._persistence import wire_encode
 8 | from flocker.control.test.test_persistence import TEST_DEPLOYMENT_1
 9 | 
10 | if __name__ == "__main__":
11 |     print wire_encode(Configuration(version=3, deployment=TEST_DEPLOYMENT_1))
12 | 


--------------------------------------------------------------------------------
/flocker/control/test/configurations/configuration_v4.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | # Generate a v4 configuration.
 4 | # Hash to recreate: 90c95c82febaceda87aed770923b284fc71f0e3f
 5 | 
 6 | from twisted.python.filepath import FilePath
 7 | 
 8 | from flocker.control._model import Configuration
 9 | from flocker.control._persistence import wire_encode
10 | from flocker.control.test.test_persistence import TEST_DEPLOYMENTS
11 | 
12 | _VERSION = 4
13 | 
14 | if __name__ == "__main__":
15 |     myfile = FilePath(__file__)
16 |     for i, deployment in enumerate(TEST_DEPLOYMENTS, start=1):
17 |         encoding = wire_encode(
18 |             Configuration(version=_VERSION, deployment=deployment)
19 |         )
20 |         myfile.sibling(
21 |             b"configuration_%d_v%d.json" % (i, _VERSION)
22 |         ).setContent(encoding)
23 | 


--------------------------------------------------------------------------------
/flocker/control/test/configurations/configuration_v5.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | # Generate a v5 configuration.
 4 | # Hash to recreate: 1ce62d2dc43d631954d7583c574259e89997829e
 5 | 
 6 | from twisted.python.filepath import FilePath
 7 | 
 8 | from flocker.control._model import Configuration
 9 | from flocker.control._persistence import wire_encode
10 | from flocker.control.test.test_persistence import TEST_DEPLOYMENTS
11 | 
12 | _VERSION = 5
13 | 
14 | if __name__ == "__main__":
15 |     myfile = FilePath(__file__)
16 |     for i, deployment in enumerate(TEST_DEPLOYMENTS, start=1):
17 |         encoding = wire_encode(
18 |             Configuration(version=_VERSION, deployment=deployment)
19 |         )
20 |         myfile.sibling(
21 |             b"configuration_%d_v%d.json" % (i, _VERSION)
22 |         ).setContent(encoding)
23 | 


--------------------------------------------------------------------------------
/flocker/control/test/test_registry.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Tests for :py:class:`flocker.control._registry`.
 5 | """
 6 | 
 7 | from ..testtools import make_istatepersister_tests, InMemoryStatePersister
 8 | 
 9 | 
10 | def make_inmemorystatepersister(test_case):
11 |     """
12 |     Create a ``InMemoryStatePersister`` for use in tests.
13 | 
14 |     :return: ``tuple`` of ``IStatePersiter`` and 0-argument callable returning
15 |     a ``PersistentState``.
16 |     """
17 |     state_persister = InMemoryStatePersister()
18 |     return state_persister, state_persister.get_state
19 | 
20 | 
21 | class InMemoryStatePersisterTests(
22 |     make_istatepersister_tests(make_inmemorystatepersister)
23 | ):
24 |     """
25 |     Tests for ``InMemoryStatePersister``.
26 |     """
27 | 


--------------------------------------------------------------------------------
/flocker/dockerplugin/__init__.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Docker plugin allowing use of Flocker to manage Docker volumes.
 5 | 
 6 | This may eventually be a standalone package.
 7 | """
 8 | 
 9 | from twisted.internet.address import UNIXAddress
10 | 
11 | # Many places in both twisted.web and Klein are unhappy with listening on
12 | # Unix socket, e.g.  https://twistedmatrix.com/trac/ticket/5406.  The
13 | # Docker plugin needs to listen using a Unix socket, so "fix" that by
14 | # pretending we have a port number and host. Yes, I feel guilty.
15 | UNIXAddress.port = 0
16 | UNIXAddress.host = b"127.0.0.1"
17 | del UNIXAddress
18 | 


--------------------------------------------------------------------------------
/flocker/dockerplugin/schema/types.yml:
--------------------------------------------------------------------------------
 1 | $schema: http://json-schema.org/draft-04/schema#
 2 | id: http://api.clusterhq.com/dockerplugin/types.json
 3 | definitions:
 4 |   Err:
 5 |     title: "Error response"
 6 |     description: "Non-empty string indicates error."
 7 |     type:
 8 |       - "string"
 9 | 
10 |   VolumeInspect:
11 |     title: "Volume info"
12 |     description: "Volume information for Get and List."
13 |     type: object
14 |     properties:
15 |       Mountpoint:
16 |         type: string
17 |       Name:
18 |         type: string
19 |     required:
20 |       - "Mountpoint"
21 |       - "Name"
22 |     additionalProperties: false
23 | 


--------------------------------------------------------------------------------
/flocker/dockerplugin/test/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """
4 | Unit tests for the Docker plugin.
5 | """
6 | 


--------------------------------------------------------------------------------
/flocker/docs/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """
4 | Sphinx extensions for flocker.
5 | Components for Flocker documentation.
6 | """
7 | 


--------------------------------------------------------------------------------
/flocker/docs/bootstrap/__init__.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Sphinx extensions exposing Bootstrap.js constructs.
 5 | """
 6 | 
 7 | from ._extension import setup, HTMLWriter
 8 | 
 9 | __all__ = ["setup", "HTMLWriter"]
10 | 


--------------------------------------------------------------------------------
/flocker/docs/bootstrap/_logo.py:
--------------------------------------------------------------------------------
 1 | 
 2 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 3 | 
 4 | """
 5 | Logo directive
 6 | """
 7 | 
 8 | from textwrap import dedent
 9 | 
10 | from docutils import nodes
11 | from docutils.parsers.rst import Directive
12 | 
13 | 
14 | class logo(nodes.General, nodes.Element):
15 |     pass
16 | 
17 | 
18 | def visit_html_logo(self, node):
19 |     self.body.append(dedent("""\
20 |     <div class="flocker-logo pull-right"></div>
21 |     """))
22 | 
23 | 
24 | def depart_html_logo(self, node):
25 |     pass
26 | 
27 | 
28 | class LogoDirective(Directive):
29 |     """
30 |     Implementation of the C{tabs} directive.
31 |     """
32 | 
33 |     has_content = False
34 | 
35 |     def run(self):
36 |         node = logo()
37 |         text = self.content
38 |         self.state.nested_parse(text, self.content_offset, node,
39 |                                 match_titles=True)
40 | 
41 |         self.state.document.settings.record_dependencies.add(__file__)
42 |         return [node]
43 | 
44 | 
45 | def setup(app):
46 |     """
47 |     Entry point for sphinx extension.
48 |     """
49 |     app.add_node(logo,
50 |                  html=(visit_html_logo, depart_html_logo))
51 |     app.add_directive('logo', LogoDirective)
52 | 


--------------------------------------------------------------------------------
/flocker/docs/test/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """
4 | Tests for components for Flocker documentation.
5 | """
6 | 


--------------------------------------------------------------------------------
/flocker/node/__init__.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Local node manager for Flocker.
 5 | """
 6 | 
 7 | from ._change import (
 8 |     IStateChange, in_parallel, sequentially, run_state_change, NoOp,
 9 | )
10 | 
11 | from ._deploy import (
12 |     IDeployer,
13 |     ILocalState,
14 |     NodeLocalState,
15 | )
16 | from ._container import ApplicationNodeDeployer, NOOP_SLEEP_TIME
17 | from ._p2p import P2PManifestationDeployer
18 | 
19 | from .backends import BackendDescription
20 | from .script import DeployerType
21 | 
22 | from ._docker import dockerpy_client
23 | 
24 | 
25 | __all__ = [
26 |     'IDeployer', 'ILocalState', 'NodeLocalState', 'IStateChange',
27 |     'NoOp', 'NOOP_SLEEP_TIME',
28 |     'P2PManifestationDeployer',
29 |     'ApplicationNodeDeployer',
30 |     'run_state_change', 'in_parallel', 'sequentially',
31 |     'BackendDescription', 'DeployerType',
32 | 
33 |     'dockerpy_client',
34 | ]
35 | 


--------------------------------------------------------------------------------
/flocker/node/agents/__init__.py:
--------------------------------------------------------------------------------
1 | """
2 | This package contains backend-specific agent implementations.
3 | """
4 | 


--------------------------------------------------------------------------------
/flocker/node/agents/functional/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """
4 | This package contains functional tests for ``flocker.node.agent``.
5 | """
6 | 


--------------------------------------------------------------------------------
/flocker/node/agents/functional/logging.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | from eliot import Field, MessageType
 4 | 
 5 | CINDER_VOLUME = MessageType(
 6 |     u"flocker:functional:cinder:cinder_volume:created",
 7 |     [Field.for_types(
 8 |         u"id", [bytes, unicode],
 9 |         u"The Cinder-assigned unique identifier for the volume that was "
10 |         u"created.",
11 |     )],
12 | )
13 | 


--------------------------------------------------------------------------------
/flocker/node/agents/test/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """
4 | Tests for ``flocker.node.agents``.
5 | """
6 | 


--------------------------------------------------------------------------------
/flocker/node/agents/test/strategies.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Ltd.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Hypothesis strategies for testing ``flocker.node.agents``.
 5 | """
 6 | 
 7 | from hypothesis.strategies import (
 8 |     builds,
 9 |     integers,
10 |     none,
11 |     text,
12 |     uuids,
13 | )
14 | 
15 | from ..blockdevice import BlockDeviceVolume
16 | 
17 | blockdevice_volumes = builds(
18 |     BlockDeviceVolume,
19 |     blockdevice_id=text(),
20 |     size=integers(min_value=0),
21 |     attached_to=text() | none(),
22 |     dataset_id=uuids(),
23 | )
24 | 


--------------------------------------------------------------------------------
/flocker/node/agents/test/test_loopback.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Tests for ``flocker.node.agents.loopback``.
 5 | """
 6 | from ..loopback import Losetup, LOOPBACK_MINIMUM_ALLOCATABLE_SIZE
 7 | 
 8 | from ....testtools import TestCase, if_root
 9 | 
10 | 
11 | class LosetupTests(TestCase):
12 |     """
13 |     Tests for ``Losetup``.
14 |     """
15 |     @if_root
16 |     def setUp(self):
17 |         return super(LosetupTests, self).setUp()
18 | 
19 |     def test_success(self):
20 |         """
21 |         ``Losetup.add`` creates a device that is listed.
22 |         """
23 |         loop = Losetup()
24 |         backing_file = self.make_temporary_file()
25 |         with backing_file.open('wb') as f:
26 |             f.truncate(LOOPBACK_MINIMUM_ALLOCATABLE_SIZE)
27 | 
28 |         device = loop.add(backing_file)
29 |         self.addCleanup(device.remove)
30 |         self.assertIn(device, loop.list())
31 | 


--------------------------------------------------------------------------------
/flocker/node/exceptions.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | from twisted.python.constants import NamedConstant
 4 | 
 5 | 
 6 | class StorageInitializationError(Exception):
 7 |     """
 8 |     Exception raised by a storage API factory in the event that
 9 |     the backend could not be successfully initialized.
10 | 
11 |     :param NamedConstant code: The ``StorageInitializationError`` constant
12 |         indicating the type of failure.
13 |     """
14 |     CONFIGURATION_ERROR = NamedConstant()
15 |     OPERATIVE_ERROR = NamedConstant()
16 | 
17 |     def __init__(self, code, *args):
18 |         Exception.__init__(self, *args)
19 |         self.code = code
20 | 


--------------------------------------------------------------------------------
/flocker/node/functional/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """Functional tests for :module:`flocker.node`."""
4 | 


--------------------------------------------------------------------------------
/flocker/node/functional/env-docker/Dockerfile:
--------------------------------------------------------------------------------
1 | # Docker image that writes out the provided environment to /data/env and then
2 | # exits. Existence of the file /data/env indicates the file is fully written.
3 | FROM busybox
4 | CMD ["/bin/sh",  "-c", "env > /data/temp && mv /data/temp /data/env"]
5 | 


--------------------------------------------------------------------------------
/flocker/node/functional/retry-docker/Dockerfile:
--------------------------------------------------------------------------------
 1 | # Docker image that keeps a count of the number of times it has been run
 2 | # in /data/count.
 3 | FROM python:2.7-slim
 4 | VOLUME /data
 5 | WORKDIR /data
 6 | 
 7 | ADD run /usr/local/bin/run
 8 | # If installed via wheel, the installed file will not have +x set.
 9 | RUN ["chmod", "+x", "/usr/local/bin/run"]
10 | 
11 | CMD ["/usr/local/bin/run"]
12 | 


--------------------------------------------------------------------------------
/flocker/node/functional/retry-docker/run:
--------------------------------------------------------------------------------
 1 | #!/usr/bin/env python
 2 | 
 3 | import sys
 4 | import os
 5 | import time
 6 | 
 7 | mode = os.environ["mode"]
 8 | 
 9 | 
10 | def sleep_forever():
11 |     while True:
12 |         time.sleep(3600)
13 | 
14 | 
15 | def mark_done():
16 |     with open('marker', "w") as f:
17 |         f.write("done")
18 | 
19 | 
20 | with open('count', 'r') as f:
21 |     count = int(f.read())
22 | 
23 | count += 1
24 | 
25 | with open('count', 'w') as f:
26 |     f.write("%d" % (count,))
27 | 
28 | if mode == "failure":
29 |     # Always exit with failure
30 |     sys.exit(1)
31 | elif mode == "success-then-sleep":
32 |     # Exit with success then sleep forever
33 |     if count == 1:
34 |         sys.exit(0)
35 |     else:
36 |         mark_done()
37 |         sleep_forever()
38 | elif mode == "failure-then-success":
39 |     # Exit with failure then success
40 |     if count == 1:
41 |         sys.exit(1)
42 |     else:
43 |         sys.exit(0)
44 | 


--------------------------------------------------------------------------------
/flocker/node/functional/sendbytes-docker/Dockerfile.in:
--------------------------------------------------------------------------------
1 | FROM busybox
2 | MAINTAINER ClusterHQ <support@clusterhq.com>
3 | ADD . /
4 | # If installed via wheel, the installed file will not have +x set.
5 | RUN ["chmod", "+x", "/run.sh"]
6 | CMD ["/bin/sh",  "-e", "run.sh", "{host}", "{port}", "{bytes}", "{timeout}"]
7 | 


--------------------------------------------------------------------------------
/flocker/node/functional/test_script.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Functional tests for the agent command line programs.
 5 | """
 6 | 
 7 | from ...testtools import make_script_tests
 8 | 
 9 | 
10 | class FlockerDatasetAgentTests(make_script_tests(b"flocker-dataset-agent")):
11 |     """
12 |     Tests for ``flocker-dataset-agent``.
13 |     """
14 | 
15 | 
16 | class FlockerContainerAgentTests(
17 |         make_script_tests(b"flocker-container-agent")):
18 |     """
19 |     Tests for ``flocker-container-agent``.
20 |     """
21 | 
22 | 
23 | class FlockerDiagnosticsTests(
24 |         make_script_tests(b"flocker-diagnostics")):
25 |     """
26 |     Tests for ``flocker-diagnostics``.
27 |     """
28 | 


--------------------------------------------------------------------------------
/flocker/node/test/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """
4 | Tests for :module:`flocker.node`.
5 | """
6 | 


--------------------------------------------------------------------------------
/flocker/node/test/dummybackend.py:
--------------------------------------------------------------------------------
 1 | """
 2 | A dummy backend plugin for flocker-dataset-agent.
 3 | """
 4 | 
 5 | from twisted.python.filepath import FilePath
 6 | 
 7 | from flocker.node import BackendDescription, DeployerType
 8 | from flocker.node.agents.loopback import LoopbackBlockDeviceAPI
 9 | 
10 | DUMMY_API = LoopbackBlockDeviceAPI(FilePath(b"/tmp/foo"), u"")
11 | 
12 | 
13 | def api_factory(cluster_id, **kwargs):
14 |     """
15 |     Factory for ``IBlockDeviceAPI``.
16 | 
17 |     :return: ``LoopbackBlockDeviceAPI`` instance.
18 |     """
19 |     # We get custom arguments from /etc/flocker/agent.yml's backend
20 |     # section:
21 |     if kwargs != {"custom": u"arguments!"}:
22 |         raise AssertionError("Didn't get correct arguments passed in")
23 |     # A real implementation would create new IBlockDeviceAPI and return it
24 |     # here, based on the given arguments:
25 |     return DUMMY_API
26 | 
27 | 
28 | # The backend provided by this plugin:
29 | FLOCKER_BACKEND = BackendDescription(
30 |     name=u"dummybackend",  # Not actually used for 3rd party plugins
31 |     needs_reactor=False, needs_cluster_id=True,
32 |     api_factory=api_factory, deployer_type=DeployerType.block)
33 | 


--------------------------------------------------------------------------------
/flocker/node/test/test_deploy.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Tests for ``flocker.node._deploy``.
 5 | """
 6 | 
 7 | from zope.interface.verify import verifyObject
 8 | 
 9 | from ..testtools import EMPTY_NODE_STATE
10 | from ...testtools import TestCase
11 | 
12 | from .._deploy import ILocalState, NodeLocalState
13 | 
14 | 
15 | class NodeLocalStateTests(TestCase):
16 |     """
17 |     Tests for ``NodeLocalState``
18 |     """
19 | 
20 |     def test_ilocalstate(self):
21 |         """
22 |         ``NodeLocalState`` instances provide ``ILocalState``
23 |         """
24 |         self.assertTrue(
25 |             verifyObject(ILocalState,
26 |                          NodeLocalState(node_state=EMPTY_NODE_STATE))
27 |         )
28 | 
29 |     def test_node_state_reported(self):
30 |         """
31 |         ``NodeLocalState`` should return the node_state in a tuple when
32 |         shared_state_changes() is called.
33 |         """
34 |         node_state = EMPTY_NODE_STATE
35 |         object_under_test = NodeLocalState(node_state=node_state)
36 |         self.assertEqual((node_state,),
37 |                          object_under_test.shared_state_changes())
38 | 


--------------------------------------------------------------------------------
/flocker/node/test/test_diagnostics.py:
--------------------------------------------------------------------------------
 1 | import json
 2 | from unittest import skipUnless
 3 | 
 4 | from twisted.python.procutils import which
 5 | 
 6 | from flocker.node.diagnostics import list_hardware
 7 | from flocker.testtools import TestCase
 8 | 
 9 | 
10 | class ListHardwareTests(TestCase):
11 | 
12 |     @skipUnless(which('lshw'), 'Tests require the ``lshw`` command.')
13 |     def test_list_hardware(self):
14 |         """
15 |         ``list_hardware`` returns valid JSON.
16 |         """
17 |         json.loads(list_hardware())
18 | 


--------------------------------------------------------------------------------
/flocker/provision/__init__.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Provisioning for acceptance tests.
 5 | """
 6 | 
 7 | from ._common import PackageSource, Variants, INode, IProvisioner
 8 | from ._install import (
 9 |     provision, configure_cluster, reinstall_flocker_from_package_source
10 | )
11 | from ._rackspace import rackspace_provisioner
12 | from ._aws import aws_provisioner
13 | from ._gce import gce_provisioner
14 | from ._ca import Certificates
15 | 
16 | CLOUD_PROVIDERS = {
17 |     'rackspace': rackspace_provisioner,
18 |     'aws': aws_provisioner,
19 |     'gce': gce_provisioner,
20 | }
21 | 
22 | __all__ = [
23 |     'PackageSource', 'Variants',
24 |     'INode', 'IProvisioner',
25 |     'provision',
26 |     'CLOUD_PROVIDERS',
27 |     'configure_cluster',
28 |     'Certificates',
29 |     'reinstall_flocker_from_package_source',
30 | ]
31 | 


--------------------------------------------------------------------------------
/flocker/provision/_ssh/__init__.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | from ._model import (
 4 |     run_network_interacting_from_args, sudo_network_interacting_from_args,
 5 |     Run, run, run_from_args,
 6 |     Sudo, sudo, sudo_from_args,
 7 |     Put, put,
 8 |     Comment, comment,
 9 |     RunRemotely, run_remotely,
10 |     perform_comment, perform_put, perform_sudo
11 | )
12 | 
13 | __all__ = [
14 |     "run_network_interacting_from_args", "sudo_network_interacting_from_args",
15 |     "Run", "run", "run_from_args",
16 |     "Sudo", "sudo", "sudo_from_args",
17 |     "Put", "put",
18 |     "Comment", "comment",
19 |     "RunRemotely", "run_remotely",
20 |     "perform_comment", "perform_put", "perform_sudo",
21 | ]
22 | 
23 | try:
24 |     # for admin.packaging usage
25 |     from ._keys import (
26 |         ensure_agent_has_ssh_key,
27 |         AgentNotFound, KeyNotFound
28 |     )
29 | 
30 |     __all__ += [
31 |         "ensure_agent_has_ssh_key",
32 |         "AgentNotFound", "KeyNotFound"
33 |     ]
34 | except ImportError:
35 |     pass
36 | 


--------------------------------------------------------------------------------
/flocker/provision/_tasks.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | All the tasks available from the ``task`` directive.
 5 | """
 6 | 
 7 | from ._install import (
 8 |     task_create_flocker_pool_file,
 9 |     task_enable_docker,
10 |     task_install_flocker,
11 |     task_install_ssh_key,
12 |     task_cli_pkg_install,
13 |     task_cli_pip_prereqs,
14 |     task_cli_pip_install,
15 |     task_upgrade_kernel,
16 |     task_configure_flocker_agent,
17 |     task_enable_flocker_control,
18 |     task_enable_flocker_agent,
19 |     task_open_control_firewall,
20 |     task_install_zfs,
21 | )
22 | 
23 | __all__ = [
24 |     'task_create_flocker_pool_file',
25 |     'task_enable_docker',
26 |     'task_install_flocker',
27 |     'task_install_ssh_key',
28 |     'task_cli_pkg_install',
29 |     'task_cli_pip_prereqs',
30 |     'task_cli_pip_install',
31 |     'task_upgrade_kernel',
32 |     'task_configure_flocker_agent',
33 |     'task_enable_flocker_control',
34 |     'task_enable_flocker_agent',
35 |     'task_open_control_firewall',
36 |     'task_install_zfs',
37 | ]
38 | 


--------------------------------------------------------------------------------
/flocker/provision/test/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """
4 | Tests for ``flocker.provision``.
5 | """
6 | 


--------------------------------------------------------------------------------
/flocker/provision/test/test_common.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc. See LICENSE file for details.
 2 | 
 3 | """
 4 | Tests for common provision code.
 5 | """
 6 | 
 7 | from flocker.common.version import make_rpm_version
 8 | from flocker.provision._common import PackageSource
 9 | from flocker.testtools import TestCase
10 | 
11 | 
12 | class PackageSourceTests(TestCase):
13 |     """
14 |     Tests for ``PackageSource.os_version``.
15 |     """
16 |     def test_os_version(self):
17 |         """
18 |         os_version() returns an OS version for a FLocker version.
19 |         """
20 |         version = '1.2.3'
21 |         rpm_version = make_rpm_version(version)
22 |         expected = "%s-%s" % (rpm_version.version, rpm_version.release)
23 |         package_source = PackageSource(version=version)
24 |         self.assertEqual(expected, package_source.os_version())
25 | 
26 |     def test_version_none(self):
27 |         """
28 |         Unset version gives no OS version.
29 |         """
30 |         package_source = PackageSource()
31 |         self.assertFalse(package_source.os_version())
32 | 
33 |     def test_version_empty(self):
34 |         """
35 |         Empty version gives no OS version.  This is supported, due to
36 |         a previously undocumented behavior being useful.
37 |         """
38 |         package_source = PackageSource(version='')
39 |         self.assertFalse(package_source.os_version())
40 | 


--------------------------------------------------------------------------------
/flocker/provision/test/test_gce.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Tests for GCE provisioner.
 5 | """
 6 | 
 7 | from zope.interface.verify import verifyClass
 8 | 
 9 | from ...testtools import TestCase
10 | from .._common import IProvisioner
11 | from .._gce import GCEProvisioner
12 | 
13 | 
14 | class GCEProvisionerTests(TestCase):
15 |     """
16 |     Tests for :class:`GCEProvisioner`.
17 |     """
18 | 
19 |     def test_implements_iprovisioner(self):
20 |         """
21 |         Verify that :class:`GCEProvisioner` implements the
22 |         :class:`IProvisioner` interface.
23 |         """
24 |         verifyClass(IProvisioner, GCEProvisioner)
25 | 


--------------------------------------------------------------------------------
/flocker/restapi/__init__.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Infrastructure for publishing a REST HTTP API.
 5 | """
 6 | 
 7 | from ._infrastructure import (
 8 |     structured, EndpointResponse, user_documentation, private_api,
 9 |     )
10 | 
11 | from ._error import makeBadRequest as make_bad_request, BadRequest
12 | 
13 | 
14 | __all__ = [
15 |     "structured", "EndpointResponse", "user_documentation",
16 |     "make_bad_request", "private_api", "BadRequest",
17 | ]
18 | 


--------------------------------------------------------------------------------
/flocker/restapi/_logging.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | This module defines the Eliot log events emitted by the API implementation.
 5 | """
 6 | 
 7 | from eliot import Field, ActionType
 8 | 
 9 | __all__ = [
10 |     "REQUEST",
11 |     ]
12 | 
13 | LOG_SYSTEM = u"api"
14 | 
15 | METHOD = Field(u"method", lambda method: method,
16 |                u"The HTTP method of the request.")
17 | REQUEST_PATH = Field(
18 |     u"request_path", lambda path: path,
19 |     u"The absolute path of the resource to which the request was issued.")
20 | JSON = Field.forTypes(
21 |     u"json", [unicode, bytes, dict, list, None, bool, float],
22 |     u"The JSON request body.")
23 | RESPONSE_CODE = Field.forTypes(
24 |     u"code", [int],
25 |     u"The response code for the request.")
26 | 
27 | 
28 | # It would be nice if RESPONSE_CODE was in REQUEST; see FLOC-1586.
29 | REQUEST = ActionType(
30 |     LOG_SYSTEM + u":request",
31 |     [REQUEST_PATH, METHOD],
32 |     [],
33 |     u"A request was received on the public HTTP interface.")
34 | 


--------------------------------------------------------------------------------
/flocker/restapi/docs/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | """
3 | Sphinx extensions to document APIs created with ``flocker.restapi``.
4 | """
5 | 


--------------------------------------------------------------------------------
/flocker/restapi/docs/test/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | """
3 | Tests for `flocker.restapi.docs`.
4 | """
5 | 


--------------------------------------------------------------------------------
/flocker/restapi/test/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | """
3 | Tests for ``flocker.restapi``.
4 | """
5 | 


--------------------------------------------------------------------------------
/flocker/test/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """
4 | Tests for top-level ``flocker`` package.
5 | """
6 | 


--------------------------------------------------------------------------------
/flocker/test/test_flocker.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Tests for top-level ``flocker`` package.
 5 | """
 6 | 
 7 | from sys import executable
 8 | from subprocess import check_output, STDOUT
 9 | 
10 | from twisted.python.filepath import FilePath
11 | 
12 | import flocker
13 | from ..testtools import TestCase
14 | 
15 | 
16 | class WarningsTests(TestCase):
17 |     """
18 |     Tests for warning suppression.
19 |     """
20 |     def test_warnings_suppressed(self):
21 |         """
22 |         Warnings are suppressed for processes that import flocker.
23 |         """
24 |         root = FilePath(flocker.__file__)
25 |         result = check_output(
26 |             [executable, b"-c", (b"import flocker; import warnings; " +
27 |                                  b"warnings.warn('ohno')")],
28 |             stderr=STDOUT,
29 |             # Make sure we can import flocker package:
30 |             cwd=root.parent().parent().path)
31 |         self.assertEqual(result, b"")
32 | 


--------------------------------------------------------------------------------
/flocker/testtools/strategies.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | import string
 4 | 
 5 | from hypothesis.strategies import integers, lists, text
 6 | from twisted.python.filepath import FilePath
 7 | 
 8 | 
 9 | path_segments = (
10 |     text().
11 |     filter(lambda x: '/' not in x).
12 |     map(lambda x: x.encode('utf8')).
13 |     filter(lambda x: '\0' not in x))
14 | """
15 | Individual path segments.
16 | 
17 | These are UTF-8 encoded segments that contain neither '/' nor NULL.
18 | 
19 | e.g. 'foo', 'rc.local'.
20 | """
21 | 
22 | 
23 | paths = lists(path_segments).map(lambda ps: FilePath('/'.join(ps)))
24 | """
25 | Paths
26 | 
27 | e.g. ``FilePath('/usr/local')``, ``FilePath('foo/bar/bar')``.
28 | """
29 | 
30 | 
31 | _identifier_characters = string.ascii_letters + string.digits + '_'
32 | 
33 | 
34 | identifiers = text(
35 |     average_size=20, min_size=1, alphabet=_identifier_characters)
36 | """
37 | Python identifiers.
38 | 
39 | e.g. ``Foo``, ``bar``.
40 | """
41 | 
42 | 
43 | fqpns = lists(
44 |     identifiers, min_size=1, average_size=5).map(lambda xs: '.'.join(xs))
45 | """
46 | Fully-qualified Python names.
47 | 
48 | e.g. ``twisted.internet.defer.Deferred``, ``foo.bar.baz_qux``.
49 | """
50 | 
51 | 
52 | permissions = integers(min_value=0, max_value=07777)
53 | """
54 | Unix file permissions.
55 | """
56 | 


--------------------------------------------------------------------------------
/flocker/testtools/test/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """
4 | Tests for testtools.
5 | """
6 | 


--------------------------------------------------------------------------------
/flocker/testtools/test/test_cluster_utils.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Tests for ``flocker.testtools.cluster_utils``.
 5 | """
 6 | 
 7 | from ..cluster_utils import TestTypes, make_cluster_id, MARKER
 8 | from ...testtools import TestCase
 9 | 
10 | 
11 | class MakeClusterIdTests(TestCase):
12 |     """
13 |     Tests for ``make_cluster_id``.
14 |     """
15 |     def test_values_extracted(self):
16 |         """
17 |         The values encoded by ``make_cluster_id`` into the cluster identifier
18 |         can be extracted by ``get_cluster_id_information``.
19 |         """
20 |         cluster_id = make_cluster_id(TestTypes.ACCEPTANCE)
21 |         self.assertEqual(
22 |             (TestTypes.ACCEPTANCE.value, MARKER),
23 |             (cluster_id.clock_seq_hi_variant, cluster_id.node),
24 |         )
25 | 


--------------------------------------------------------------------------------
/flocker/volume/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """The Flocker volume manager."""
4 | 


--------------------------------------------------------------------------------
/flocker/volume/_model.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | # -*- test-case-name: flocker.volume.test.test_service -*-
 3 | 
 4 | """
 5 | Record types for representing volume models.
 6 | """
 7 | 
 8 | from characteristic import attributes
 9 | 
10 | 
11 | @attributes(["maximum_size"], apply_immutable=True)
12 | class VolumeSize(object):
13 |     """
14 |     A data volume's size.
15 | 
16 |     :ivar int maximum_size: The upper bound on the amount of data that can be
17 |         stored on this volume, in bytes.  May also be ``None`` to indicate no
18 |         particular upper bound is required (when representing desired
19 |         configuration) or known (when representing deployed configuration).
20 |     """
21 | 


--------------------------------------------------------------------------------
/flocker/volume/filesystems/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """Filesystem APIs.
4 | 
5 | Supported filesystems are expected to provide snapshotting and sending and
6 | receiving of snapshots.
7 | """
8 | 


--------------------------------------------------------------------------------
/flocker/volume/filesystems/errors.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """
 4 | Exception types that might be raised by filesystem APIs.
 5 | """
 6 | 
 7 | 
 8 | class MaximumSizeTooSmall(Exception):
 9 |     """
10 |     A maximum size was specified for a filesystem which is smaller than the
11 |     smallest allowed value.
12 |     """
13 | 


--------------------------------------------------------------------------------
/flocker/volume/functional/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
2 | 
3 | """Functional tests for the volume manager."""
4 | 


--------------------------------------------------------------------------------
/flocker/volume/functional/test_ipc.py:
--------------------------------------------------------------------------------
 1 | # Copyright ClusterHQ Inc.  See LICENSE file for details.
 2 | 
 3 | """Functional tests for IPC."""
 4 | 
 5 | from ..testtools import create_realistic_servicepair
 6 | from ..test.test_ipc import make_iremote_volume_manager
 7 | 
 8 | 
 9 | class RemoteVolumeManagerInterfaceTests(
10 |         make_iremote_volume_manager(create_realistic_servicepair)):
11 |     """
12 |     Tests for ``RemoteVolumeManger`` as a ``IRemoteVolumeManager``.
13 |     """
14 | 


--------------------------------------------------------------------------------
/flocker/volume/test/__init__.py:
--------------------------------------------------------------------------------
1 | """
2 | Tests for the Flocker volume manager.
3 | """
4 | 


--------------------------------------------------------------------------------
/requirements/admin-dev.txt:
--------------------------------------------------------------------------------
1 | hypothesis==3.6.0
2 | ## The following requirements were added by pip freeze:
3 | enum34==1.1.6
4 | 


--------------------------------------------------------------------------------
/requirements/admin-dev.txt.in:
--------------------------------------------------------------------------------
1 | hypothesis
2 | 


--------------------------------------------------------------------------------
/requirements/admin.txt.in:
--------------------------------------------------------------------------------
 1 | apache-libcloud
 2 | # The `aws` command is required by the ``admin.installer``,
 3 | # `admin.test.test_installer` and in the release process.
 4 | awscli
 5 | bitmath
 6 | boto
 7 | characteristic
 8 | deb_pkg_tools
 9 | docker-py
10 | effect
11 | eliot
12 | GitPython
13 | ipaddr
14 | # Provides enhanced HTTPS support for httplib and urllib2 using PyOpenSSL
15 | ndg-httpsclient
16 | --find-links git+https://github.com/ClusterHQ/pyrsistent@v0.11.13+chq5#egg=pyrsistent-0.11.13+chq5
17 | pyrsistent
18 | python-dateutil
19 | pytz
20 | PyYAML
21 | requests
22 | requests_file
23 | testtools
24 | troposphere
25 | Twisted
26 | txeffect
27 | virtualenv
28 | zope.interface
29 | 


--------------------------------------------------------------------------------
/requirements/all.txt:
--------------------------------------------------------------------------------
1 | --requirement lint.txt
2 | --requirement flocker.txt
3 | --requirement flocker-dev.txt
4 | --requirement admin.txt
5 | --requirement admin-dev.txt
6 | 


--------------------------------------------------------------------------------
/requirements/all.txt.latest:
--------------------------------------------------------------------------------
1 | --requirement lint.txt.in
2 | --requirement flocker.txt.in
3 | --requirement flocker-dev.txt.in
4 | --requirement admin.txt.in
5 | --requirement admin-dev.txt.in
6 | 


--------------------------------------------------------------------------------
/requirements/constraints.txt:
--------------------------------------------------------------------------------
1 | # awscli has very specific colarama requirements while pylint doesn't
2 | colorama<=0.3.3,>=0.2.5
3 | # docker-py requirement since https://github.com/docker/docker-py/pull/1127
4 | requests<2.11
5 | # Mimic specifies something much older which causes import errors in Flocker
6 | # tests. We don't need to run the mimic tests so let's just force the newest
7 | # version.
8 | testtools>=2.2.0
9 | 


--------------------------------------------------------------------------------
/requirements/flocker-dev.txt.in:
--------------------------------------------------------------------------------
 1 | mimic
 2 | # Required by flocker.acceptance.integration.test_postgres
 3 | pg8000
 4 | pycrypto
 5 | # Sphinx docs dependencies
 6 | # enchant.tokenize is not detected by snakefood
 7 | pyenchant
 8 | # Required by flocker.acceptance.integration.test_mongodb
 9 | pymongo
10 | sphinx-prompt
11 | sphinxcontrib-spelling
12 | # XXX: This shouldn't be here. It's only needed by admin.packaging module but
13 | # buildbot doesn't install the admin dependencies
14 | virtualenv
15 | 


--------------------------------------------------------------------------------
/requirements/lint.txt:
--------------------------------------------------------------------------------
 1 | flake8==3.2.1
 2 | pylint==1.6.4
 3 | ## The following requirements were added by pip freeze:
 4 | astroid==1.4.8
 5 | backports.functools-lru-cache==1.3
 6 | configparser==3.5.0
 7 | enum34==1.1.6
 8 | isort==4.2.5
 9 | lazy-object-proxy==1.2.2
10 | mccabe==0.5.3
11 | pycodestyle==2.2.0
12 | pyflakes==1.3.0
13 | six==1.10.0
14 | wrapt==1.10.8
15 | 


--------------------------------------------------------------------------------
/requirements/lint.txt.in:
--------------------------------------------------------------------------------
1 | flake8
2 | pylint
3 | 


--------------------------------------------------------------------------------
/setup.cfg:
--------------------------------------------------------------------------------
 1 | # See the docstring in versioneer.py for instructions. Note that you must
 2 | # re-run 'versioneer.py setup' after changing this section, and commit the
 3 | # resulting files.
 4 | 
 5 | [versioneer]
 6 | VCS = git
 7 | style = pep440
 8 | versionfile_source = flocker/_version.py
 9 | versionfile_build = flocker/_version.py
10 | tag_prefix =
11 | parentdir_prefix = Flocker-
12 | 
13 | [flake8]
14 | exclude=flocker/_version.py,flocker/restapi/docs/hidden_code_block.py
15 | # Ignore defaults + E731, E305
16 | # http://pep8.readthedocs.io/en/latest/intro.html#error-codes
17 | ignore=E123,E226,E241,E731,E305,W503
18 | 


--------------------------------------------------------------------------------