Linchpin API ( until 1.7.5 )

LinchPin can be used to provision resources by invoking linchpin python API.

Provisioning example using a Pinfile

While provisioning with a Pinfile as a dictionary we have to set various config parameters and workspaces as follows.

from linchpin import LinchpinAPI
from linchpin.context import LinchpinContext

context = LinchpinContext()
context.setup_logging()
context.load_config()
context.load_global_evars()
context.set_cfg('lp', 'workspace', '.')
context.set_evar('workspace', '.')
context.set_evar('debug_mode', True)
linchpin_api = LinchpinAPI(context)
pindict = {
  "simple": {
    "layout": {
      "inventory_layout": {
        "hosts": {
          "example-node": {
            "count": 1,
            "host_groups": [
              "example"
            ]
          }
        },
        "vars": {
          "hostname": "__IP__",
          "ansible_ssh_private_key_file": "~/.ssh/id_rsa"
        }
       }
    },
    "topology": {
       "topology_name": "simple",
      "resource_groups": [
        {
          "resource_group_name": "os-server-new",
          "resource_definitions": [
            {
              "count": 1,
              "name": "database",
              "image": "CentOS-7-x86_64-GenericCloud-1612",
              "keypair": "ci-factory",
              "role": "os_server",
              "fip_pool": "10.8.240.0",
              "flavor": "m1.small",
              "networks": [
                "QE-test"
              ]
            }
          ],
          "resource_group_type": "openstack",
          "credentials": {
            "filename": "clouds.yaml",
            "profile": "default"
          }
        }
      ]
    }
  }
}

# credentials alternatives: file vs environment variables
linchpin_api.do_action(pindict, action='up')
# inorder to destroy the pinfile we need to pass action parameter as destroy
# linchpin_api.do_action(pindict, action='destroy')

Linchpin revised API (Preview in 1.7.6)

In linchpin new api restructure linchpin provides two classes Pinfile, Workspace to provision resources

This feature is currently in Preview state for 1.7.6 will be available from version 2.0

Examples for provisioning using linchpin api Pinfile and workspace are as follows

  import json
  import linchpin
  from linchpin.api import Pinfile
  from linchpin.api import Workspace

  # workspace requires workspace path
  wksp = Workspace(path="/tmp/tmp3BAAhC/")
  wksp.up()
  #prints the inventory generated after provisioning
  wksp.get_inventory(inv_format="json")
  wksp.destroy()

  # Provisioning with Pinfile structure

  pinfile="""
  dummy-test:
    topology:
      topology_name: "dummy_cluster" # topology name
      resource_groups:
      - resource_group_name: "dummy"
        resource_group_type: "dummy"
        resource_definitions:
        - name: "web"
          role: "dummy_node"
          count: 3
        - name: "test"
          role: "dummy_node"
          count: 1
    layout:
      inventory_layout:
        vars:
          hostname: __IP__
        hosts:
          example-node:
            count: 3
            host_groups:
            - example
          test-node:
            count: 1
            host_groups:
            - test
        host_groups:
          all:
            vars:
              ansible_user: root
  """
  import yaml
  pinfile = yaml.load(pinfile)
  pf = Pinfile(pinfile=pinfile)
  print(pf.validate())
  #pf.up()
  #pf.destroy()

# workspace with external credential path
  wsp = Workspace(path="/home/srallaba/workspace/lp_ws_backup/lp_ws/ex_hooks/testw/dummy-creds-vault")
  print(wsp.validate())
  wsp.set_creds_path("/home/srallaba/workspace/lp_ws_backup/lp_ws/ex_hooks/testw/dummy-creds-vault/credentials/")
  wsp.set_evar("vault_password","testval")
  wsp.up()
  wsp.get_inventory()
  wsp.destroy()

Note

The both examples provided are backward compatible in nature. Introduction of new API does not change functionality the existing API

Refer the API reference section here Linchpin API and Context Modules for more documentation on specific functions