Как я могу нормализовать список, в котором есть записи, которые не имеют отношения - PullRequest
0 голосов
/ 21 июня 2019

Я извлекаю информацию из K8 и создаю файл json. Из этого файла я извлекаю три свойства и создаю список Сервисов.

Службы могут иметь несколько записей в зависимости от версии. Моя цель - удалить старую версию и сохранить только последнюю версию.

class Service:
    def __init__(self, app, version, port):
        self.app = app
        self.version = version
        self.port = port

    def __str__(self):
        return 'service: {} version: {} port: {}'.format(
            self.app, self.version, self.port)

Эта функция обрабатывает файл:

def process_file(file):
    services = []
    with open(file, 'r') as handle:
        data = json.load(handle)
        for _, item in enumerate(data['items']):
            app = item['spec']['selector']['app'].lower()
            version = item['spec']['selector']['version']
            for protocol in item['spec']['ports']:
                if protocol['name'] == 'https':
                    port = protocol['nodePort']
                    services.append(Service(app, version, port))
        return services

и вернуть следующую информацию:

service: accessoryservice version: 1.2.12 port: 31751
service: aktivateuserinterface version: 1.2.198 port: 30265
service: approvalservices version: 1.1.0 port: 30230
service: approvalservices version: 1.2.11 port: 31380
service: cachemanagement version: 1.0.0 port: 31805
service: cachemanagement version: 1.1.0 port: 32678
service: cachemanagement version: 1.2.8 port: 31799
service: cashdrawermgmt version: 1.1.0 port: 32576
service: cashdrawermgmt version: 1.2.4 port: 31905
service: clovertradeupservices version: 1.2.9 port: 30562
service: collateralservice version: 1.0.0 port: 32037
service: collateralservice version: 1.1.0 port: 32244
service: collateralservice version: 1.2.8 port: 31445
service: compatibilityservice version: 1.0.0 port: 31335
service: compatibilityservice version: 1.1.0 port: 32739
service: compatibilityservice version: 1.2.13 port: 32472
service: customerdetails version: 1.0.0 port: 31007
service: customerdetails version: 1.1.2 port: 30209
service: customerdetails version: 1.2.57 port: 30546

Как я могу обработать эту информацию и удалить cachemanagement 1.0.0 и 1.1.0? Цель состоит в том, чтобы в списке была одна версия каждого сервиса, например, cachemanagement 1.2.8.

1 Ответ

1 голос
/ 21 июня 2019

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

from packaging.version import parse  # used to compare version strings

def process_file(file):
    services = {} # dict
    with open(file, 'r') as handle:
        data = json.load(handle)
        for _, item in enumerate(data['items']):
            app = item['spec']['selector']['app'].lower()
            version = item['spec']['selector']['version']
            for protocol in item['spec']['ports']:
                if protocol['name'] == 'https':
                    port = protocol['nodePort']
                    if app not in services:
                      services[app] = Service(app, version, port)
                    elif parse(services[app].version) < parse(version):  # update service only if version newer
                      services[app] = Service(app, version, port)
        return services
...