[WebSphere]: элементы не добавляются в список должным образом, и регулярное выражение не выполняется - PullRequest
1 голос
/ 09 апреля 2019

Мы пытаемся остановить конкретное приложение без ручного вмешательства с помощью комбинации AdminApp.list() и regex.

Конечной целью является : Простота использования . Пользователь должен иметь возможность остановить приложение без входа в консоль WAS или изменения значений имени целевого приложения в сценарии. Они должны войти в Jenkins и выполнить этот сценарий stopapp.py. Это должно быть так просто.

Согласно этому сценарию WAS возвращает список приложений, которые в настоящее время присутствуют в его DMGR. Затем мы добавляем эти элементы в пустой список, а затем запускаем процедуру регулярного выражения (re.match), чтобы определить конкретное имя приложения. Затем мы подставляем извлеченное значение имени приложения в URI приложения, которое мы пытаемся остановить. В случае успеха приложение будет остановлено и состояние будет синхронизироваться между узлами.

Вот мой код :

    import re

    moduleName = "meap"
    ctxRootOld = "/meap_old"

    appList = []

    appObj = AdminApp.list("WebSphere:cell=myCell,node=myNode,server=myServer")
    print("These are the list of apps running in WAS DMGR: ")
    print(appObj)

    for apps in appObj:
        appList.append(apps)

    print("Now appending the apps to an empty list...Here are the values")
    print(appList)

    for app in appList:
        appMatch = re.match("^ABC\w+$", app)
        print(appMatch)
        result = appMatch.group(0)

    appStopName = result
    print (appStopName)

    appStopURI = ""+appStopName+".war,WEB-INF/web.xml"

    appmanager = AdminControl.queryNames('cell=myCell,node=myNode,type=ApplicationManager,*')

    AdminControl.invoke(appmanager, 'stopApplication', appStopName)

    AdminApp.edit(appStopName, ['-CtxRootForWebMod', [[moduleName, appStopURI, ctxRootOld]]])

    AdminConfig.save()

    AdminNodeManagement.syncActiveNodes()

Выход выглядит следующим образом:

WASX7209I: Connected to process "dmgr" on node CellManager03 using SOAP connector;  The type of process is: DeploymentManager

These are the apps running in WAS DMGR:
DefaultApp
ABCPreProd

Now appending the apps to an empty list...Here are the values
['D','e','f','a','u','l','t'.....'P','r','o','d']

None

WASX7017E: Exception received while running file "/app/was_scripts/stopapp.py"; exception information: com.ibm.bsf.BSFException: exception from Jython:
Traceback (innermost last):
  File "<string>", line 11, in ?
AttributeError: 'None' object has no attribute 'group'

Хотя это печать списка (в не очень правильном формате), но он неправильно добавляется в пустой список. Он берет каждое имя приложения, затем разделяет их на отдельные буквы, а затем добавляет в пустой список.

В результате сопоставление с шаблоном регулярного выражения возвращает None вместо имени приложения.

Пожалуйста, направьте меня, чтобы я мог исправить ошибку и автоматизировать этот процесс. Я чувствую, что метод split вместе с append решит проблему. Но я не знаю, какой разделитель поместить внутри метода split. Это только мое чувство, но каждый волен отправлять свои мысли.

Спасибо и всего наилучшего - KrisT :)

1 Ответ

0 голосов
/ 09 апреля 2019

Согласно вашему выводу, печать appObj приводит к печати приложений с новыми строками.Если это так, попробуйте следующий подход.Это создаст ваш appList, взяв строку и разделив ее на разрывы строк:

import re

moduleName = "meap"
ctxRootOld = "/meap_old"

appObj = AdminApp.list("WebSphere:cell=myCell,node=myNode,server=myServer")
print("These are the list of apps running in WAS DMGR: ")
print(appObj)

print("Now appending the apps to an empty list...Here are the values")
appList = str(appObj).splitlines()
print(appList)

for app in appList:
    appMatch = re.match("^ABC\w+$", app)
    print(appMatch)
    result = appMatch.group(0)

appStopName = result
print (appStopName)

appStopURI = ""+appStopName+".war,WEB-INF/web.xml"
appmanager = AdminControl.queryNames('cell=myCell,node=myNode,type=ApplicationManager,*')
AdminControl.invoke(appmanager, 'stopApplication', appStopName)
AdminApp.edit(appStopName, ['-CtxRootForWebMod', [[moduleName, appStopURI, ctxRootOld]]])
AdminConfig.save()

Это должно остановить добавление каждой буквы.Использование .splitlines() может быть более безопасным, чем использование .split('\n').Если appObj уже является строкой, вы также можете удалить str().

...