Skip to content

Nutanix Prism API to SQL Server ​

Fetches data from the Nutanix Prism API and inserts it into SQL Server

Clusters and Cluster Hosts ​

This will sync all registered clusters to a table in SQL Server with the following format:

idnamedeleted
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeecluster-nameNULL
aaaaaaaa-bbbb-cccc-dddd-ffffffffffffcluster-name-22021-01-01T00:00:01Z
yaml
  - name: Sync Clusters
    source: nutanix
    destination: sqlserver
    sourceConfig:
        listRequest:
        path: v3/hosts/list
        method: POST
        body_type: application/json
        body:
            kind: host
        response:
            length: metadata.total_matches
            items: entities
    destinationConfig:
        table: ntnx_cluster
        query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_cluster] WHERE deleted IS NULL
        soft_delete: true
        deleted_field: deleted
        deleted_value: GETDATE()
    sourceTransformers:
        - transformer: strings.set_default
        config:
            inField: status.name
            defaultValue: no-name-provided
        - transformer: strings.uppercase
        config:
            inOutMap:
            status.name: name
            metadata.uuid: id
    comparisonColumns:
      - name: id
          type: Utf8
          unique: true
      - name: name
          type: Utf8

  - name: Sync Cluster Hosts
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/hosts/list
        method: POST
        body_type: application/json
        body:
          kind: host
        response:
          length: metadata.total_matches
          items: entities
    destinationConfig:
      table: ntnx_cluster_host
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_cluster_host] WHERE deleted IS
        NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
    sourceTransformers:
      - transformer: strings.set_default
        config:
          inField: status.name
          defaultValue: no-name-provided
      - transformer: strings.uppercase
        config:
          inOutMap:
            status.name: name
            metadata.uuid: id
            status.cluster_reference.uuid: cluster_id
      - transformer: frames.rename_columns
        config:
          columns:
            - from: status.resources.ipmi.ip
              to: ip_address
            - from: status.resources.controller_vm.ip
              to: controller_vm_ip
    comparisonColumns:
      - name: id
        type: Utf8
        unique: true
      - name: ip_address
        type: Utf8
      - name: controller_vm_ip
        type: Utf8
      - name: cluster_id
        type: Utf8
      - name: name
        type: Utf8

Subnets/Networks ​

Sync subnets and networks from Nutanix Prism API to SQL Server in the following format:

idcluster_idnamevlanvswitch_idvswitch_namedeleted
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeeaaaaaaaa-bbbb-cccc-dddd-ffffffffffffsubnet-name100aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeevswitch-nameNULL
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeefaaaaaaaa-bbbb-cccc-dddd-ffffffffffffsubnet-name-2200aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeevswitch-name2021-01-01T00:00:01Z
yaml
  - name: Sync Subnets/Networks
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/subnets/list
        method: POST
        body_type: application/json
        body:
          kind: subnet
          length: 999
        response:
          length: metadata.total_matches
          items: entities
      columns:
        - name: metadata.uuid
          type: Utf8
          unique: true
        - name: status.cluster_reference.uuid
          type: Utf8
          unique: false
        - name: status.name
          type: Utf8
          unique: false
        - name: status.resources.vlan_id
          type: Int32
          unique: false
        - name: status.resources.virtual_switch_uuid
          type: Utf8
          unique: false
        - name: status.resources.vswitch_name
          type: Utf8
          unique: false
    destinationConfig:
      table: ntnx_subnet
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_subnet] WHERE deleted IS NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: cluster_id
          type: Utf8
          unique: false
        - name: name
          type: Utf8
          unique: false
        - name: vlan
          type: Int32
          unique: false
        - name: vswitch_id
          type: Utf8
          unique: false
        - name: vswitch_name
          type: Utf8
          unique: false
    sourceTransformers:
      - transformer: strings.uppercase
        config:
          inOutMap:
            metadata.uuid: id
            status.name: name
            status.cluster_reference.uuid: cluster_id
            status.resources.virtual_switch_uuid: vswitch_id
      - transformer: frames.rename_columns
        config:
          columns:
            - from: status.resources.vlan_id
              to: vlan
            - from: status.resources.vswitch_name
              to: vswitch_name

