예제 #1
0
def test_dict_merge_src_unchanged():
    base = {
        "flist": [
            {
                "dir": "out",
                "rmap": "rmap_1"
            },
            {
                "dir": "in",
                "rmap": "rmap_2"
            },
        ]
    }
    basecp = deepcopy(base)
    other = {
        "flist": [
            {
                "dir": "out",
                "rmap": "rmap_12"
            },
            {
                "dir": "in",
                "rmap": "rmap_2"
            },
        ]
    }
    othercp = deepcopy(other)

    utils.dict_merge(base, other)
    # dict_merge() should not modify the source dicts
    assert base == basecp
    assert other == othercp
예제 #2
0
    def generate_commands(self):
        """ Generate configuration commands to send based on
            want, have and desired state.
        """
        wantd = {(entry["process_id"]): entry
                 for entry in self.want.get("processes", [])}
        haved = {(entry["process_id"]): entry
                 for entry in self.have.get("processes", [])}

        # turn all lists of dicts into dicts prior to merge
        for entry in wantd, haved:
            self._ospfv3_list_to_dict(entry)

        # if state is merged, merge want onto have and then compare
        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        # if state is deleted, empty out wantd and set haved to wantd
        if self.state == "deleted":
            haved = {
                k: v
                for k, v in iteritems(haved) if k in wantd or not wantd
            }
            wantd = {}

        # if state is overridden, first remove processes that are in have but not in want
        if self.state in ["overridden", "deleted"]:
            for k, have in iteritems(haved):
                if k not in wantd:
                    self.addcmd(have, "process_id", True)

        for k, want in iteritems(wantd):
            self._compare(want=want, have=haved.pop(k, {}))
예제 #3
0
    def generate_commands(self):
        """Generate configuration commands to send based on
        want, have and desired state.
        """
        if self.want:
            wantd = {}
            for each in self.want:
                wantd.update({each["name"]: each})
        else:
            wantd = {}
        if self.have:
            haved = {}
            for each in self.have:
                haved.update({each["name"]: each})
        else:
            haved = {}

        for each in wantd, haved:
            self.list_to_dict(each)

        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        if self.state == "deleted":
            haved = {k: v for k, v in haved.items() if k in wantd or not wantd}
            wantd = {}

        # remove superfluous config
        if self.state in ["overridden", "deleted"]:
            for k, have in haved.items():
                if k not in wantd:
                    self._compare(want={}, have=have)

        for k, want in wantd.items():
            self._compare(want=want, have=haved.pop(k, {}))
예제 #4
0
    def generate_commands(self):
        """Generate configuration commands to send based on
        want, have and desired state.
        """
        if self.want:
            wantd = self.list_to_dict(self.want, "want")
        else:
            wantd = dict()
        if self.have:
            haved = self.list_to_dict(self.have, "have")
        else:
            haved = dict()

        if self.state in ["overridden", "replaced"]:
            if wantd != haved:
                wantx, havex = self.call_op(wantd, haved, "overridden")
                for k, have in iteritems(havex):
                    if k not in wantx:
                        self._compare(want={}, have=have)

        if not self.state == "deleted":
            wantd, haved = self.call_op(wantd, haved)

        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        for k, want in iteritems(wantd):
            self._compare(want=want, have=haved.pop(k, {}))
예제 #5
0
    def generate_commands(self):
        """Select the appropriate function based on the state provided
        :rtype: A list
        :returns: the commands necessary to migrate the current configuration
                  to the desired configuration
        """
        # convert list of dicts to dicts of dicts
        wantd = {entry["name"]: entry for entry in self.want}
        haved = {entry["name"]: entry for entry in self.have}

        # turn all lists of dicts into dicts prior to merge
        for entry in wantd, haved:
            self._list_to_dict(entry)

        # if state is merged, merge want onto have and then compare
        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        # if state is deleted, empty out wantd and set haved to wantd
        if self.state == "deleted":
            haved = {k: v for k, v in haved.items() if k in wantd or not wantd}
            wantd = {}

        # remove superfluous config
        if self.state in ["overridden", "deleted"]:
            for k, have in haved.items():
                if k not in wantd:
                    self._compare(want={}, have=have)

        for k, want in wantd.items():
            self._compare(want=want, have=haved.pop(k, {}))
