summaryrefslogtreecommitdiff
path: root/harnesses/host_controller/utils/parser/pb2_utils.py
blob: af96588ede5c586d7409e346426d73908a36de25 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#
# Copyright (C) 2018 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

import json
import logging
import requests

# timeout seconds for requests
REQUESTS_TIMEOUT_SECONDS = 60


def FillDictAndPost(msg,
                    dict_to_fill,
                    url,
                    headers,
                    filters={},
                    caller_name=""):
    """Fills up a dict using contents of the pb2 message and uploads it.

    Args:
        msg: pb2 msg, containing info about all task schedules.
        dict_to_fill: dict, to be converted into a json object before
                      upload.
        url: string, URL for the endpoit API to be called when
                     the dict_to_fill fills up.

    Returns:
        True if successful, False otherwise.
    """
    terminal = True
    ret = True
    sub_msg_list = []
    for field in msg.DESCRIPTOR.fields:
        if field.type == field.TYPE_MESSAGE:
            terminal = False
            for sub_msg in msg.__getattribute__(field.name):
                # make all the messages to be processed after other attrs,
                # otherwise dict_to_fill would be incomplete.
                sub_msg_list.append(sub_msg)
        else:
            if filters and field.name in filters:
                filtered_key = filters[field.name]
            else:
                filtered_key = field.name

            if field.label == field.LABEL_REPEATED:
                dict_to_fill[filtered_key] = list(
                    msg.__getattribute__(field.name))
            else:
                dict_to_fill[filtered_key] = msg.__getattribute__(field.name)

    for sub_msg in sub_msg_list:
        ret = ret and FillDictAndPost(sub_msg, dict_to_fill, url, headers,
                                      filters, caller_name)

    if terminal:
        try:
            response = requests.post(url, data=json.dumps(dict_to_fill),
                                     headers=headers,
                                     timeout=REQUESTS_TIMEOUT_SECONDS)
        except requests.exceptions.Timeout as e:
            logging.exception(e)
            return False
        if response.status_code != requests.codes.ok:
            logging.error("%s error: %s", caller_name, response)
            ret = ret and False

    return ret