cookbook 'version_databag', '= 1.0.0'
version_databag (2) Versions 1.0.0 Follow1
Dynamically retrieve artifact versions from a data bag
cookbook 'version_databag', '= 1.0.0', :supermarket
knife supermarket install version_databag
knife supermarket download version_databag
version_databag
A Chef cookbook that provides functionality to dynamically retrieve artifact versioning information from a configurable Chef data bag. Note, this cookbook requires a minimum version of Chef 12.3.0 to be able to be used.
Attributes
All attributes are under the scope of the cookbook name: "version_databag"
key | Type | Description | Default |
---|---|---|---|
version_type | String | The type of version to retrieve from the databag | "release" |
databag | String | The databag containing the version data | nil |
databag_item | String | The databag item containing the version data | nil |
artifact_override_map | Hash | A hash of artifact_name => version_type to override the base version_type for the specified artifact | nil |
artifact_specifications | Array | An array of hashes containing the artifact specification. The artifact specification includes artifact_name, attribute_path, and optionally value_substitution | nil |
delimiter | String | A one or two character String of a delimiter when using value substitution | "<>" |
Recipes
default - Accepts an array of hashes containing artifact_name, attribute_path, and optionally a value_substitutions. This recipe calls the attrib_interpolate provider for each artifact specification in the array assuming they are defined along with the location of the data bag and data bag item. If an individual hash does not contain both required values (artifact_name and attribute path), that hash will be skipped with a log message of the index of the offending hash in the array.
Example recipe call with an artifact specification and a value substitution:
'version_databag' => { 'databag' => 'Artifacts', 'databag_item' => 'versions', 'artifact_specifications' => [ { 'artifact_name' => 'Artifact1', 'attribute_path' => "['application_cookbook']['version']" }, { 'artifact_name' => 'Artifact2', 'value_substitution' => "https://raw.githubusercontent.com/cerner/version_databag/<Artifact2>/README.md", 'attribute_path' => "['reference_git']['item']" } ] }
Example of the sample Artifacts/versions data bag that contains the versions referenced above:
{ "id": "versions", "Artifact1": { "release": "3.17", "snapshot": "3.18-SNAPSHOT" }, "Artifact2": { "release": "1.0" }, "Artifact3": { "release": "1.3", "snapshot": "1.4.SNAPSHOT" } }
After the execution of the above recipe, the following code would contain these results:
node['application_cookbook']['version'] #=> 3.17 node['reference_git']['item'] #=> https://raw.githubusercontent.com/cerner/version_databag/1.0/README.md
Providers
attrib_interpolate - Handles the logic to derive an artifact version from a given artifact_name from the defined data bag and populates the corresponding attribute_path. Alternatively, the provider can substitute the version into a string using the delimited artifact name as a value substitution. The provider is available to pass dynamically named artifacts or artifacts defined in a wrapper cookbook's attributes. Note: the provider call should be executed in Chef's "compile phase" to allow the attributes to be available as downstream cookbooks execute during the "execution phase".
Examples below reference the same Artifacts/version data bag previously mentioned.
Example 1: Assign the artifact version to the attribute_path through a calling cookbook with an artifact_override_map
Configured attributes:
default_attributes 'application_cookbook' => { 'artifacts' => ['Artifact1', 'Artifact3'] }, "version_databag" => { "databag" => "Artifacts", "databag_item" => "versions", "artifact_override_map" => { "Artifact3" => "snapshot" } }
Cookbook code:
node['application_cookbook']['artifacts'].each do |artifact|
version_databag_attrib_interpolate "Determine the version of #{artifact}" do
artifact_name artifact
attribute_path "['application_cookbook']['#{artifact}']['version']"
action :nothing
end.run_action(:resolve)
end
Output:
node['application_cookbook']['Artifact1']['version'] #=> 3.17 node['application_cookbook']['Artifact3']['version'] #=> 1.4.SNAPSHOT
Example 2: Substitute the version into a value substitution string with a custom delimiter
Configured attributes:
default_attributes 'version_databag' => { 'databag' => 'Artifacts', 'databag_item' => 'versions', 'delimiter' => '|' }
Cookbook code:
version_databag_attrib_interpolate "Determine artifact version git value substitution" do artifact_name 'Artifact2' attribute_path "['reference_git']['item']" value_substitution "https://raw.githubusercontent.com/cerner/version_databag/|Artifact2|/README.md" action :nothing end.run_action(:resolve)
Output:
node['reference_git']['item'] #=> https://raw.githubusercontent.com/cerner/version_databag/1.0/README.md
Testing
How to run tests
To run the tests for this cookbook you must install ChefDK.
The unit tests are written with rspec and chefspec.
They can be run with chef exec rspec
.
The lint testing uses Foodcritic and can be run with chef exec foodcritic . -f any
.
Contributing
See [CONTRIBUTING.md](CONTRIBUTING.md)
LICENSE
Copyright 2015 Cerner Innovation, Inc.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Dependent cookbooks
This cookbook has no specified dependencies.
Contingent cookbooks
There are no cookbooks that are contingent upon this one.
version_databag cookbook CHANGELOG
This file is used to list changes made in each version of the version_databag cookbook.
1.0 (yyyy-mm-dd)
- The 1.0 release of the version_databag cookbook
Collaborator Number Metric
1.0.0 passed this metric
Contributing File Metric
1.0.0 passed this metric
Foodcritic Metric
1.0.0 passed this metric
No Binaries Metric
1.0.0 passed this metric
Testing File Metric
1.0.0 failed this metric
Failure: To pass this metric, your cookbook metadata must include a source url, the source url must be in the form of https://github.com/user/repo, and your repo must contain a TESTING.md file
Version Tag Metric
1.0.0 failed this metric
Failure: To pass this metric, your cookbook metadata must include a source url, the source url must be in the form of https://github.com/user/repo, and your repo must include a tag that matches this cookbook version number
1.0.0 passed this metric
1.0.0 passed this metric
Foodcritic Metric
1.0.0 passed this metric
No Binaries Metric
1.0.0 passed this metric
Testing File Metric
1.0.0 failed this metric
Failure: To pass this metric, your cookbook metadata must include a source url, the source url must be in the form of https://github.com/user/repo, and your repo must contain a TESTING.md file
Version Tag Metric
1.0.0 failed this metric
Failure: To pass this metric, your cookbook metadata must include a source url, the source url must be in the form of https://github.com/user/repo, and your repo must include a tag that matches this cookbook version number
1.0.0 passed this metric
1.0.0 passed this metric
Testing File Metric
1.0.0 failed this metric
Failure: To pass this metric, your cookbook metadata must include a source url, the source url must be in the form of https://github.com/user/repo, and your repo must contain a TESTING.md file
Version Tag Metric
1.0.0 failed this metric
Failure: To pass this metric, your cookbook metadata must include a source url, the source url must be in the form of https://github.com/user/repo, and your repo must include a tag that matches this cookbook version number
1.0.0 failed this metric
1.0.0 failed this metric
Failure: To pass this metric, your cookbook metadata must include a source url, the source url must be in the form of https://github.com/user/repo, and your repo must include a tag that matches this cookbook version number