예제 #6
0
    def generate_commands(self):
        """Generate configuration commands to send based on
        want, have and desired state.
        """

        wantd = self._ntp_list_to_dict(self.want)
        haved = self._ntp_list_to_dict(self.have)

        # if state is merged, merge want onto have and then compare
        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        # if state is deleted, empty out wantd and set haved to wantd
        if self.state == "deleted":
            haved = {
                k: v
                for k, v in iteritems(haved) if k in wantd or not wantd
            }
            wantd = {}

            commandlist = self._commandlist(haved)
            servernames = self._servernames(haved)
            # removing the servername and commandlist from the list after deleting it from haved
            for k, have in iteritems(haved):
                if k not in wantd:
                    for hk, hval in iteritems(have):
                        if hk == "allow_clients" and hk in commandlist:
                            self.commands.append(
                                self._tmplt.render({"": hk},
                                                   "allow_clients_delete",
                                                   True))
                            commandlist.remove(hk)
                        elif hk == "listen_addresses" and hk in commandlist:
                            self.commands.append(
                                self._tmplt.render({"": hk},
                                                   "listen_addresses_delete",
                                                   True))
                            commandlist.remove(hk)
                        elif hk == "server" and have["server"] in servernames:
                            self._compareoverride(want={}, have=have)
                            servernames.remove(have["server"])

        # remove existing config for overridden,replaced and deleted
        # Getting the list of the server names from haved
        #   to avoid the duplication of overridding/replacing the servers
        if self.state in ["overridden", "replaced"]:

            commandlist = self._commandlist(haved)
            servernames = self._servernames(haved)

            for k, have in iteritems(haved):
                if k not in wantd and "server" not in have:
                    self._compareoverride(want={}, have=have)
                    # removing the servername from the list after deleting it from haved
                elif k not in wantd and have["server"] in servernames:
                    self._compareoverride(want={}, have=have)
                    servernames.remove(have["server"])

        for k, want in iteritems(wantd):
            self._compare(want=want, have=haved.pop(k, {}))
예제 #7
0
    def generate_commands(self):
        """ Generate configuration commands to send based on
                    want, have and desired state.
                """

        for entry in self.want, self.have:
            self._bgp_list_to_dict(entry)

        wantd = self.want
        haved = self.have
        # if state is merged, merge want onto have and then compare
        if self.state == "merged":
            wantd = dict_merge(self.have, self.want)

        # if state is deleted, empty out wantd and set haved to elements to delete
        if self.state == "deleted":
            if wantd:
                to_del = {
                    "neighbors": self._set_to_delete(haved, wantd),
                    "vrfs": {},
                }

                for k, hvrf in iteritems(haved.get("vrfs", {})):
                    wvrf = wantd.get("vrfs", {}).get(k, {})
                    to_del["vrfs"][k] = {
                        "neighbors": self._set_to_delete(hvrf, wvrf),
                        "vrf": k,
                    }
                haved.update(to_del)

            wantd = {"as_number": haved.get("as_number")}

        self._compare(want=wantd, have=haved)
예제 #8
0
    def generate_commands(self):
        """ Generate configuration commands to send based on
            want, have and desired state.
        """
        wantd = {entry["afi"]: entry for entry in self.want}
        haved = {entry["afi"]: entry for entry in self.have}

        self._prefix_list_to_dict(wantd)
        self._prefix_list_to_dict(haved)

        # if state is merged, merge want onto have and then compare
        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        # if state is deleted, empty out wantd and set haved to wantd
        if self.state == "deleted":
            haved = {
                k: v
                for k, v in iteritems(haved) if k in wantd or not wantd
            }
            wantd = {}

        # remove superfluous config for overridden and deleted
        if self.state in ["overridden", "deleted"]:
            for k, have in iteritems(haved):
                if k not in wantd:
                    self._compare(want={}, have=have)

        for k, want in iteritems(wantd):
            self._compare(want=want, have=haved.pop(k, {}))
            # alligning cmd with negate cmd 1st followed by config cmd
        if self.state in ["overridden", "replaced"]:
            self.commands = [
                each for each in self.commands if "no" in each
            ] + [each for each in self.commands if "no" not in each]
