AutomationDevopsVMware

VMware Skyline API ile JIRA Ticket Yönetimi

Bu makalede Python Skyline API ile JIRA da ticket yönetimi ile ilgili bilgiler paylaşacağım. Aynı zamanda buradaki vSphere Skyline bulgularını Slack kanalına gönderip alarm oluşturacağız. Bir önceki makalede Skyline Insights API yi nasıl kullanabileceğimizden bahsetmiştim. Eğer Skyline Insights API kullanımı ve buradaki veri setlerini henüz incelemediyseniz aşağıdaki makaleyi okumanızı öneririm.

Öncelikle Skyline API Token bilgisi ile bir access token oluşturup sonrasında ilgili bulguları listelememiz gerekiyor. Topladığımız bilgileri hem JIRA ya hem de Slack kanalına göndereceğiz. Bu işlemleri yapabilmek adına gerekli olan değişkenler aşağıdaki gibidir. Skyline API TOKEN ile beraber sites.json dosyasında ilgili vSphere ortamız, JIRA erişim bilgileriniz ve Slack Webhook URL bilgilerini güncellemeniz gerekiyor.

Eğer farklı vSphere ortamlarına ait Slack alarm kanallarınız var ve bu ortamlar ile farklı ekipler ilgileniyorsa sites.json dosyasında ortam bilgilerinizi güncelledikten sonra tüm ortamların aktif bulgularını JIRA üzerinde kayıtlarını açıp her ortama ait Slack kanalında bildirimlerini alabilirsiniz. Github profilimden projenin tamamına erişebilirsiniz.

Python
import json
import time
import requests
from jira import JIRA
from slack_sdk.webhook import WebhookClient

APITOKEN = "Your-API-Token"
SKYLINEAPI = "https://skyline.vmware.com/public/api/data"
SKYLINEACCESS = "https://console.cloud.vmware.com/csp/gateway/am/api/auth/api-tokens/"

JSON
{
	"sites": [{
			"location": "Site-A",
			"vcenter": "site-a.vcenter.local",
			"jira": {
				"project": "AAA",
				"username": "jira-username",
				"token": "JIRA-Token",
				"url": "https://jira.corporate.com"
			},
			"slackurl": "Slack-Webhook-URL-for-SiteA-notification-channel"
		}
	]
}

Access Token oluşturduktan sonra aşağıdaki gibi response çıktısını bir değişkene atıyoruz.

Python
response = requests.post(
    url=SKYLINEAPI, data=json.dumps(data), headers=headers)
responseJson = response.json()

activeFindings = responseJson['data']['activeFindings']
findings = activeFindings['findings']

Bir önceki makaledeki gibi mevcut bulguları görüntüleyip her bir bulgu için içerisindeki affected objeleri de listelemek adına ayrı bir döngü oluşturmanız gerekiyor.

Python
def getAffectedObject(findingList, vcenter):
    findvcenter = vcenter
    for finding in findingList:
        findingAffectedObjects = ""
        findingDisplayName = finding['findingDisplayName']
        severity = finding['severity']
        totalAffectedObjects = finding['totalAffectedObjectsCount']
        category = finding['categoryName']
        risk = finding['findingImpact']
        findingDescription = finding['findingDescription']
        recommendations = finding['recommendations']
        kbLinkURLs = finding['kbLinkURLs']
        objectCount = 1
        for object in finding['affectedObjects']:
            findingAffectedObjects += "- " + object['objectName'] + "\n"
            objectCount += 1
    print("Collecting " + findingDisplayName + " details from Skyline")
    sendJIRA(findingDisplayName, severity, findingDescription, recommendations, findingAffectedObjects, kbLinkURLs, totalAffectedObjects, category, risk, findvcenter )

Topladığımız bulguları JIRA fonksiyonunda issue olarak açılmasını sağlıyoruz.

Python
def sendJIRA(findingDisplayName, severity, findingDescription, recommendations, findingAffectedObjects, kbLinkURLs, totalAffectedObjects, category, risk, vcenter):

    vcenter_list = data["sites"]
    for vcenter in vcenter_list:
        vcenter_value = vcenter["vcenter"]
        if(jsonDATA == vcenter_value):
            jiraProjectKey = vcenter["jira"]["project"]
            jiraUsername = vcenter["jira"]["username"]
            jiraToken = vcenter["jira"]["token"]
            jiraURL = vcenter["jira"]["url"]
            slackURL = vcenter["slackurl"]

    match severity:
        case "CRITICAL":
            priority = 'High'
            storyPoint = 5

        case "MODERATE":
            priority = 'Medium'
            storyPoint = 3

        case "TRIVIAL":
            priority = 'Low'
            storyPoint = 3

    jira_connection = JIRA(basic_auth=(jiraUsername, jiraToken), options={'server': jiraURL})
    epic = jira_connection.search_issues("project=" + jiraProjectKey + " and type='Epic'" + " and summary ~ " + epicName)
    issue_dict = {
    'project': {'key': jiraProjectKey},
    'summary': findingDisplayName,
    'description': issueDescription,
    'customfield_10000': storyPoint,
    'customfield_10001': issueRecommendation,
    'customfield_10002' : findingAffectedObjects,
    'customfield_10003' : epic[0].key,
    'labels': ["Healthcheck", "System"],
    'priority':{'name': priority},
    'issuetype': {'name': 'Task'},   
    }
    issueList = jira_connection.search_issues("project=" + jiraProjectKey + " and status='to do'" + " and summary ~ " + summary)
    
    if (issueList):
        issue = issueList[0]
        issue.update(description = issueDescription)
        issue.update(fields={'customfield_10002': findingAffectedObjects})
        issueKey = issue.key
        issueUpdated = True
    else:
        newIssue = jira_connection.create_issue(fields=issue_dict)
        issueKey = newIssue.key
        issueUpdated = False

    print("Creating issue for " + findingDisplayName)
    if issueUpdated == False:
        sendSlack(findingDisplayName, severity, totalAffectedObjects, category, risk, issueKey, jiraURL, slackURL)

Aynı bulguları Slack fonksiyonunda ilgili kanala bildirim olarak iletiyoruz.

Python
def sendSlack(findingName, severity, totalAffectedObjects, category, risk, issueKey, jiraURL, slackURL):
    warningEmoji = ':warning:'
    alertEmoji1 = ':alert:'
    alertEmoji2 = ':alert-blue:'
    alertEmoji3 = ':orange_alert:'
    issueButtonURL = jiraURL + "/browse/" + issueKey
    match severity:
        case "CRITICAL":
            emoji = alertEmoji1

        case "MODERATE":
            emoji = alertEmoji2

        case "TRIVIAL":
            emoji = alertEmoji3

    webhook = WebhookClient(slackURL)
    response = webhook.send("Slack-Formatted-Message")
    print("Sending " + findingName +" details to Slack channel...")

Aşağıda örnek script sonuçlarını bulabilirsiniz. Skyline Advisor üzerindeki vSphere ortamına ait bulguların JIRA da iş kayıtlarını açıp burada ilgili objeleri ekleyebilir, ön tanımlı iş ağırlıklarınızı işleyebilir ve aynı şekilde Slack kanalınıza bildirim olarak iletebilirsiniz.

Skyline API ile Active Finding Slack Bildirimi

Active Findings Jira Backlog

Jira Issue Detayları

Skyline bulgu objelerinin Jira üzerinde checklist item görünümü

Makale içerisindeki kullanılan scriptlere Github profilimden ulaşabilirsiniz.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir