Nautobot and Device Lifecycle – Nautobot LCM Application – Part 3

Blog Detail

This is Part 3 of an ongoing series about using Nautobot and Nautobot’s Lifecycle Management Application to help you with your device hardware and software planning. We will be looking at v1.0.2, which is the latest version at the time of writing this blog.

If you haven’t read Part 1 or Part 2, please give them a quick glance. These parts examine the basic building blocks that Nautobot’s Lifecycle Management Application uses to manage the device and software objects in Nautobot.

In this part we will dive into how Nautobot can help you by looking at various aspects of the Lifecycle Management Application.

What Does the Application Provide?

Throughout my time as a network engineer, device/software lifecycle was a major financial and time-consuming task. Usually my time was spent looking through our source of record for devices and parsing out the devices that were a certain hardware or making a filter to find out what devices were on a certain software, to see what needed to be replaced/upgraded. If not that, it would be a spreadsheet or an email that had a list of hardware that just said we need to upgrade or update these devices.

I would have loved to have had a centralized place that had all the software/hardware end-of-life (EoL) dates along with various other EoL data. During that time I had to go to Cisco’s website or Juniper’s website to gather all the information I needed to get EoL data for the devices/software I was working with.

This application helps to manage life cycle[en dash]related data, such as end-of-life dates, viable software versions, and maintenance contract information. All of this helps to provide valuable life cycle planning including maintenance events and hardware events.

Getting Started with DLM Application

First, you will need to add the application to your Nautobot instance. There is a guide here.

Once you have the application installed, you will see that you now have a drop-down menu that you can click on, and it should look like the one below.

There are various items that make up the application, as you can see. So let’s dive into some of these!


Hardware Notices

Hardware notices are a great way to have a centralized location for EoL data for specific hardware. Let’s look at example hardware notices from demo.nautobot.com. You can assign device model objects or inventory item objects to these hardware notices either through the GUI or through the ORM using something such as a Nautobot job or Nautobot’s API.

  • Devices – This will autopopulate once you assign device model objects or inventory item objects to the hardware notice. If you click on the individual device, you will be forwarded to the device’s summary page (required when creating notice).
  • Device Type – If a device type object is assigned to the hardware notice, you will see that here. If you click on the device type, you will be directed to the summary page of that type; and from there you can click on instances to view all objects associated to the device type.
  • Inventory Item – If an inventory item object is assigned to the hardware notice, you will see that here.
  • End of Sale – Date of the vendor’s end of sale. When using an automated approach, you need to populate with “YYYY-MM-DD” format (required when creating notice).
  • End of Support – Date of the vendor’s end support. When using an automated approach, you need to populate with “YYYY-MM-DD” format (required when creating notice).
  • End of Software Releases – Date of the vendor’s end of software releases for the hardware. When using an automated approach, you need to populate with “YYYY-MM-DD” format.
  • End of Security Patches – Date of the vendor’s end of security patches for the hardware. When using an automated approach, you need to populate with “YYYY-MM-DD” format.
  • Documentation URL – Vendor’s URL or in-house URL that engineers can read over about the hardware dates and information.
  • Comments – You can fill in any comments regarding the hardware notice that can be filtered by using a GraphQL query or other filter in Nautobot’s ORM.
  • Tags – You can assign tags that you have created to tie in other objects, if needed.

Once you have assigned the hardware notice to either a device model or inventory item, you will see on the device’s page the linked hardware notice.

You will also see the hardware notice tied to the device type object:


Software (Notices)

The same goes for software notices. These are a great way to have a centralized location for EoL data for specific software. Let’s look at example software from demo.nautobot.com. You can assign software Nautobot objects to devices either through the GUI or through the ORM using something such as a Nautobot job.