예제 #9
0
    def generate_commands(self):
        """ Generate configuration commands to send based on
            want, have and desired state.
        """

        # convert list of dicts to dicts of dicts
        wantd = {entry["name"]: entry for entry in self.want}
        haved = {entry["name"]: entry for entry in self.have}

        # turn all lists of dicts into dicts prior to merge
        for entry in wantd, haved:
            self._ospf_int_list_to_dict(entry)

        # if state is merged, merge want onto have and then compare
        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        # if state is deleted, empty out wantd and set haved to wantd
        if self.state == "deleted":
            haved = {
                k: v for k, v in iteritems(haved) if k in wantd or not wantd
            }
            for k, have in iteritems(haved):
                self._compare(want={}, have=have)
            wantd = {}

        # remove superfluous config for overridden
        if self.state == "overridden":
            for k, have in iteritems(haved):
                if k not in wantd:
                    self._compare(want={}, have=have)

        for k, want in iteritems(wantd):
            self._compare(want=want, have=haved.pop(k, {}))
예제 #10
0
    def generate_commands(self):
        """Generate configuration commands to send based on
        want, have and desired state.
        """
        wantd = {entry["afi"]: entry for entry in self.want}

        haved = {entry["afi"]: entry for entry in self.have}

        # Convert each of config list to dict
        for each in wantd, haved:
            self.list_to_dict(each)

        # if state is merged, merge want onto have and then compare
        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        # if state is deleted, empty out wantd and set haved to wantd
        if self.state == "deleted":
            temp = None
            for k, v in iteritems(haved):
                if k in wantd:
                    if wantd[k].get("prefix_lists"):
                        want_afi_name = wantd[k].get("prefix_lists", {})
                        haved[k]["prefix_lists"] = {
                            key: val
                            for key, val in iteritems(v.get("prefix_lists"))
                            if key in want_afi_name
                        }
                elif wantd:
                    temp = k
            if temp:
                haved.pop(k)
            wantd = {}
            for k, have in iteritems(haved):
                for key, val in iteritems(have["prefix_lists"]):
                    if k == "ipv4":
                        k = "ip"
                    self.commands.append(
                        "no {0} prefix-list {1}".format(k, key),
                    )

        # remove superfluous config for overridden and deleted
        if self.state in ["overridden", "deleted"]:
            for k, have in iteritems(haved):
                want_afi = wantd.get(k, {})
                for key, val in iteritems(have["prefix_lists"]):
                    if k == "ipv4":
                        k = "ip"
                    if want_afi and key not in want_afi.get("prefix_lists"):
                        self.commands.append(
                            "no {0} prefix-list {1}".format(k, key),
                        )

        for k, want in iteritems(wantd):
            self._compare(want=want, have=haved.pop(k, {}))
        # alligning cmd with negate cmd 1st followed by config cmd
        if self.state in ["overridden", "replaced"]:
            self.commands = [each for each in self.commands if "no" in each] + [
                each for each in self.commands if "no" not in each
            ]
    def generate_commands(self):
        """ Generate configuration commands to send based on
            want, have and desired state.
        """
        if self.state in ["deleted", "replaced"]:
            self._build_af_data()

        for entry in self.want, self.have:
            self._bgp_list_to_dict(entry)

        # if state is deleted, clean up global params
        if self.state == "deleted":
            if not self.want or (self.have.get("as_number")
                                 == self.want.get("as_number")):
                self._compare(want={}, have=self.have)

        elif self.state == "purged":
            if not self.want or (self.have.get("as_number")
                                 == self.want.get("as_number")):
                self.addcmd(self.have or {}, "as_number", True)

        else:
            wantd = self.want
            # if state is merged, merge want onto have and then compare
            if self.state == "merged":
                wantd = dict_merge(self.have, self.want)

            self._compare(want=wantd, have=self.have)
