spec icon indicating copy to clipboard operation
spec copied to clipboard

Easier way of passing parameters to config or env. or output

Open mikkelhegn opened this issue 5 years ago • 0 comments

Having worked through a bit more complex application configuration file, I ended up repeating a lot of lines in the application configuration to simply pass parameters through to environment variables in a component. I also lacked the ability to describe an object type of variable (e.g. a database connection string, consisting of dbname, servername etc.)

I was lead to how CNAB defined parameters and definitions, and think that we can adopt a slightly simplified version of that concept. This might also help with #1

CNAB: https://github.com/deislabs/cnab-spec/blob/master/101-bundle-json.md#definitions

Benefits:

  • Parameter objects types
  • Directing parameters in app config to env and config directly
  • Parameter boundaries (e.g. min/max for int.)

Example - current model

apiVersion: core.hydra.io/v1alpha1
kind: Component
metadata:
  name: bikesharing.bikes.io/users
  labels:
    app: bikesharing
  annotations:
    version: 1.0.0
    description: WebAPI to control users in the system
spec:
  workloadType: core.hydra.io/v1alpha1.Service
  osType: linux
  parameters:
  - name: sqlUsername
    description: SQL DB username
    type: string
    required: true
    default: SA
  - name: sqlServer
    description: SQL DB server
    type: string
    required: true
  - name: sqlDatabase
    description: SQL DB name
    type: string
    required: true
    default: bikesharing
  - name: sqlTable
    description: DQL table name
    type: string
    required: true
    default: Users
  - name: api_gateway
    description: the API gateway dns name
    type: string
    required: true
  containers:
  - name: users
    image: azdspublic/bikesharing-users:build.20190426.1
    resources:
      cpu: 
        required: 0.1
      memory: 
        required: 100M
    ports: 
    - name: http-api
      containerPort: 80
      protocol: TCP
    env:
    - name: sql_username
      fromParam: sqlUsername
    - name: env.sql_server
      fromParam: sqlServer
    - name: sql_database
      fromParam: sqlDatabase
    - name: sql_table
      fromParam: sqlTable
    - name: api_gateway
      fromParam: api_gateway
---------
apiVersion: core.hydra.io/v1alpha1
kind: ApplicationConfiguration
metadata:
  name: BikeSharing-deployment
  annotations:
    version: v1.0.0
    description: BikeSharing production deployment
spec:
  variables:
    - name: sqlServerName
      value: sql-database
    - name: sqlServerTable
      value: myTable
  components:
    - componentName: bikesharing.bikes.io/users
      instanceName: users
      parameterValues:
        - name: sqlUsername
          value: "[fromVariable(sqlPassword)]"
        - name: sqlServer
          value: "[fromVariable(sqlServerName)]"
      traits:
        - name: users_scaler
          type: core.hydra.io/v1alpha1.ManualScaler
            properties:
              - name: replicacount
                value:  "[fromVariable(users_replicaCount)]"

Example - new model

apiVersion: core.hydra.io/v1alpha1
kind: Component
metadata:
  name: bikesharing.bikes.io/users
  labels:
    app: bikesharing
  annotations:
    version: 1.0.0
    description: WebAPI to control users in the system
spec:
  workloadType: core.hydra.io/v1alpha1.Service
  osType: linux
  parameters:
  - name: sqlConnectionString
    description: SQL database connectionstring
    type: object
        sqlDatabase: string <--- Object fields
        sqlServer: string
        sqlTable: string
    required: true
    destination:
        env:
            sqlDatabase: sql_database <--- Translates to an env named `sql_database`
            sqlServer: sql_server
            sqlTable: sql_table
  - name: api_gateway
    description: the API gateway dns name
    type: string
    required: true
    destination:
        config: api_gateway <---- Translates to a config named api_gateway
  - name: api_gateway
    description: the API gateway dns name
    type: int
        min: 1 <--- Types can have rules
        max: 5
    required: true
    destination:
        config: api_gateway <---- Translates to a config named api_gateway
        out: api_gateway <---- output from the deployment
  containers:
  - name: users
    image: azdspublic/bikesharing-users:build.20190426.1
    resources:
      cpu: 
        required: 0.1
      memory: 
        required: 100M
    ports: 
    - name: http-api
      containerPort: 80
      protocol: TCP
---------
apiVersion: core.hydra.io/v1alpha1
kind: ApplicationConfiguration
metadata:
  name: BikeSharing-deployment
  annotations:
    version: v1.0.0
    description: BikeSharing production deployment
spec:
  variables:
    - name: sqlConnectionString
      destinations:
        users.sqlConnectionString.sqlDatabase: myDB <--- [instanceName.parameter.objectfield]:[value]
        users.sqlConnectionString.sqlServer: myServer
        users.sqlConnectionString.sqlTable: myTable
    - name: api_gateway
      destinations:
        users.api_gateway: api.gateway <--- [instanceName.parameter]:[value]
    - name users_replicaCount
      value: 1 <--- As today for value substitution in other parts of the component configuration
  components:
    - componentName: bikesharing.bikes.io/users
      instanceName: users
      traits:
        - name: users_scaler
          type: core.hydra.io/v1alpha1.ManualScaler
            properties:
              - name: replicacount
                value:  "[fromVariable(users_replicaCount)]"

mikkelhegn avatar Sep 27 '19 13:09 mikkelhegn