Virtual Machines, Disks and NICs ​

This section is going to synchronize Virtual Machines, Disks and NICs to three separate tables, using some of the more advanced transformers

Virtual Machines:

idcluster_idnameip_addressthreads_per_corevcpu_per_socketnum_socketsmemory_mbdescriptiondepartmentsdeleted
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeeaaaaaaaa-bbbb-cccc-dddd-ffffffffffffvm-name1.1.1.12224096vm-descriptiondepartment-1,department-2NULL
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeefaaaaaaaa-bbbb-cccc-dddd-ffffffffffffvm-name-22.2.2.24448192vm-description-2department-3,department-42021-01-01T00:00:01Z

Virtual Machine NICs:

idvm_idmac_addresssubnet_idip_addressdeleted
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeeaaaaaaaa-bbbb-cccc-dddd-ffffffffffff00:00:00:00:00:00aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeeNULL
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeefaaaaaaaa-bbbb-cccc-dddd-ffffffffffff00:00:00:00:00:01aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee2021-01-01T00:00:01Z

Virtual Machine Disks:

idvm_iddevice_typesize_mbbus_iddeleted
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeeaaaaaaaa-bbbb-cccc-dddd-ffffffffffffdisk10240NULL
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeefaaaaaaaa-bbbb-cccc-dddd-ffffffffffffdisk204812021-01-01T00:00:01Z
yaml
  - name: Sync Virtual Machines
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/vms/list
        method: POST
        body_type: application/json
        body:
          kind: vm
          length: 999
        response:
          length: metadata.total_matches
          items: entities
      columns:
        - name: metadata.uuid
          type: Utf8
          unique: true
        - name: status.cluster_reference.uuid
          type: Utf8
          unique: false
        - name: status.name
          type: Utf8
          unique: false
        - name: status.resources.nic_list
          type: List
          unique: false
        - name: status.resources.num_threads_per_core
          type: Int32
          unique: false
        - name: status.resources.num_vcpus_per_socket
          type: Int32
          unique: false
        - name: status.resources.num_sockets
          type: Int32
          unique: false
        - name: status.resources.memory_size_mib
          type: Int32
          unique: false
        - name: status.description
          type: Utf8
          unique: false
        - name: metadata.categories_mapping.Grupperingar
          type: List
    destinationConfig:
      table: ntnx_vm
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_vm] WHERE deleted IS NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: cluster_id
          type: Utf8
          unique: false
        - name: name
          type: Utf8
          unique: false
        - name: ip_address
          type: Utf8
          unique: false
        - name: threads_per_core
          type: Int32
          unique: false
        - name: vcpu_per_socket
          type: Int32
          unique: false
        - name: num_sockets
          type: Int32
          unique: false
        - name: memory_mb
          type: Int32
          unique: false
        - name: description
          type: Utf8
          unique: false
        - name: departments
          type: Utf8
          unique: false
    sourceTransformers:
      - transformer: structs.jsonpath
        config:
          inField: status.resources.nic_list
          outField: ip_address
          jsonPath: 0.ip_endpoint_list.0.ip
          defaultValue: ""
      - transformer: strings.uppercase
        config:
          inOutMap:
            metadata.uuid: id
            status.name: name
            status.cluster_reference.uuid: cluster_id
      - transformer: frames.rename_columns
        config:
          columns:
            - from: status.resources.num_threads_per_core
              to: threads_per_core
            - from: status.resources.num_vcpus_per_socket
              to: vcpu_per_socket
            - from: status.resources.num_sockets
              to: num_sockets
            - from: status.resources.memory_size_mib
              to: memory_mb
            - from: status.description
              to: description
      - transformer: strings.join_listfield
        config:
          inField: metadata.categories_mapping.Grupperingar
          outField: departments
          separator: ","

  - name: Sync Virtual Machine NICs
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/vms/list
        method: POST
        body_type: application/json
        body:
          kind: vm
          length: 999
        response:
          length: metadata.total_matches
          items: entities
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: vm_id
          type: Utf8
          unique: false
        - name: mac_address
          type: Utf8
          unique: false
        - name: subnet_id
          type: Utf8
          unique: false
        - name: ip_address
          type: Utf8
          unique: false
    destinationConfig:
      table: ntnx_vm_dev_nic
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_vm_dev_nic] WHERE deleted IS
        NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: vm_id
          type: Utf8
          unique: false
        - name: mac_address
          type: Utf8
          unique: false
        - name: subnet_id
          type: Utf8
          unique: false
        - name: ip_address
          type: Utf8
          unique: false
    sourceTransformers:
      - transformer: frames.extract_nested_rows
        config:
          iterField: status.resources.nic_list
          fieldMap:
            id: uuid
            mac_address: mac_address
            subnet_id: subnet_reference.uuid
            ip_address: ip_endpoint_list.0.ip
          colMap:
            vm_id: metadata.uuid
      - transformer: strings.uppercase
        config:
          inOutMap:
            id: id
            vm_id: vm_id
            mac_address: mac_address
            subnet_id: subnet_id

  - name: Sync Virtual Machine Disks
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/vms/list
        method: POST
        body_type: application/json
        body:
          kind: vm
          length: 999
        response:
          length: metadata.total_matches
          items: entities
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: vm_id
          type: Utf8
          unique: false
        - name: device_type
          type: Utf8
          unique: false
        - name: bus_id
          type: Int64
          unique: false
        - name: size_mb
          type: Int64
          unique: false
    destinationConfig:
      table: ntnx_vm_dev_storage
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_vm_dev_storage] WHERE deleted IS NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: vm_id
          type: Utf8
          unique: false
        - name: device_type
          type: Utf8
          unique: false
        - name: size_mb
          type: Int32
          unique: false
        - name: bus_id
          type: Int64
          unique: false
    sourceTransformers:
      - transformer: frames.extract_nested_rows
        config:
          iterField: status.resources.disk_list
          fieldMap:
            id: uuid
            device_type: device_properties.device_type
            size_bytes: disk_size_bytes
            bus_id: device_properties.disk_address.device_index
          colMap:
            vm_id: metadata.uuid
      - transformer: strings.uppercase
        config:
          inOutMap:
            id: id
            vm_id: vm_id
      - transformer: int.divide
        config:
          inField: size_bytes
          outField: size_mb
          factor: 1048576