예제 #12
0
    def generate_commands(self):
        """ Generate configuration commands to send based on
            want, have and desired state.
        """

        wantd = {
            entry["vrf"]: entry for entry in self.want.get("processes", [])
        }
        haved = {
            entry["vrf"]: entry for entry in self.have.get("processes", [])
        }

        # turn all lists of dicts into dicts prior to merge
        for entry in wantd, haved:
            self._ospf_list_to_dict(entry)
        # if state is merged, merge want onto have and then compare
        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        # if state is deleted, empty out wantd and set haved to wantd
        if self.state == "deleted":
            haved = {
                k: v for k, v in iteritems(haved) if k in wantd or not wantd
            }
            wantd = {}

        # remove superfluous config for overridden and deleted
        if self.state in ["overridden", "deleted"]:
            for k, have in iteritems(haved):
                if k not in wantd and have.get("vrf") == k:
                    self.commands.append(self._tmplt.render(have, "vrf", True))

        for k, want in iteritems(wantd):
            self._compare(want=want, have=haved.pop(k, {}))
예제 #13
0
    def generate_commands(self):
        """ Generate configuration commands to send based on
            want, have and desired state.
        """
        wantd = self._route_maps_list_to_dict(self.want)
        haved = self._route_maps_list_to_dict(self.have)

        # if state is merged, merge want onto have and then compare
        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        # if state is deleted, empty out wantd and set haved to wantd
        if self.state == "deleted":
            haved = {
                k: v
                for k, v in iteritems(haved) if k in wantd or not wantd
            }
            wantd = {}

        # remove superfluous config for overridden and deleted
        if self.state in ["overridden", "deleted"]:
            for k, have in iteritems(haved):
                if k not in wantd:
                    for _hk, hentry in iteritems(have.get("entries", {})):
                        self.commands.append(
                            self._tmplt.render(hentry, "route_map", True))

        for wk, want in iteritems(wantd):
            self._compare(want=want, have=haved.pop(wk, {}))
예제 #14
0
def test_dict_merge():
    base = dict(
        obj2=dict(),
        b1=True,
        b2=False,
        b3=False,
        one=1,
        two=2,
        three=3,
        obj1=dict(key1=1, key2=2),
        l1=[1, 3],
        l2=[1, 2, 3],
        l4=[4],
        nested=dict(n1=dict(n2=2)),
    )

    other = dict(
        b1=True,
        b2=False,
        b3=True,
        b4=True,
        one=1,
        three=4,
        four=4,
        obj1=dict(key1=2),
        l1=[2, 1],
        l2=[3, 2, 1],
        l3=[1],
        nested=dict(n1=dict(n2=2, n3=3)),
    )

    result = dict_merge(base, other)

    # string assertions
    assert "one" in result
    assert "two" in result
    assert result["three"] == 4
    assert result["four"] == 4

    # dict assertions
    assert "obj1" in result
    assert "key1" in result["obj1"]
    assert "key2" in result["obj1"]

    # list assertions
    assert result["l1"] == [1, 2, 3]
    assert "l2" in result
    assert result["l3"] == [1]
    assert "l4" in result

    # nested assertions
    assert "obj1" in result
    assert result["obj1"]["key1"] == 2
    assert "key2" in result["obj1"]

    # bool assertions
    assert "b1" in result
    assert "b2" in result
    assert result["b3"]
    assert result["b4"]
예제 #15
0
    def generate_commands(self):
        """Generate configuration commands to send based on
        want, have and desired state.
        """

        wantd = {"snmp_server": self.want}
        haved = {"snmp_server": self.have}

        # turn all lists of dicts into dicts prior to merge
        for entry in wantd["snmp_server"], haved["snmp_server"]:
            self._snmp_server_list_to_dict(entry)

        # if state is merged, merge want onto have and then compare
        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        # if state is deleted, empty out wantd and set haved to wantd
        if self.state == "deleted":
            haved = {
                k: v
                for k, v in iteritems(haved) if k in wantd or not wantd
            }
            wantd = {}

        # if state is deleted, empty out wantd and set haved to wantd
        if self.state == "deleted":
            wantd = {}
            for k, have in iteritems(haved):
                self._compare(want={}, have=have)

        for k, want in iteritems(wantd):
            self._compare(want=want, have=haved.pop(k, {}))
예제 #16
0
    def generate_commands(self):
        """Generate configuration commands to send based on
        want, have and desired state.
        """
        wantd = self.list_to_dict(self.want)
        haved = self.list_to_dict(self.have)

        # if state is merged, merge want onto have and then compare
        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        # if state is deleted, empty out wantd and set haved to wantd
        if self.state == "deleted":
            haved = {
                k: v for k, v in iteritems(haved) if k in wantd or not wantd
            }
            wantd = {}

        # remove superfluous config for overridden and deleted
        if self.state in ["overridden", "deleted"]:
            for k, have in iteritems(haved):
                if k not in wantd:
                    self._compare(wants={}, haveing=have)

        for k, want in iteritems(wantd):
            self._compare(wants=want, haveing=haved.pop(k, {}))
