From f3f58b1c39eb859c248c5d91ff972462c544a670 Mon Sep 17 00:00:00 2001 From: Wilken Rivera Date: Tue, 25 May 2021 09:22:12 -0400 Subject: [PATCH] Add Packer Integration Program page (#11042) * Initial draft of Packer Integration Program docs page - [ ] Add text from program document. - [ ] Fix image alignment - [ ] Fix Checklist alignment (remove bullets if possible) - [ ] Validate with program team * Fix broken markdown * fix styling on centered image and checklist * revert package-lock update * Update packer-integration-program.mdx Fix a few formatting issues Co-authored-by: Jeff Escalante --- .../checklist/check-circle-filled.svg | 1 + website/components/checklist/index.jsx | 5 + website/components/checklist/style.module.css | 20 +++ .../plugins/packer-integration-program.mdx | 151 ++++++++++++++++++ website/data/docs-nav-data.json | 4 + website/pages/docs/[[...page]].jsx | 3 +- .../img/docs/packer-ecosystem-diagram.png | Bin 0 -> 13596 bytes .../docs/packer-integration-steps-diagram.png | Bin 0 -> 21305 bytes 8 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 website/components/checklist/check-circle-filled.svg create mode 100644 website/components/checklist/index.jsx create mode 100644 website/components/checklist/style.module.css create mode 100644 website/content/docs/plugins/packer-integration-program.mdx create mode 100644 website/public/img/docs/packer-ecosystem-diagram.png create mode 100644 website/public/img/docs/packer-integration-steps-diagram.png diff --git a/website/components/checklist/check-circle-filled.svg b/website/components/checklist/check-circle-filled.svg new file mode 100644 index 000000000..5e3264e30 --- /dev/null +++ b/website/components/checklist/check-circle-filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/components/checklist/index.jsx b/website/components/checklist/index.jsx new file mode 100644 index 000000000..3e0d1d620 --- /dev/null +++ b/website/components/checklist/index.jsx @@ -0,0 +1,5 @@ +import s from './style.module.css' + +export default function ChecklistWrapper({ children }) { + return
{children}
+} diff --git a/website/components/checklist/style.module.css b/website/components/checklist/style.module.css new file mode 100644 index 000000000..d0f7498e9 --- /dev/null +++ b/website/components/checklist/style.module.css @@ -0,0 +1,20 @@ +.root { + & ul { + list-style: none; + margin-left: 2rem; + + & li { + color: #525252; + + &::before { + content: ''; + display: block; + width: 18px; + margin-left: calc(-1 * 1.6rem); + height: 18px; + top: 7px; + background: url('./check-circle-filled.svg'); + } + } + } +} diff --git a/website/content/docs/plugins/packer-integration-program.mdx b/website/content/docs/plugins/packer-integration-program.mdx new file mode 100644 index 000000000..b6ceabb40 --- /dev/null +++ b/website/content/docs/plugins/packer-integration-program.mdx @@ -0,0 +1,151 @@ +--- +description: | + The HashiCorp Packer Integration Program allows vendors to integrate + their products to work with Packer. +page_title: Integration Program +--- + +# Packer Integration Program + +The HashiCorp Packer Integration Program allows vendors to integrate their products to work with Packer. + +Vendors integrating their solutions via the Packer Integration Process provide their customers a verified and seamless user experience. The Packer Integration Program currently only supports coding with the Go programming language. + +This program is intended to be largely a self-service process with links and guidance to information sources, clearly defined steps, and checkpoints. + +### Types of Packer Integrations + +Packer is an open source tool for creating identical machine images for multiple platforms from a single source configuration. +Packer is lightweight, runs on every major operating system, and is highly performant, creating machine images for multiple platforms in parallel. Packer does not replace configuration management like Chef or Puppet. In fact, when building images, Packer is able to use tools like Chef or Puppet to install software onto the image. + +A machine image is a single static unit that contains a pre-configured operating system and installed software which is used to quickly create new running machines. Machine image formats change for each platform. Some examples include AMIs for EC2, VMDK/VMX files for VMware, OVF exports for VirtualBox, etc. To know more about use cases of Packer click ([Use Cases - Introduction | Packer by HashiCorp](https://www.packer.io/intro/use-cases)) + +For a full description of the current features please refer to the Packer website ([Packer by HashiCorp](https://www.packer.io/)). + +The diagram below depicts the key Packer integration categories and types. + +
+ Packer Ecosystem Integration Diagram +
+ Packer Ecosystem Intergation Diagram +
+
+ +Main Packer categories for partners to integrate with include: + +- **Data Sources** + - Data Sources allow users to retrieve values from a remote API and store them as variables in the Packer configuration template. An example is the [AWS secrets manager](https://www.packer.io/docs/datasources/amazon/secretsmanager) data source. +- **Builders** + - Builders manage the VM lifecycle. They manage launching a vm/instance, running provisioners against that instance, shutting the instance down, and saving an artifact image from that instance. Your builder handles all of the setup and cleanup costs associated with creating the output image artifact. +- **Provisioners** + - Provisioners are run against the instance launched by the builder. They generally provide an interface for interacting with a particular provisioning tool, such as Ansible, Puppet, or Chef. +- **Post-Processors** + - Post-Processors manage the image artifact after it has been created. This can be something general like running a compression tool against the artifact, or something specific like uploading it to a particular cloud service. + +### Development Process + +The Packer integration development process is divided into six steps. By following these steps, Packer integrations can be developed alongside HashiCorp to ensure that the integrations are able to be verified and supported in Packer as quickly as possible. A visual representation of the self-guided steps is depicted below. + +![Packer Integration Program Steps](/img/docs/packer-integration-steps-diagram.png 'Packer Integration Program Steps') + +The individual Packer integration steps include: + +1. Engage: Initial contact between vendor and HashiCorp +1. Enable: Information and articles to aid with the development of the integration +1. Dev/Test: Integration development and test process +1. Review: HashiCorp code review and verification of integration (iterative process) +1. Release: Verified integration made available and listed on the HashiCorp website once the HashiCorp technology partnership agreement has been executed +1. Support: Ongoing maintenance and support of the provider by the vendor. + +#### 1. Engage + +Please begin by providing some basic information about the integration that is being built via a simple [webform](https://docs.google.com/forms/d/e/1FAIpQLSfgq3HJ9Rfsi7LgPLFln28ZrmarATGlD_6A47-Io-bPUftKUw/viewform) + +This information is recorded and used by HashiCorp to track the integration through various stages. The information is also used to notify the integration developer of any overlapping work, perhaps coming from the community so you may better focus resources. + +Packer has an active community and ecosystem of partners that may have already started working on a similar integration. We'll do our best to connect similar parties to avoid duplicate work. + +#### 2. Enable + +While not mandatory, HashiCorp encourages vendors to sign an MNDA (Mutual Non-Disclosure Agreement) to allow for open dialog and sharing of ideas during the integration process. + +In an effort to support our self-serve model we’ve included links to resources, documentation, examples and best practices to guide you through the Packer integration development and testing process. + +- [Writing vendor extension guide](https://www.packer.io/docs/plugins/creation) +- Sample development implemented by a [partner](https://github.com/exoscale/packer-plugin-exoscale) +- [Scaffolding plugin repository](https://github.com/hashicorp/packer-plugin-scaffolding) to help bootstrap a new contribution: +- Contributing to Packer [guidelines](https://github.com/hashicorp/packer/blob/master/.github/CONTRIBUTING.md) +- [Packer developer community forum](https://discuss.hashicorp.com/c/packer/23) +- [Packer's source code](https://github.com/hashicorp/packer) + +We encourage vendors to closely follow the above guidance. Adopting the same structure and coding patterns helps expedite the review and release cycles. + +#### 3. Dev & Test + +Packer requires all code-level integrations to be written in the [Go](https://golang.org/) programming language and contain an [MPL-2.0](https://en.wikipedia.org/wiki/Mozilla_Public_License) open source license. The only knowledge necessary to write a plugin is basic command-line skills and knowledge of the Go programming language. When writing in Go-Language, HashiCorp has found the integration development process to be straightforward and simple when vendors pay close attention and follow the resources and by adopting the same structure and coding patterns helps expedite the review and release cycles. Please remember that all integration major steps should contain acceptance testing and the appropriate documentation. + +Data Sources +- [Custom Data sources documentation](https://www.packer.io/docs/plugins/creation/custom-datasources) +- [Example Data Source](https://github.com/hashicorp/packer-plugin-hashicups/tree/main/datasource) + +Builders +- [Custom Builders documentation](https://www.packer.io/docs/plugins/creation/custom-builders) +- [Example Builder](https://github.com/hashicorp/packer-plugin-hashicups/tree/main/builder/order) + +Provisioners +- [Custom provisioners documentation](https://www.packer.io/docs/plugins/creation/custom-provisioners) +- [Example Provisioner](https://github.com/hashicorp/packer-plugin-hashicups/tree/main/provisioner/toppings) + +Post-Processors +- [Custom post-processors documentation](https://www.packer.io/docs/plugins/creation/custom-post-processors) +- [Example Post-processor](https://github.com/hashicorp/packer-plugin-hashicups/tree/main/post-processor/receipt) + +Packer-Plugin-SDK +- The [Packer-plugin SDK](https://github.com/hashicorp/packer-plugin-sdk) contains tools to help plugin developers with common needs, like handling SSH connections or basic plugin architecture. + +#### 4. Review + +During the review process, HashiCorp will provide feedback on the newly developed integration. This is an important step to allow HashiCorp to review and verify your Packer integration. Please send the integration code and other relevant logs for verification to: [Packer-integration-dev@hashicorp.com](mailto:packer-integration-dev@hashicorp.com). + +In order to document your plugins with Packer, please submit a GitHub pull request (PR) against the [Packer project](https://github.com/hashicorp/packer). See [Registering Plugin Documentation](https://www.packer.io/docs/plugins/creation#registering-plugin-documentation) for instructions on how to register your remote plugin documentation with Packer. +The review process can take a while to complete and may require some iterations through the code to address any problems identified by the HashiCorp team. + +#### 5. Release + +At this stage, it is expected that the integration is fully complete, the necessary documentation has been written, the acceptance tests have all passed, and that HashiCorp has reviewed the integration. Once the plugin has been validated and accepted by HashiCorp, the plugin can be hosted on GitHub so it can easily be [downloaded then installed within Packer](https://www.packer.io/docs/plugins/creation#creating-a-github-release). + +Once the integration has been released the vendor is requested to sign the HashiCorp Technology Partner Agreement so that we can have their integration be listed on the HashiCorp website. + +#### 6. Support + +Many vendors view the release step to be the end of the journey, while at HashiCorp we view it to be the beginning of the journey. Getting the integration built is just the first step in enabling users to leverage it against their infrastructure. Once development is completed, on-going effort is required to support the developed integration, maintain the plugin and address any issues in a timely manner. + +The expectation from the vendor/partner is to create a mechanism for them to track and resolve all issues on an ongoing basis. Vendors who choose to not support their integration will not be considered a verified integration and cannot be listed on the website. + +### Checklist + +Below is an ordered checklist of steps that should be followed during the integration process. This just reiterates the steps already documented in the sections above. + +Below is an ordered checklist of steps that should be followed during the integration process. This just reiterates the steps already documented in the sections above. + + + +- Fill out the Packer integration [webform](https://docs.google.com/forms/d/e/1FAIpQLSfgq3HJ9Rfsi7LgPLFln28ZrmarATGlD_6A47-Io-bPUftKUw/viewform) +- Execute the HashiCorp MNDA (Mutual Non-Disclosure Agreement) if needed +- Develop and test Packer integration along with the acceptance tests and documentation +- Send email to [packer-integration-dev@hashicorp.com](mailto:packer-integration-dev@hashicorp.com) to schedule an initial review +- Address review feedback and finalize the development process +- Provide HashiCorp with credentials for underlying infrastructure for test purposes +- Demo the integration and/or send the test logs to HashiCorp at: [packer-integration-dev@hashicorp.com](mailto:packer-integration-dev@hashicorp.com) +- Execute HashiCorp Partner Agreement Documents, review logo guidelines, partner listing and more +- Plan to continue supporting the integration with additional functionality and responding to customer issues. + + + +### Contact Us + +For any questions or feedback, please contact us at: packer-integration-dev@hashicorp.com. diff --git a/website/data/docs-nav-data.json b/website/data/docs-nav-data.json index bc372b0b4..46d81d8fe 100644 --- a/website/data/docs-nav-data.json +++ b/website/data/docs-nav-data.json @@ -845,6 +845,10 @@ "path": "plugins/creation/custom-datasources" } ] + }, + { + "title": "Packer Integration Program", + "path": "plugins/packer-integration-program" } ] }, diff --git a/website/pages/docs/[[...page]].jsx b/website/pages/docs/[[...page]].jsx index a1ea21264..8c6ff2686 100644 --- a/website/pages/docs/[[...page]].jsx +++ b/website/pages/docs/[[...page]].jsx @@ -2,6 +2,7 @@ import { productName, productSlug } from 'data/metadata' import DocsPage from '@hashicorp/react-docs-page' import PluginTierLabel from 'components/plugin-tier-label' import DevAlert from 'components/dev-alert' +import Checklist from 'components/checklist' // Imports below are only used server-side import { generateStaticPaths, @@ -9,7 +10,7 @@ import { } from 'components/remote-plugin-docs/server' // Configure the docs path and remote plugin docs loading -const additionalComponents = { PluginTierLabel } +const additionalComponents = { PluginTierLabel, Checklist } const baseRoute = 'docs' const localContentDir = 'content/docs' const mainBranch = 'master' diff --git a/website/public/img/docs/packer-ecosystem-diagram.png b/website/public/img/docs/packer-ecosystem-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..33f20b92ff880b7f4403956f91750a377269f24a GIT binary patch literal 13596 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 G^`8Lp*Gqo@ literal 0 HcmV?d00001 diff --git a/website/public/img/docs/packer-integration-steps-diagram.png b/website/public/img/docs/packer-integration-steps-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..f7e5169ddfe0eed2ccddec79fb9cc71f23155080 GIT binary patch literal 21305 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