Let’s look at what the software object has to offer.

  • Device Platform – The Nautobot platform object that is attached to the software (required when creating).
  • Software Version – This is the version of the software (required when creating).
  • Release Date – Date of the vendor’s software release. When using an automated approach, you need to populate with “YYYY-MM-DD” format.
  • End of Support – Date that the vendor’s support for the software will end. When using an automated approach, you need to populate with “YYYY-MM-DD” format.
  • Documentation URL – Vendor’s URL or in-house URL that engineers can read over about the hardware dates and information.
  • Long-Term Support – You can pick (True) or (False) regarding the software having long-term support in the network.
  • Pre Release – If the software is in testing or evaluation you can state that here.
  • Running on Devices – You will need to assign the software to devices when creating the software object. This is easier using Nautobot’s ORM in, for instance, a Nautobot job, which I will be talking about in Part 4.
  • Running on Inventory Items – You will need to assign the software to inventory items (if any) when creating the software object.
  • Corresponding CVEs – Any CVEs that vendor has can be listed here when you create the software object.
  • Tags – You can assign tags that you have created to tie in other objects, if needed.
  • Alias – This is not shown in the above screenshot, but you can add this when creating the software object. Some vendors have same version name; so when you are using the ORM to update software information, you will need to filter on the Alias, which should be unique. For example: – (e.g., Cisco IOS – 12.2(33)SXI14).

Once you have assigned the software object to either devices or inventory items, you will see the linked software object (notice) on the device’s page. We will explain validated software further down in the blog.


Software Images

Software images is a location where you can store various attributes for the software images you are currently using in the network. This software image object can be used in Nautobot’s API or ORM when you want to build jobs around automating software upgrades or validations.

Once you select your software image, you will be sent to all the attributes tied to that software image.

  • Software Version – This is the Nautobot Software object that will be tied to the software image (required when creating).
  • Image File Name – Name of the software image (required when creating).
  • Download URL – Vendor’s URL or in-house URL where the software file can be downloaded. Only HTTP and HTTPS are currently supported, as of 1.4.0.
  • Image File Checksum – Checksum of the file to use as validation when the file is downloaded.
  • Default Image – You can set this as a default image to be used on, say, specific hardware model types.
  • Tags – You can assign tags that you have created to tie in other objects, if needed.
  • Device assignments – Devices that are assigned this software image. This will be done when the software image object is created. (At least one assignment is needed.)
  • Inventory Items assignments – Inventory items that are assigned this software image. This will be done when the software image object is created. (At least one assignment is needed.)
  • Object Tags assignments – Object tags that are assigned this software image. This will be done when the software image object is created. (At least one assignment is needed.)

Now you can see that the software object has its software image tab populated.


Validated Softwares

Validated softwares is the software that has been vetted by the teams and approved to be used in the network. Validated softwares are also used in the lifecycle job to compare software versions of devices to the validated softwares that should be on that device. If the software is not Preferred Version, then it will not be targeted by the software validation job.

  • Software Version – This is the Nautobot Software object that will be tied to the software image (required when creating).
  • Valid Start – The date that the software is valid for the network (required when creating).
  • Valid End – Date when the software should be looked at to be replaced. This can be left blank and updated later.
  • Valid Now – This will be updated automatically if the server date is greater than the Valid Start and Valid End dates.
  • Preferred Version – This flag will be set so that when the software validation job is run, it will compare the software on device/inventory item to this specific software.
  • Tags – You can assign tags that you have created to tie in other objects, if needed.
  • Device assignments – Devices, Device Types, or Device Roles that are assigned this validated software. (At least one assignment is needed.)
  • Inventory Items assignments – Inventory items that are assigned this software image. (At least one assignment is needed.)
  • Object Tags assignments – Object tags that are assigned this software image. (At least one assignment is needed.)

A good way to tie the devices to the validated softwares is using tags, just in case you did not want to assign a device individually.

For one use case, I created the tag cisco_c6500_access; and every device that had that tag was meant to be on that validated software.

More about the validated software lifecycle job will appear in Part 4.


CVEs (Common Vulnerabilities and Exposures)

CVEs is a notice for vulnerabilities and exposures in either the hardware or software that you put in your network. This is potentially a security issue and should be assigned the highest urgency.

  • Name – Name of the corresponding CVE (required when creating).
  • Publish Date – The date that the CVE was published by the vendor (required when creating).
  • Link – URL to the Vendor’s website regarding the CVE (required when creating).
  • Status – Is the CVE active or not?
  • Description – Description of the CVE.
  • Severity – The current severity of the CVE, so that the teams can focus on higher-priority CVEs.
  • CVSS Base Score – This will be given by the vendor in regard to the severity of the vulnerabilities or exposures.
  • CVSSv2 Score – Different standards of severity levels.
  • CVSSv3 Score – Different standards of severity levels.
  • Fix – Any information on fixes for the software/hardware affected.
  • Comments – Comments on what can be done, work-arounds, or next steps regarding software/hardware items that are affected by the CVE.
  • Affected Softwares – This is not shown in the screenshot above; but when creating the CVE, you can assign it to certain softwares. Inventory Items and Device Types will be added to a later release.