예제 #17
0
    def generate_commands(self):
        """Generate configuration commands to send based on
        want, have and desired state.
        """
        wantd = {entry["name"]: entry for entry in self.want}
        haved = {entry["name"]: entry for entry in self.have}

        # if state is merged, merge want onto have and then compare
        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        # if state is deleted, empty out wantd and set haved to wantd
        if self.state in ["deleted", "purged"]:
            haved = {
                k: v
                for k, v in iteritems(haved) if k in wantd or not wantd
            }
            wantd = {}

        # remove superfluous config for overridden and deleted
        if self.state in ["overridden", "deleted"]:
            for k, have in iteritems(haved):
                if k not in wantd:
                    self._compare(want={}, have=have)

        if self.state == "purged":
            for k, have in iteritems(haved):
                self.purge(have)
        else:
            for k, want in iteritems(wantd):
                self._compare(want=want, have=haved.pop(k, {}))
예제 #18
0
파일: ogs.py 프로젝트: jvanderaa/cisco.asa
    def gen_config(self):
        """ Select the appropriate function based on the state provided
        :rtype: A list
        :returns: the commands necessary to migrate the current configuration
                  to the desired configuration
        """
        if self.want:
            wantd = {(entry["object_type"]): entry for entry in self.want}
        else:
            wantd = {}
        if self.have:
            haved = {(entry["object_type"]): entry for entry in self.have}
        else:
            haved = {}
        obj_gp = {}

        for k, v in wantd.items():
            temp = {}
            for each in v.get("object_groups"):
                temp[each.get("name")] = each
                temp["object_type"] = k
                obj_gp[k] = temp
        if obj_gp:
            wantd = obj_gp
            obj_gp = {}
        for k, v in haved.items():
            temp = {}
            for each in v.get("object_groups"):
                temp[each.get("name")] = each
                temp["object_type"] = k
                obj_gp[k] = temp
        if obj_gp:
            haved = obj_gp
        # if state is merged, merge want onto have
        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        # if state is deleted, limit the have to anything in want
        # set want to nothing
        if self.state == "deleted":
            haved = {
                k: v
                for k, v in iteritems(haved) if k in wantd or not wantd
            }
            wantd = {}

        # delete processes first so we do run into "more than one" errors
        if self.state in ["overridden", "deleted"]:
            for k, have in iteritems(haved):
                if k not in wantd:
                    for each_key, each_val in iteritems(have):
                        if each_key != "object_type":
                            each_val.update(
                                {"object_type": have.get("object_type")})
                            self.addcmd(each_val, "og_name", True)

        for k, want in iteritems(wantd):
            self._compare(want=want, have=haved.pop(k, {}))
예제 #19
0
    def generate_commands(self):
        """ Generate configuration commands to send based on
            want, have and desired state.
        """
        wantd = deepcopy(self.want)
        haved = deepcopy(self.have)

        self._bgp_af_list_to_dict(wantd)
        self._bgp_af_list_to_dict(haved)

        # if state is merged, merge want onto have and then compare
        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        wantd = remove_empties(wantd)
        haved = remove_empties(haved)

        have_af = haved.get("address_family", {})
        want_af = wantd.get("address_family", {})
        wvrfs = wantd.get("vrfs", {})
        hvrfs = haved.get("vrfs", {})

        # if state is overridden or deleted, remove superfluos config
        if self.state in ["deleted", "overridden"]:
            if (haved and haved["as_number"]
                    == wantd.get("as_number")) or not wantd:
                remove = True if self.state == "deleted" else False
                purge = True if not wantd else False
                self._remove_af(want_af, have_af, remove=remove, purge=purge)

                for k, hvrf in iteritems(hvrfs):
                    wvrf = wvrfs.get(k, {})
                    self._remove_af(wvrf,
                                    hvrf,
                                    vrf=k,
                                    remove=remove,
                                    purge=purge)

        if self.state in ["merged", "replaced", "overridden", "rendered"]:
            for k, want in iteritems(want_af):
                self._compare(want=want, have=have_af.pop(k, {}))

            # handle vrf->af
            for wk, wvrf in iteritems(wvrfs):
                cur_ptr = len(self.commands)

                hvrf = hvrfs.pop(wk, {})
                for k, want in iteritems(wvrf):
                    self._compare(want=want, have=hvrf.pop(k, {}))

                # add VRF command at correct position once
                if cur_ptr != len(self.commands):
                    self.commands.insert(cur_ptr, "vrf {0}".format(wk))

        if self.commands:
            self.commands.insert(
                0, "router bgp {as_number}".format(**haved or wantd))
 def parse(self):
     """parse"""
     result = {}
     shared = {}
     for line in self._lines:
         for parser in self._tmplt.PARSERS:
             cap = re.match(parser["getval"], line)
             if cap:
                 capdict = cap.groupdict()
                 capdict = dict(
                     (k, v) for k, v in capdict.items() if v is not None)
                 if parser.get("shared"):
                     shared = capdict
                 vals = dict_merge(capdict, shared)
                 res = self._deepformat(deepcopy(parser["result"]), vals)
                 result = dict_merge(result, res)
                 break
     return result