Full Configuration ​

yaml
configVersion: V1
sources:
  - name: sqlserver
    type: Sqlserver
    connection:
      settings:
        connection_string: "Host=sqlserver;User=sa;Password=Password123;Database=NUTANIX_DB"
  - name: nutanix
    type: Rest
    connection:
      settings:
        base_url: "https://nutanix.local:9440"
        authentication:
          basic: true
          basic_user: username
          basic_pass: password
        ignore_certificates: true
sync:
  - name: Sync Clusters
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/hosts/list
        method: POST
        body_type: application/json
        body:
          kind: host
        response:
          length: metadata.total_matches
          items: entities
      columns:
        - name: metadata.uuid
          type: Utf8
          unique: true
        - name: status.name
          type: Utf8
    destinationConfig:
      table: ntnx_cluster
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_cluster] WHERE deleted IS NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: name
          type: Utf8
    sourceTransformers:
      - transformer: strings.set_default
        config:
          inField: status.name
          defaultValue: no-name-provided
      - transformer: strings.uppercase
        config:
          inOutMap:
            status.name: name
            metadata.uuid: id

  - name: Sync Cluster Hosts
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/hosts/list
        method: POST
        body_type: application/json
        body:
          kind: host
        response:
          length: metadata.total_matches
          items: entities
      columns:
        - name: metadata.uuid
          type: Utf8
          unique: true
        - name: status.name
          type: Utf8
        - name: status.cluster_reference.uuid
          type: Utf8
        - name: status.resources.ipmi.ip
          type: Utf8
        - name: status.resources.controller_vm.ip
          type: Utf8
    destinationConfig:
      table: ntnx_cluster_host
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_cluster_host] WHERE deleted IS
        NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: cluster_id
          type: Utf8
        - name: name
          type: Utf8
        - name: ip_address
          type: Utf8
        - name: controller_vm_ip
          type: Utf8
    sourceTransformers:
      - transformer: strings.set_default
        config:
          inField: status.name
          defaultValue: no-name-provided
      - transformer: strings.uppercase
        config:
          inOutMap:
            status.name: name
            metadata.uuid: id
            status.cluster_reference.uuid: cluster_id
      - transformer: frames.rename_columns
        config:
          columns:
            - from: status.resources.ipmi.ip
              to: ip_address
            - from: status.resources.controller_vm.ip
              to: controller_vm_ip
                            
  - name: Sync Subnets/Networks
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/subnets/list
        method: POST
        body_type: application/json
        body:
          kind: subnet
          length: 999
        response:
          length: metadata.total_matches
          items: entities
      columns:
        - name: metadata.uuid
          type: Utf8
          unique: true
        - name: status.cluster_reference.uuid
          type: Utf8
          unique: false
        - name: status.name
          type: Utf8
          unique: false
        - name: status.resources.vlan_id
          type: Int32
          unique: false
        - name: status.resources.virtual_switch_uuid
          type: Utf8
          unique: false
        - name: status.resources.vswitch_name
          type: Utf8
          unique: false
    destinationConfig:
      table: ntnx_subnet
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_subnet] WHERE deleted IS NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: cluster_id
          type: Utf8
          unique: false
        - name: name
          type: Utf8
          unique: false
        - name: vlan
          type: Int32
          unique: false
        - name: vswitch_id
          type: Utf8
          unique: false
        - name: vswitch_name
          type: Utf8
          unique: false
    sourceTransformers:
      - transformer: strings.uppercase
        config:
          inOutMap:
            metadata.uuid: id
            status.name: name
            status.cluster_reference.uuid: cluster_id
            status.resources.virtual_switch_uuid: vswitch_id
      - transformer: frames.rename_columns
        config:
          columns:
            - from: status.resources.vlan_id
              to: vlan
            - from: status.resources.vswitch_name
              to: vswitch_name
              
  
  - name: Sync Virtual Machines
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/vms/list
        method: POST
        body_type: application/json
        body:
          kind: vm
          length: 999
        response:
          length: metadata.total_matches
          items: entities
      columns:
        - name: metadata.uuid
          type: Utf8
          unique: true
        - name: status.cluster_reference.uuid
          type: Utf8
          unique: false
        - name: status.name
          type: Utf8
          unique: false
        - name: status.resources.nic_list
          type: List
          unique: false
        - name: status.resources.num_threads_per_core
          type: Int32
          unique: false
        - name: status.resources.num_vcpus_per_socket
          type: Int32
          unique: false
        - name: status.resources.num_sockets
          type: Int32
          unique: false
        - name: status.resources.memory_size_mib
          type: Int32
          unique: false
        - name: status.description
          type: Utf8
          unique: false
        - name: metadata.categories_mapping.Grupperingar
          type: List
    destinationConfig:
      table: ntnx_vm
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_vm] WHERE deleted IS NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: cluster_id
          type: Utf8
          unique: false
        - name: name
          type: Utf8
          unique: false
        - name: ip_address
          type: Utf8
          unique: false
        - name: threads_per_core
          type: Int32
          unique: false
        - name: vcpu_per_socket
          type: Int32
          unique: false
        - name: num_sockets
          type: Int32
          unique: false
        - name: memory_mb
          type: Int32
          unique: false
        - name: description
          type: Utf8
          unique: false
        - name: departments
          type: Utf8
          unique: false
    sourceTransformers:
      - transformer: structs.jsonpath
        config:
          inField: status.resources.nic_list
          outField: ip_address
          jsonPath: 0.ip_endpoint_list.0.ip
          defaultValue: ""
      - transformer: strings.uppercase
        config:
          inOutMap:
            metadata.uuid: id
            status.name: name
            status.cluster_reference.uuid: cluster_id
      - transformer: frames.rename_columns
        config:
          columns:
            - from: status.resources.num_threads_per_core
              to: threads_per_core
            - from: status.resources.num_vcpus_per_socket
              to: vcpu_per_socket
            - from: status.resources.num_sockets
              to: num_sockets
            - from: status.resources.memory_size_mib
              to: memory_mb
            - from: status.description
              to: description
      - transformer: strings.join_listfield
        config:
          inField: metadata.categories_mapping.Grupperingar
          outField: departments
          separator: ","

  - name: Sync Virtual Machine NICs
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/vms/list
        method: POST
        body_type: application/json
        body:
          kind: vm
          length: 999
        response:
          length: metadata.total_matches
          items: entities
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: vm_id
          type: Utf8
          unique: false
        - name: mac_address
          type: Utf8
          unique: false
        - name: subnet_id
          type: Utf8
          unique: false
        - name: ip_address
          type: Utf8
          unique: false
    destinationConfig:
      table: ntnx_vm_dev_nic
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_vm_dev_nic] WHERE deleted IS
        NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: vm_id
          type: Utf8
          unique: false
        - name: mac_address
          type: Utf8
          unique: false
        - name: subnet_id
          type: Utf8
          unique: false
        - name: ip_address
          type: Utf8
          unique: false
    sourceTransformers:
      - transformer: frames.extract_nested_rows
        config:
          iterField: status.resources.nic_list
          fieldMap:
            id: uuid
            mac_address: mac_address
            subnet_id: subnet_reference.uuid
            ip_address: ip_endpoint_list.0.ip
          colMap:
            vm_id: metadata.uuid
      - transformer: strings.uppercase
        config:
          inOutMap:
            id: id
            vm_id: vm_id
            mac_address: mac_address
            subnet_id: subnet_id

  - name: Sync Virtual Machine Disks
    source: nutanix
    destination: sqlserver
    sourceConfig:
      listRequest:
        path: v3/vms/list
        method: POST
        body_type: application/json
        body:
          kind: vm
          length: 999
        response:
          length: metadata.total_matches
          items: entities
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: vm_id
          type: Utf8
          unique: false
        - name: device_type
          type: Utf8
          unique: false
        - name: bus_id
          type: Int64
          unique: false
        - name: size_mb
          type: Int64
          unique: false
    destinationConfig:
      table: ntnx_vm_dev_storage
      query: SELECT * FROM [NUTANIX_DB].[dbo].[ntnx_vm_dev_storage] WHERE deleted IS NULL
      soft_delete: true
      deleted_field: deleted
      deleted_value: GETDATE()
      columns:
        - name: id
          type: Utf8
          unique: true
        - name: vm_id
          type: Utf8
          unique: false
        - name: device_type
          type: Utf8
          unique: false
        - name: size_mb
          type: Int32
          unique: false
        - name: bus_id
          type: Int64
          unique: false
    sourceTransformers:
      - transformer: frames.extract_nested_rows
        config:
          iterField: status.resources.disk_list
          fieldMap:
            id: uuid
            device_type: device_properties.device_type
            size_bytes: disk_size_bytes
            bus_id: device_properties.disk_address.device_index
          colMap:
            vm_id: metadata.uuid
      - transformer: strings.uppercase
        config:
          inOutMap:
            id: id
            vm_id: vm_id
      - transformer: int.divide
        config:
          inField: size_bytes
          outField: size_mb
          factor: 1048576