Contracts

This is a centralized location for all the maintenance contracts that you have for various vendors. It includes start and end dates along with cost and support levels.

As you can see, there is quite a bit of information that you can assign to the contracts. You can assign devices to this contract when it is created, or you can create tags, as before, to link them.


Reports

The Device Lifecycle Application offers two different reports at the time of this writing.

  • Device Software Validation – This page will give you a graphical summary of the device validation job that Nautobot has. This job runs against all the devices and compares them to the validated software that is assigned to each device or device type.
  • Inventory Item Software Validation – This page will give you a graphical summary of the inventory item validation job that Nautobot has. This is a report that runs against all the inventory items and compares them to the validated software that is assigned to each device or device type.

The job that runs this is located in the Jobs tab, as shown below:


GraphQL Examples

I wanted to give a GraphQL example to look at the device software and validated software, since they were good learning headaches points I went through.

At the bottom of your Nautobot GUI there is a GraphQL link where you can test out queries if you like. Here is a sample query that will get you quite a bit of information if used in a GraphQL query. There are many more parameters that you can add if you want to gather more information.

query {
  devices {
    name
    rel_device_soft {
      version
      end_of_support
      documentation_url
      rel_soft_cve {
        name
        severity
      }
    }
  device_software_validation {
    software {
      version
      software_images {
        image_file_name
        download_url
      }
    }
    is_validated
  }
  }
}

With the query above, you will get a list of all the devices with the parameters queried. If there isn’t any data, it will show blank.