예제 #21
0
def test_dict_merge():
    base = dict(obj2=dict(),
                b1=True,
                b2=False,
                b3=False,
                one=1,
                two=2,
                three=3,
                obj1=dict(key1=1, key2=2),
                l1=[1, 3],
                l2=[1, 2, 3],
                l4=[4],
                nested=dict(n1=dict(n2=2)))

    other = dict(b1=True,
                 b2=False,
                 b3=True,
                 b4=True,
                 one=1,
                 three=4,
                 four=4,
                 obj1=dict(key1=2),
                 l1=[2, 1],
                 l2=[3, 2, 1],
                 l3=[1],
                 nested=dict(n1=dict(n2=2, n3=3)))

    result = dict_merge(base, other)

    # string assertions
    assert 'one' in result
    assert 'two' in result
    assert result['three'] == 4
    assert result['four'] == 4

    # dict assertions
    assert 'obj1' in result
    assert 'key1' in result['obj1']
    assert 'key2' in result['obj1']

    # list assertions
    assert result['l1'] == [1, 2, 3]
    assert 'l2' in result
    assert result['l3'] == [1]
    assert 'l4' in result

    # nested assertions
    assert 'obj1' in result
    assert result['obj1']['key1'] == 2
    assert 'key2' in result['obj1']

    # bool assertions
    assert 'b1' in result
    assert 'b2' in result
    assert result['b3']
    assert result['b4']
예제 #22
0
파일: ospfv3.py 프로젝트: qqlive/cisco.ios
    def parse(self, net_template_obj):
        """ Overrided network template parse
        """
        result = {}
        shared = {}
        temp_pid = None
        for line in net_template_obj._lines:
            for parser in net_template_obj._tmplt.PARSERS:
                cap = re.match(parser["getval"], line)
                if cap:
                    capdict = cap.groupdict()
                    temp = {}
                    for k, v in iteritems(capdict):
                        if v is not None:
                            temp.update({k: v})
                    capdict = temp
                    if "address-family" in line:
                        capdict.update({"id": temp_pid})
                    if (
                        "manet" in line
                        and "pid" not in shared
                        and shared.get("unicast")
                    ):
                        del shared["unicast"]

                    if "router ospfv3" in line:
                        temp_pid = None
                    if parser.get("shared"):
                        shared = capdict
                    if not temp_pid and (
                        shared.get("pid") or shared.get("id")
                    ):
                        temp_pid = shared.get("pid") or shared.get("id")
                    vals = utils.dict_merge(capdict, shared)
                    try:
                        res = net_template_obj._deepformat(
                            deepcopy(parser["result"]), vals
                        )
                    except Exception:
                        continue
                    result = utils.dict_merge(result, res)
                    break
        return result
