Git Product home page Git Product logo

version_databag's Introduction

version_databag

Cookbook Version Build Status

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

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.

version_databag's People

Contributors

mtrzepka avatar stephenb87 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.