def getServiceComponentLayoutValidations()

in metron-deployment/packaging/ambari/metron-mpack/src/main/resources/common-services/METRON/CURRENT/service_advisor.py [0:0]


    def getServiceComponentLayoutValidations(self, services, hosts):

        componentsListList = [service["components"] for service in services["services"]]
        componentsList = [item["StackServiceComponents"] for sublist in componentsListList for item in sublist]

        metronParsersHost = self.getHosts(componentsList, "METRON_PARSERS")[0]
        metronEnrichmentMaster = self.getHosts(componentsList, "METRON_ENRICHMENT_MASTER")[0]
        metronProfilerHost = self.getHosts(componentsList, "METRON_PROFILER")[0]
        metronPcapHost = self.getHosts(componentsList, "METRON_PCAP")[0]
        metronIndexingHost = self.getHosts(componentsList, "METRON_INDEXING")[0]
        metronRESTHost = self.getHosts(componentsList, "METRON_REST")[0]
        metronManagementUIHost = self.getHosts(componentsList, "METRON_MANAGEMENT_UI")[0]
        metronAlertsUIHost = self.getHosts(componentsList, "METRON_ALERTS_UI")[0]

        hbaseClientHosts = self.getHosts(componentsList, "HBASE_CLIENT")
        hdfsClientHosts = self.getHosts(componentsList, "HDFS_CLIENT")
        zookeeperClientHosts = self.getHosts(componentsList, "ZOOKEEPER_CLIENT")

        kafkaBrokers = self.getHosts(componentsList, "KAFKA_BROKER")
        stormSupervisors = self.getHosts(componentsList, "SUPERVISOR")

        items = []

        # Metron Must Co-locate with KAFKA_BROKER and STORM_SUPERVISOR
        if metronParsersHost not in kafkaBrokers:
            message = "Metron must be colocated with an instance of KAFKA BROKER"
            items.append({ "type": 'host-component', "level": 'ERROR', "message": message, "component-name": 'METRON_PARSERS', "host": metronParsersHost })

        if metronParsersHost not in stormSupervisors:
            message = "Metron must be colocated with an instance of STORM SUPERVISOR"
            items.append({ "type": 'host-component', "level": 'WARN', "message": message, "component-name": 'METRON_PARSERS', "host": metronParsersHost })

        if metronRESTHost not in stormSupervisors:
            message = "Metron REST must be colocated with an instance of STORM SUPERVISOR"
            items.append({ "type": 'host-component', "level": 'WARN', "message": message, "component-name": 'METRON_REST', "host": metronRESTHost })

        if metronParsersHost !=  metronRESTHost:
            message = "Metron REST must be co-located with Metron Parsers on {0}".format(metronParsersHost)
            items.append({ "type": 'host-component', "level": 'WARN', "message": message, "component-name": 'METRON_REST', "host": metronRESTHost })

        if metronParsersHost != metronEnrichmentMaster:
            message = "Metron Enrichment Master must be co-located with Metron Parsers on {0}".format(metronParsersHost)
            items.append({ "type": 'host-component', "level": 'ERROR', "message": message, "component-name": 'METRON_ENRICHMENT_MASTER', "host": metronEnrichmentMaster })

        if metronParsersHost != metronIndexingHost:
            message = "Metron Indexing must be co-located with Metron Parsers on {0}".format(metronParsersHost)
            items.append({ "type": 'host-component', "level": 'ERROR', "message": message, "component-name": 'METRON_INDEXING', "host": metronIndexingHost })

        if metronParsersHost != metronPcapHost:
            message = "Metron PCAP must be co-located with Metron Parsers on {0}".format(metronParsersHost)
            items.append({ "type": 'host-component', "level": 'ERROR', "message": message, "component-name": 'METRON_PCAP', "host": metronPcapHost })

        if metronParsersHost != metronProfilerHost:
            message = "Metron Profiler must be co-located with Metron Parsers on {0}".format(metronParsersHost)
            items.append({ "type": 'host-component', "level": 'ERROR', "message": message, "component-name": 'METRON_PROFILER', "host": metronProfilerHost })

        # Enrichment Master also needs ZK Client, but this is already guaranteed by being colocated with Parsers Master
        if metronParsersHost not in zookeeperClientHosts:
            message = "Metron must be co-located with an instance of Zookeeper Client"
            items.append({ "type": 'host-component', "level": 'WARN', "message": message, "component-name": 'METRON_PARSERS', "host": metronParsersHost })

            # Enrichment Master also needs HDFS clients, but this is already guaranteed by being colocated with Parsers Master
        if metronParsersHost not in hdfsClientHosts:
            message = "Metron must be co-located with an instance of HDFS Client"
            items.append({ "type": 'host-component', "level": 'WARN', "message": message, "component-name": 'METRON_PARSERS', "host": metronParsersHost })

        if metronEnrichmentMaster not in hbaseClientHosts:
            message = "Metron Enrichment Master must be co-located with an instance of HBase Client"
            items.append({ "type": 'host-component', "level": 'WARN', "message": message, "component-name": 'METRON_ENRICHMENT_MASTER', "host": metronEnrichmentMaster })

        if metronManagementUIHost != metronAlertsUIHost:
            message = "Metron Alerts UI must be co-located with Metron Management UI on {0}".format(metronManagementUIHost)
            items.append({ "type": 'host-component', "level": 'ERROR', "message": message, "component-name": 'METRON_ALERTS_UI', "host": metronAlertsUIHost })

        return items