예제 #23
0
    def generate_commands(self):
        """ Generate configuration commands to send based on
            want, have and desired state.
        """
        if self.want:
            wantd = {}
            for each in self.want:
                wantd.update({each["name"]: each})
        else:
            wantd = {}
        if self.have:
            haved = {}
            for each in self.have:
                haved.update({each["name"]: each})
        else:
            haved = {}

        for each in wantd, haved:
            self.list_to_dict(each)

        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        if self.state == "deleted":
            temp = {}
            for k, v in iteritems(haved):
                if k in wantd or not wantd:
                    temp.update({k: v})
            haved = temp
            wantd = {}

        if self.state in ["overridden", "deleted"]:
            for k, have in iteritems(haved):
                if k not in wantd and (have.get("ipv4") or have.get("ipv6")):
                    self.addcmd(have, "name", False)
                    self.delete_l3_attributes(have)

        for k, want in iteritems(wantd):
            self._compare(want=want, have=haved.pop(k, {}))

        if self.state == "overridden" or self.state == "replaced":
            temp = []
            temp_cmd = []
            for each in self.commands:
                if "interface" in each:
                    if temp_cmd:
                        temp.extend(sorted(temp_cmd)[::-1])
                        temp_cmd = []
                    temp.append(each)
                if "interface" not in each:
                    temp_cmd.append(each)
            if temp_cmd:
                temp.extend(sorted(temp_cmd)[::-1])
            self.commands = temp
예제 #24
0
    def generate_commands(self):
        """ Generate configuration commands to send based on
            want, have and desired state.
        """
        if self.want:
            wantd = {self.want["as_number"]: self.want}
        else:
            wantd = {}
        if self.have:
            haved = {self.have["as_number"]: self.have}
        else:
            haved = {}

        wantd, haved = self.list_to_dict(wantd, haved)
        # if state is merged, merge want onto have and then compare
        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        # if state is deleted, empty out wantd and set haved to wantd
        if self.state == "deleted" and self.have:
            if (
                not self.want
                or self.have.get("as_number") == self.want.get("as_number")
                and len(self.have) > 1
            ):
                self.addcmd(
                    {"as_number": haved[list(haved)[0]].pop("as_number")},
                    "as_number",
                    False,
                )
                self.compare(
                    parsers=self.parsers, want={}, have=haved[list(haved)[0]]
                )
                self._compare(want={}, have=haved[list(haved)[0]])
                self._list_params_compare(want={}, have=haved[list(haved)[0]])
            wantd = {}

        if self.state == "purged" and self.have:
            if (
                not self.want
                or (self.have.get("as_number") == self.want.get("as_number"))
                and len(self.have) >= 1
            ):
                self.addcmd(
                    {"as_number": haved[list(haved)[0]].pop("as_number")},
                    "as_number",
                    True,
                )
                wantd = {}

        for k, want in iteritems(wantd):
            self._compare(want=want, have=haved.pop(k, {}))
    def generate_commands(self):
        """Generate configuration commands to send based on
        want, have and desired state.
        """
        wantd = self._logging_list_to_dict(self.want)
        haved = self._logging_list_to_dict(self.have)

        if self.state == "deleted":
            # empty out want (in case something was specified)
            # some items are populated later on for correct removal
            wantd = {}

        # pre-process `event.x.y` keys
        for x in self.parsers[4:7]:
            have_k = get_from_dict(haved, x)
            want_k = get_from_dict(wantd, x)
            if have_k is None and want_k is not None:
                # set have to True to mimic default state
                # this allows negate commands to be issued
                self.__update_dict(haved, x)
            if all((
                    self.state in self._state_set,
                    have_k is False,
                    want_k is None,
            ), ):
                # if want is missing and have is negated
                # set want to True in order to revert to default state
                self.__update_dict(wantd, x)

        # if state is merged, merge want onto have and then compare
        if self.state == "merged":
            for x in self.parsers[0:4]:
                hstate = haved.get(x, {}).get("state", "")
                wstate = wantd.get(x, {}).get("state", "")
                if hstate == "disabled" and not wstate:
                    # this ensures that updates are done
                    # with correct `state`
                    if wantd.get(x, {}):
                        wantd[x].update({"state": "enabled"})
            wantd = dict_merge(haved, wantd)

        if self.state in self._state_set:
            # set default states for keys that appear in negated form
            for x in self.parsers[0:3]:
                if x in haved and x not in wantd:
                    wantd[x] = {"state": "enabled"}
            if "rate_limit" in haved and "rate_limit" not in wantd:
                wantd["rate_limit"] = "enabled"
            if "logfile" in haved and "logfile" not in wantd:
                wantd["logfile"] = {"name": "messages", "severity": 5}

        self._compare(want=wantd, have=haved)