{
  "data": {
    "devices": [
      {
        "name": "ams01-dist-01",
        "rel_device_soft": {
          "version": "12.2(33)SXI14",
          "end_of_support": "2017-08-31",
          "documentation_url": "https://www.cisco.com/c/en/us/support/ios-nx-os-software/ios-software-releases-12-2-sx/series.html",
          "rel_soft_cve": [CVE-2022-3580]
        },
        "device_software_validation": {
          "software": {
            "version": "12.2(33)SXI14",
            "software_images": [
              {
                "image_file_name": "cat6k_caa-universalk9.12.2.33.SPA.bin",
                "download_url": "https://software.cisco.com/download/home/268437753/type/280805680/release/12.2.33SXI14?releaseIndicator=DEFERRED"
              }
            ]
          },
          "is_validated": true
        }
      },

Nautobot API Examples

Nautobot’s API can be leveraged to gather Device Lifecycle Application data.

Various endpoints below can be sent a GETPUTDELETEPATCH. Also, with each URI endpoint /{id}/ can be attached to the end to get more specific.

/plugins/nautobot-device-lifecycle-mgmt/contact/
/plugins/nautobot-device-lifecycle-mgmt/contract/
/plugins/nautobot-device-lifecycle-mgmt/cve/
/plugins/nautobot-device-lifecycle-mgmt/hardware/
/plugins/nautobot-device-lifecycle-mgmt/provider/
/plugins/nautobot-device-lifecycle-mgmt/software/
/plugins/nautobot-device-lifecycle-mgmt/software-image/
/plugins/nautobot-device-lifecycle-mgmt/validated-software/
/plugins/nautobot-device-lifecycle-mgmt/vulnerability/

Example API Call

Using cURL:

curl -X 'GET' \
  'https://demo.nautobot.com/api/plugins/nautobot-device-lifecycle-mgmt/software-image/?device_name=ams01-dist-01' \
  -H 'accept: application/json'

Using Python Requests:

https://demo.nautobot.com/api/plugins/nautobot-device-lifecycle-mgmt/software-image/?device_name=ams01-dist-01

Output:

{
  "count": 1,
  "next": null,
  "previous": null,
  "results": [
    {
      "display": "cat6k_caa-universalk9.12.2.33.SPA.bin",
      "id": "26c6c38a-102f-4ccc-8ace-308148f06de6",
      "url": "https://demo.nautobot.com/api/plugins/nautobot-device-lifecycle-mgmt/software-image/26c6c38a-102f-4ccc-8ace-308148f06de6/",
      "image_file_name": "cat6k_caa-universalk9.12.2.33.SPA.bin",
      "software": {
        "display": "Cisco IOS - 12.2(33)SXI14",
        "id": "cfe75355-e5b5-4d67-a4dd-a6fcf59e9cd8",
        "url": "https://demo.nautobot.com/api/plugins/nautobot-device-lifecycle-mgmt/software/cfe75355-e5b5-4d67-a4dd-a6fcf59e9cd8/",
        "device_platform": "df107d2a-b84f-4a30-9e48-093e9ad9a550",
        "version": "12.2(33)SXI14",
        "end_of_support": "2017-08-31"
      },
      "device_types": [
        "09dbb4e4-b258-4614-a85a-125f5c5caa9e"
      ],
      "inventory_items": [],
      "object_tags": [],
      "download_url": "https://software.cisco.com/download/home/268437753/type/280805680/release/12.2.33SXI14?releaseIndicator=DEFERRED",
      "image_file_checksum": "5de9de43040184c7de2de60456027f8c",
      "default_image": false,
      "custom_fields": {},
      "tags": [],
      "created": "2022-11-15",
      "last_updated": "2022-11-15T18:09:03.760005Z"
    }
  ]
}

What’s Next?

In the coming months I will be creating a specific blog post on each of the concepts mentioned below.

-Zack



ntc img
ntc img

Contact Us to Learn More

Share details about yourself & someone from our team will reach out to you ASAP!

Nautobot and Device Lifecycle – Software (Part 2)

Blog Detail

This is part 2 of an ongoing series about using Nautobot and Nautobot’s Lifecycle Management Application to help you with your device hardware/software planning. You can visit Hardware – (Part 1) if you haven’t or want to revisit that portion.

In this part we will dive into how Nautobot can help you with device lifecycle planning by looking at the software object in Nautobot. You will need to install the Lifecycle Management Application in order to create a relationship between the devices/device_type and the software objects in Nautobot. In part 3 I will dive deeper on how to use the application to populate hardware notices and software attributes.

Software Lifecycle

When considering what you should look for in lifecycle management of software you should do quite a bit of research. Some questions you might ask yourself are:

  1. Does the software have features that are needed for your network?
    • If you are running OSPF in your network does the software support that?
    • If you are want to run LACP on interfaces, does the software support that?
  2. What current version is this software on?
    • Are there many hotfixes or patches that have been done to the software?
    • What build is the software on?
    • Are there any upcoming patches/hotfixes to be released?
  3. What are the current security issues that have not been fixed?
    • Are there any security flaws in features/protocols that you have in your network such as BGP/BFD/LACP?
    • If there is a flaw in a protocol/feature and it’s not something you use currently, will you encounter it in the future?
    • Search for CVEs and bugs in the software.
  4. How old is the software?
    • You will most likely want to research software that has been out for at least one year so you can verify the security issues and bugs.
  5. What is the EoX data for the software?
    • What is the End of Support (EoS) date?
    • What is the End of Security Vulnerability Support date?
    • What is the End of Maintenance Releases date?
    • What is the End of Service Contract Renewal date?

The best process would be to talk with your vendor on what software is best for your network if you are able to.


Nautobot’s Software Homepage

Here is an overview of what attributes a Nautobot software object can have:

Nautobot’s Software Homepage
  • Device Platform – This is usually the manufacturer/vendor of the software.
  • Software Version – Current software version number. This should be the current semantic version.
  • Release Date – Date that the software was released from the vendor.
  • End of Support – Date from the vendor when they will stop supporting the software with patches, fixes, etc.
  • Documentation URL – Documentation of the version provided by the vendor to help with security/hotfix/EoX announcements.
  • Long-Term Support – Will the software be in the network for some time?
  • PreRelease – Boolean if the software is currently in the prereleases stage so engineers know not to add to production devices.
  • Running on Devices – What devices in Nautobot are running the software?
  • Running on Inventory Items – What inventory items in Nautobot are running the software?
  • Corresponding CVEs – CVE that can be attached using the Device Lifecycle Management application.

The above attributes can be filtered by using Nautobot’s API or GraphQL queries. In part 3 I will discuss the plugin and have some examples of queries that can be used to filter out specific information that you could use to create a csv file or Excel file, for example.


Nautobot Relationship Associations

As seen before in the software homepage, you can click on the “Running on devices” link to see what devices are running the software. In part 3 we will discuss further on how to build this relationship in the lifecycle application.

Nautobot Relationship Associations

Software Image Information

Looking at the software attributes screenshot, there is a tab for software image. You can assign different attributes to this Nautobot object, and you can see all the information pertaining to the software image when you click on this tab.

Software Image Information
  • Software Version – Current software version number. This should be the current semantic version.
  • Image Filename – The image filename of the software.
  • Download URL – URL or server path to follow to download the software. When onboarding new devices, this can come in handy for quick reference.
  • Image File Checksum – Checksum to validate once the software has been uploaded to the device to ensure it wasn’t corrupted during transfer.
  • Default Image – Boolean of whether the image is the default or not.
  • Assignments – Device, Inventory Items, and Object tags assignment.

What Can You Do with All This Information?

  1. Create a custom Nautobot job to pull software that is coming to End of Support in the next month and write that data to a csv/Excel file for review.
  2. Create a custom Nautobot job to query vendor’s website for updated information regarding the software and update Nautobot’s software object.
  3. Easily filter what devices are running what software to focus on upgrading devices.
  4. Create an Ansible playbook to query Nautobot’s API to find software that is about to expire. Then upload the future software to the device by polling the software’s filename, file path, and checksum.
  5. Create a GraphQL query for software with upcoming expiring date and use the results to craft an email to certain teams with a Nautobot job.

Conclusion

In the coming months I will be creating a specific blog post on each of the concepts mentioned below.

-Zack Tobar



ntc img
ntc img

Contact Us to Learn More

Share details about yourself & someone from our team will reach out to you ASAP!

Nautobot and Device Lifecycle – Hardware – Part 1

Blog Detail

This is part 1 of an ongoing series about using Nautobot and Nautobot’s Lifecycle Management Application to help you with your device hardware and software planning.

In this part we will dive into how Nautobot can help you by looking at the device model and device attributes.

What Is Device Lifecycle Planning?

If you are a network engineer or network automation engineer looking to automate or find a way to automate lifecycle planning, you should definitely understand Cisco’s PPDIOO – Design and Implementation.

If you want to learn more about PPDIOO you can follow this link: https://www.ciscopress.com/articles/article.asp?p=1608131&seqNum=3

For now, though, I want to talk about what some see as the “IT hardware lifecycle” planning model. This model is more condensed, and I feel it can be used for networking devices as well.

Plan – Engineers need to get an observation of current equipment that is in the network and see whether there is any older hardware that is a risk or needs to be replaced. Schedule repeating reviews (once a month or quarter) on equipment health and consider what to do as the next steps in replacing equipment.

Procure – Once planning is completed the procurement stage can begin. During this stage the cost of various pieces of equipment will be looked at and consideration given to other types of hardware that could be utilized. The outcome should be reviewed by the procurement team to determine whether the proposed purchases will be cost-effective.

Maintain – In this stage, operations and maintenance are done on the device hardware. This includes operations teams monitoring device health and remediating any hardware issues that may come along. During this time there might be hardware that ends up needing more work than normal and should be considered for replacement.

Dispose – How will you dispose of outdated equipment that’s being replaced, keeping in mind any security precautions or environmental precautions that must be followed.

Hardware lifecycle planning can be a daunting task for any size company. It doesn’t matter whether you have 20-100 devices or 20k-100k devices, staying up-to-date on hardware in your environment requires quite a bit of time and planning.

Let’s look at how Nautobot can help with that journey.

Importing Devices into Nautobot

First, you should have all the devices in Nautobot that you would like to track. You could add the devices manually, or you could use one of the many Nautobot applications (plugins) that will sync devices from another tool to Nautobot:

If you want to see more blog posts on SSoT click here.

After you get your device into Nautobot, you can see that it has your device type, platform (manufacturer), hostname, location, role, etc.

Devices

Nautobot’s Device Page

Here is an overview of what attributes a device can have:

Nautobot’s Device

Site

Helps with identifying hardware at specific locations.

site
  • Region – This is the region that you can set for a group of sites.
  • Tenant – A tenant represents a discrete grouping of resources used for administrative purposes.
  • Facility ID – Name of the facility that is in the site, such as a building name.
  • AS Number – Autonomous Number can be assigned to the site.
  • Time Zone – Time zone where the site is located; this can help when you need to reach out to personnel at the location.
  • Description – What you would like to call the site.
  • Contact Info – Consists of items such as Physical Address, Shipping Address, Contact Name/Phone/Email, etc.
  • Stats – Once everything is assigned to the site, an overall summary of what Racks, Devices, Prefixes, VLANs, Circuits, and Virtual Machines will be on the site homepage.

Rack

rack
  • Common – Site, Facility ID, Tenant, Status, Role, Serial number, Asset Tag.
  • Devices – List of devices that are currently assigned to the rack. This is also shown in the rack diagram, and each device is clickable.
  • Space Utilization – Amount of free space left in the cabinet. This is great for future planning or finding racks that are almost at 100%.
  • Power Utilization – Amount of power being consumed by the Rack.
  • Type – The type of rack configuration. This can be used to plan if you need to upgrade to bigger racks for the future.
  • Width – Width of rack.
  • Height – Height of rack.

Position

Physical location of the device in the Rack, which also can be seen in the rack overview page.

Tenant

A tenant represents a discrete grouping of resources used for administrative purposes.

tenant
  • Description – Description of the tenant.
  • Stats – An overall summary of what Racks, Devices, Prefixes, VLANs, Circuits, and Virtual Machines will be on the Tenant homepage.

Device Type

Device hardware type or model ID.

Device Type
  • Manufacturer – The vendor of said device type. This can be used to find out how many devices are tied to a specific vendor. If you are trying to remove a vendor from the network, this is an easy way find out how many device types of that vendor are in the network.
  • Model Name – Model name of the device and also the slug that is easily callable when using Nautobot’s API or GraphQL features.
  • Part Number – Part number for ordering purposes (also can be used to filter).
  • Height – Height of device type.
  • Parent/Child – Parent devices house child devices in device bays. Leave blank if this device type is neither a parent nor a child.
  • Front/Rear Images – Really helpful for boots on the ground and to validate that they are looking at the correct device before removal during the last phase of the hardware lifecycle.
  • Instances – All the devices, validated software, hardware notices that are tied to this specific device type.

Serial Number

Serial number of the device.

Role

Role of the device set by the user.

Role
  • Name – Name of the role that is set by the user.
  • Devices – All the devices associated to that role.
  • VMs – Any roles that are considered VMs.
  • Color – The color of the banner that will show up in the overall device summary page. This color is set by the user.
  • VM Role – Whether the role is considered to be a VM role or not.
  • Description – Description of role.

Platform

Usually the manufacturer of the device, but can be set by the user.

IPv4/IPv6

Management address of the device. An IPv4 or IPv6 address space can be assigned.

VLANs

These are VLANs that are attached to the device and also are found in the IPAM portion of Nautobot. This could help when a certain VLAN needs to be removed; you can see all devices and racks attached to that VLAN.

VLANs
  • Common – Site, VLAN ID, Name, Tenant, Role, Description.
  • Devices – All devices associated to that VLAN. Can be clicked on for more detail of the devices.
  • Rack – All racks associated to that VLAN. Can be clicked on for more detail of the racks.
  • Prefixes – All IP prefixes associated to the VLAN to ensure validation when VLANs have been removed.

Contracts

Any hardware contracts (relationship association object) that cover the device. This will be covered in depth more in the lifecycle app, but you could use this to see when current devices have a contract ending soon in order to decide whether to replace or continue to upgrade and renew the contract.

contracts
  • Provider – Contract vendor.
  • Start/End Date – Dates when contracts start and end. These dates are able to be filtered with GraphQL, API, or from contracts home page.
  • Cost – Cost of the contract can be reviewed to see whether a new contract price should be negotiated (if devices drop to a certain point, which is part of lifecycle planning).
  • Support Level – During the planning phase this can be looked at to see whether it should be greater or less based on how many devices are attached.
  • Contract Type – Hardware or software type.
  • Devices/Inventory Items – All device/inventory items attached to this contract.
  • Contacts – Escalation and Service Contract Owner information.

Software Version

The software on the device (relationship association object). This will be covered more in-depth when looking at software lifecycle.

Software Version

Images

You can store images for personnel to identify the device. Great for troubleshooting networking issues or replacing equipment.


Conclusion

In the coming months I will be creating a specific blog post on each of the concepts mentioned below.

-Zack



ntc img
ntc img

Contact Us to Learn More

Share details about yourself & someone from our team will reach out to you ASAP!