Отключить узел Дженкинса с помощью Python urllib2 - PullRequest
0 голосов
/ 27 марта 2019

Я работаю над скриптом Python (2.7), который выполняет ряд проверок на узле Jenkins, чтобы убедиться, что он соответствует всем остальным узлам.Если обнаружено несоответствие, я бы хотел отключить этот конкретный узел.Если возможно, я бы хотел сделать это с помощью пакета urllib2, потому что этот скрипт выполняется на всех разных узлах Jenkins, и я не хочу устанавливать пакет Python Jenkins на каждом из них.Вот некоторые из вещей, которые я пробовал:

Попытка 1:

def take_node_offline(self, node):
        print "Taking node %s offline" % node
        content = urllib2.urlopen("http://jenkins.com/computer/%s/doDisconnect?offlineMessage=Automated_Disconnect.".format(node))
        print content.read()

Не повезло в этом.

Попытка № 2: Я пошел за токеном аутентификации, потому что подумал, что мне может потребоваться пароль для переключения сетевого статуса узлов:

def take_node_offline(node):
        print "Taking node {} offline".format(node)
        jenkins_base_url = "http://jenkins.com"
        username = "admin"
        password = "password"

        token = TestSuite.authenticate_user(jenkins_base_url, username, password)
        url = jenkins_base_url + "/computer/{}/doDisconnect?offlineMessage=Automated_Disconnect.".format(node)

        resp = requests.post(url, auth=(username, password))

        if resp.ok:
            print "OK"
        else:
            print "Not OK"

Это также не сработало для меня, поскольку пакет запросов былне доступно на каждом узле.Кажется, я на правильном пути, но я не хочу добавлять зависимость от пакета запросов, если это возможно.

Попытка # 3

def take_node_offline(node):
    print "Taking node {} offline".format(node)
    jenkins_base_url = "http://jenkins.com"
    url = jenkins_base_url + "/computer/{}/doDisconnect?offlineMessage=Automated_Disconnect".format(node)
    req = urllib2.Request(url)
    username = "admin"
    password = "password"

    auth = 'Basic ' + base64.encodestring('%s:%s' % (username, password))[:-1]
    req.add_header('Authorization', auth)
    resp = urllib2.urlopen(req)

Это было ближе, но оно давало мне: urllib2.HTTPError: Ошибка HTTP 405: метод не разрешен

Мне кажется, я правильно форматирую запрос, так было в разных местах в Интернете., но, похоже, никто не опубликовал такую ​​проблему, поэтому трудно сказать.

Любые советы или простые решения приветствуются.Я в порядке, если нужно, использую другой подход или пакет, я бы предпочел использовать что-то встроенное в Python, чтобы мне не приходилось устанавливать зависимость везде.Я думаю, что мне нужно решить следующие задачи:

  1. Аутентификация с помощью Jenkins
  2. Отправить запрос doDisconnect
  3. Печать ответа
...