예제 #26
0
    def generate_commands(self):
        """Generate configuration commands to send based on
        want, have and desired state.
        """
        wantd = self._ntp_list_to_dict(self.want)
        haved = self._ntp_list_to_dict(self.have)

        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        if self.state == "deleted":
            wantd = {}

        self._compare(want=wantd, have=haved)
예제 #27
0
    def generate_commands(self):
        """Generate configuration commands to send based on
        want, have and desired state.
        """
        wantd = self._list_to_dict(self.want)
        haved = self._list_to_dict(self.have)

        # if state is merged, merge want onto have and then compare
        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        # this ensures that if user sets `enable: True` for a trap
        # all suboptions for that trap are set to True
        for x in [
                "traps.aaa",
                "traps.bridge",
                "traps.callhome",
                "traps.cfs",
                "traps.config",
                "traps.entity",
                "traps.feature_control",
                "traps.generic",
                "traps.license",
                "traps.link",
                "traps.mmode",
                "traps.rf",
                "traps.rmon",
                "traps.snmp",
                "traps.storm_control",
                "traps.stpx",
                "traps.syslog",
                "traps.sysmgr",
                "traps.system",
                "traps.upgrade",
                "traps.vtp",
        ]:
            entry = get_from_dict(wantd, x)
            if entry and entry.get("enable", False):
                key = x.split(".")
                wantd[key[0]][key[1]].pop("enable")
                for i in self.parsers:
                    if i.startswith(x):
                        key = i.split(".")
                        wantd[key[0]][key[1]][key[2]] = True

        # if state is deleted, empty out wantd and set haved to wantd
        if self.state == "deleted":
            wantd = {}

        self._compare(want=wantd, have=haved)
예제 #28
0
    def generate_commands(self):
        """Generate configuration commands to send based on
        want, have and desired state.
        """
        wantd = {}
        haved = {}
        for entry in self.want:
            wantd.update({entry["name"]: entry})
        for entry in self.have:
            haved.update({entry["name"]: entry})

        # turn all lists of dicts into dicts prior to merge
        for entry in wantd, haved:
            self._ospf_int_list_to_dict(entry)
        # if state is merged, merge want onto have and then compare
        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        # if state is deleted, empty out wantd and set haved to wantd
        if self.state == "deleted":
            h_del = {}
            for k, v in iteritems(haved):
                if k in wantd or not wantd:
                    h_del.update({k: v})
            haved = h_del
            have_int = []
            for k, have in iteritems(haved):
                if k in wantd:
                    have_int.append(k)
                    self._remove_ospf_int(have)
            wantd = {}

        if self.state == "overridden":
            have_int = []
            for k, have in iteritems(haved):
                if k not in wantd:
                    have_int.append(k)
                    self._remove_ospf_int(have)

        # remove superfluous config for overridden and deleted
        if self.state in ["overridden", "deleted"]:
            # removing the interfaces from haved that are already negated
            for interface in have_int:
                haved.pop(interface)
            for k, have in iteritems(haved):
                if k not in wantd:
                    self._compare(want={}, have=have)

        for k, want in iteritems(wantd):
            self._compare(want=want, have=haved.pop(k, {}))
예제 #29
0
def compare_arrays(old_params, new_params, param_name):
    old = old_params.get(param_name) or []
    new = new_params.get(param_name) or []

    oldd = {}
    for item in old:
        name = item['name']
        oldd[name] = item
    newd = {}
    for item in new:
        name = item['name']
        newd[name] = item

    newd = dict_merge(oldd, newd)
    return newd == oldd
예제 #30
0
    def generate_commands(self):
        """Generate configuration commands to send based on
        want, have and desired state.
        """
        wantd = self._snmp_list_to_dict(self.want)
        haved = self._snmp_list_to_dict(self.have)

        # if state is merged, merge want onto have and then compare
        if self.state == "merged":
            wantd = dict_merge(haved, wantd)

        # if state is deleted, empty out wantd and set haved to wantd
        if self.state == "deleted":
            wantd = {}

        self._compare(want=wantd, have=haved)