Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Google parser #260

Merged
merged 1 commit into from
Jan 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ By default, there is a `GenericProvider` that supports a `SimpleProcessor` using
- Equinix
- EXA (formerly GTT)
- HGC
- Google
- Lumen
- Megaport
- Momentum
Expand Down
2 changes: 2 additions & 0 deletions circuit_maintenance_parser/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
Equinix,
EUNetworks,
GTT,
Google,
HGC,
Lumen,
Megaport,
Expand Down Expand Up @@ -43,6 +44,7 @@
CrownCastle,
Equinix,
EUNetworks,
Google,
GTT,
HGC,
Lumen,
Expand Down
44 changes: 44 additions & 0 deletions circuit_maintenance_parser/parsers/google.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
"""Google parser."""
import logging
import re
from datetime import datetime

from circuit_maintenance_parser.parser import Html, Impact, CircuitImpact, Status

# pylint: disable=too-many-nested-blocks, too-many-branches

logger = logging.getLogger(__name__)


class HtmlParserGoogle1(Html):
"""Notifications Parser for Google notifications."""

def parse_html(self, soup):
"""Execute parsing."""
data = {}
data["circuits"] = []
data["status"] = Status.CONFIRMED

for span in soup.find_all("span"):
if span.string is None:
continue
if span.string.strip() == "Start Time:":
dt_str = span.next_sibling.string.strip()
data["start"] = self.dt2ts(datetime.strptime(dt_str, "%Y-%m-%d %H:%M:%S %z UTC"))
elif span.string.strip() == "End Time:":
dt_str = span.next_sibling.string.strip()
data["end"] = self.dt2ts(datetime.strptime(dt_str, "%Y-%m-%d %H:%M:%S %z UTC"))
elif span.string.strip() == "Peer ASN:":
data["account"] = span.parent.next_sibling.string.strip()
elif span.string.strip() == "Google Neighbor Address(es):":
googleaddr = span.parent.next_sibling.string.strip()
elif span.string.strip() == "Peer Neighbor Address(es):":
cid = googleaddr + "-" + span.parent.next_sibling.string.strip()
data["circuits"].append(CircuitImpact(circuit_id=cid, impact=Impact.OUTAGE))

summary = list(soup.find("div").find("div").strings)[-1].strip()
match = re.search(r" - Reference (.*)$", summary)
data["summary"] = summary
data["maintenance_id"] = match[1]

return [data]
10 changes: 10 additions & 0 deletions circuit_maintenance_parser/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
from circuit_maintenance_parser.parsers.crowncastle import HtmlParserCrownCastle1
from circuit_maintenance_parser.parsers.equinix import HtmlParserEquinix, SubjectParserEquinix
from circuit_maintenance_parser.parsers.gtt import HtmlParserGTT1
from circuit_maintenance_parser.parsers.google import HtmlParserGoogle1
from circuit_maintenance_parser.parsers.hgc import HtmlParserHGC1, HtmlParserHGC2, SubjectParserHGC1
from circuit_maintenance_parser.parsers.lumen import HtmlParserLumen1
from circuit_maintenance_parser.parsers.megaport import HtmlParserMegaport1
Expand Down Expand Up @@ -252,6 +253,15 @@ class EUNetworks(GenericProvider):
_default_organizer = "[email protected]"


class Google(GenericProvider):
"""Google provider custom class."""

_processors: List[GenericProcessor] = [
CombinedProcessor(data_parsers=[EmailDateParser, HtmlParserGoogle1]),
]
_default_organizer = "[email protected]"


class GTT(GenericProvider):
"""EXA (formerly GTT) provider custom class."""

Expand Down
64 changes: 64 additions & 0 deletions tests/unit/data/google/google1.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<div style="font-family: 'Open Sans', sans-serif;">
<div style="font-weight: bold; font-size: larger;"><span style="color: rgb(51, 105, 232);">G</span><span style="color: rgb(213, 15, 37);">o</span><span style="color: rgb(238, 178, 17);">o</span><span style="color:rgb(51, 105, 232);">g</span><span style="color: rgb(0, 153, 37);">l</span><span style="color: rgb(213, 15, 37);">e</span> Network Maintenance Notification - Reference PCR/123456</div>
<hr />

<div style="font-size: smaller;">
This message was sent to: [[email protected]]<br />
This address was selected from the <a href="http://peering.google.com/">Google ISP Portal</a>. You can update your preferences by navigating to "Configuration > Contacts" and adjusting Email Subscriptions for each user. You can find additional details about Contacts <a href="https://support.google.com/interconnect/answer/7658597?hl=en&ref_topic=7650153">here</a>.
</div>

<br />
<br />

<span style="font-weight: bold;">Details:</span><br />
<span style="font-weight: bold;">Start Time:</span> 2023-12-05 20:55:00 &#43;0000 UTC<br />
<span style="font-weight: bold;">End Time:</span> 2023-12-06 05:05:00 &#43;0000 UTC<br />
<span style="font-weight: bold;">Duration:</span> 8h10m0s<br />
<table>
<tr>
<td><span style="font-weight: bold;">Google ASN:</span></td><td>15169</td>
<td><span style="font-weight: bold;">Peer ASN:</span></td><td>65001</td>
</tr>
=20
<tr style="vertical-align: top;">
<td><span style="font-weight: bold;">Google Neighbor Address(es):</span></td><td>192.0.2.1</td>
<td><span style="font-weight: bold;">Peer Neighbor Address(es):</span></td><td>192.0.2.0</td>
</tr>
=20
<tr style="vertical-align: top;">
<td><span style="font-weight: bold;">Google Neighbor Address(es):</span></td><td>2001:db8::1</td>
<td><span style="font-weight: bold;">Peer Neighbor Address(es):</span></td><td>2001:db8::</td>
</tr>
=20
</table>

<p>
Google systems will automatically re-route the traffic away from the peering link(s) under maintenance.
</p>
<p>
Depending on the nature of the work, your BGP session with Google may stay up through the maintenance window. Traffic may shift to alternate sessions with Google and/or your upstream provider(s).
</p>
<p>
Questions about this event can be sent to [email protected].
</p>
<p>
Thank you for peering with <span style="color: rgb(51, 105, 232);">G</span><span style="color: rgb(213, 15, 37);">o</span><span style="color: rgb(238, 178, 17);">o</span><span style="color: rgb(51, 105, 232);">g</span><span style="color: rgb(0, 153, 37);">l</span><span style="color: rgb(213, 15, 37);">e</span>!<br />
</p>
<hr />
<br />
<div style="font-size: smaller; color: silver;">
PRIVILEGE AND CONFIDENTIALITY NOTICE: The information in this
e-mail communication and any attached documents may be privileged,
confidential or otherwise protected from disclosure and is intended only
for the use of the designated recipient(s). If the reader is neither the
intended recipient nor an employee or agent thereof who is responsible
for delivering it to the intended recipient, you are hereby notified
that any review, dissemination, distribution, copying or other use of
this communication is strictly prohibited. If you have received this
communication in error, please immediately notify us by return e-mail
and promptly delete the original electronic e-mail communication and
any attached documentation. Receipt by anyone other than the intended
recipient is not a waiver of any attorney-client or work-product
privilege.
</div>
</div>
20 changes: 20 additions & 0 deletions tests/unit/data/google/google1_parser_result.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
[
{
"account": "65001",
"circuits": [
{
"circuit_id": "192.0.2.1-192.0.2.0",
"impact": "OUTAGE"
},
{
"circuit_id": "2001:db8::1-2001:db8::",
"impact": "OUTAGE"
}
],
"end": 1701839100,
"maintenance_id": "PCR/123456",
"start": 1701809700,
"status": "CONFIRMED",
"summary": "Network Maintenance Notification - Reference PCR/123456"
}
]
157 changes: 157 additions & 0 deletions tests/unit/data/google/google2.eml
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
Date: Wed, 06 Dec 2023 00:40:05 +0000
Subject: [Scheduled] Google Planned Network Maintenance Notification - Reference PCR/123456
From: Google NOC <[email protected]>
Content-Type: multipart/alternative; boundary="000000000000a556e4060bffffff"

--000000000000a556e4060bffffff
Content-Type: text/plain; charset="UTF-8"; format=flowed; delsp=yes

Google Network Maintenance Notification - Reference PCR/123456


This message was sent to: [[email protected]]
This address was selected from the Google ISP Portal. You can update your
preferences by navigating to "Configuration > Contacts" and adjusting Email
Subscriptions for each user. You can find additional details about Contacts
here.


Details:
Start Time: 2023-12-05 20:55:00 +0000 UTC
End Time: 2023-12-06 05:05:00 +0000 UTC
Duration: 8h10m0s


Google ASN: 15169 Peer ASN: 65001

Google Neighbor Address(es): 192.0.2.1 Peer Neighbor Address(es):
192.0.2.0

Google Neighbor Address(es): 2001:db8::1 Peer Neighbor
Address(es): 2001:db8::


Google systems will automatically re-route the traffic away from the
peering link(s) under maintenance.

Depending on the nature of the work, your BGP session with Google may stay
up through the maintenance window. Traffic may shift to alternate sessions
with Google and/or your upstream provider(s).

Questions about this event can be sent to [email protected].

Thank you for peering with Google!



PRIVILEGE AND CONFIDENTIALITY NOTICE: The information in this e-mail
communication and any attached documents may be privileged, confidential or
otherwise protected from disclosure and is intended only for the use of the
designated recipient(s). If the reader is neither the intended recipient
nor an employee or agent thereof who is responsible for delivering it to
the intended recipient, you are hereby notified that any review,
dissemination, distribution, copying or other use of this communication is
strictly prohibited. If you have received this communication in error,
please immediately notify us by return e-mail and promptly delete the
original electronic e-mail communication and any attached documentation.
Receipt by anyone other than the intended recipient is not a waiver of any
attorney-client or work-product privilege.


--000000000000a556e4060bffffff
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable


<div style=3D"font-family: 'Open Sans', sans-serif;">
<div style=3D"font-weight: bold; font-size: larger;"><span style=3D"color=
: rgb(51, 105, 232);">G</span><span style=3D"color: rgb(213, 15, 37);">o</s=
pan><span style=3D"color: rgb(238, 178, 17);">o</span><span style=3D"color:=
rgb(51, 105, 232);">g</span><span style=3D"color: rgb(0, 153, 37);">l</spa=
n><span style=3D"color: rgb(213, 15, 37);">e</span> Network Maintenance No=
tification - Reference PCR/123456</div>
<hr />
=20
<div style=3D"font-size: smaller;">
This message was sent to: [[email protected]]<br />
This address was selected from the <a href=3D"http://peering.google.com/"=
>Google ISP Portal</a>. You can update your preferences by navigating to "C=
onfiguration > Contacts" and adjusting Email Subscriptions for each user. Y=
ou can find additional details about Contacts <a href=3D"https://support.go=
ogle.com/interconnect/answer/7658597?hl=3Den&ref_topic=3D7650153">here</a>.
</div>

<br />
<br />
=20
<span style=3D"font-weight: bold;">Details:</span><br />
<span style=3D"font-weight: bold;">Start Time:</span> 2023-12-05 20:55:00=
&#43;0000 UTC<br />
<span style=3D"font-weight: bold;">End Time:</span> 2023-12-06 05:05:00 &=
#43;0000 UTC<br />
<span style=3D"font-weight: bold;">Duration:</span> 8h10m0s<br />
<table>
<tr>
<td><span style=3D"font-weight: bold;">Google ASN:</span></td><td>151=
69</td>
<td><span style=3D"font-weight: bold;">Peer ASN:</span></td><td>65001<=
/td>
</tr>
=20
<tr style=3D"vertical-align: top;">
<td><span style=3D"font-weight: bold;">Google Neighbor Address(es):</=
span></td><td>192.0.2.1</td>
<td><span style=3D"font-weight: bold;">Peer Neighbor Address(es):</sp=
an></td><td>192.0.2.0</td>
</tr>
=20
<tr style=3D"vertical-align: top;">
<td><span style=3D"font-weight: bold;">Google Neighbor Address(es):</=
span></td><td>2001:db8::1</td>
<td><span style=3D"font-weight: bold;">Peer Neighbor Address(es):</sp=
an></td><td>2001:db8::</td>
</tr>
=20
</table>

<p>
Google systems will automatically re-route the traffic away from the peer=
ing link(s) under maintenance.
</p>
<p>
Depending on the nature of the work, your BGP session with Google may sta=
y up through the maintenance window. Traffic may shift to alternate session=
s with Google and/or your upstream provider(s).
</p>
<p>
Questions about this event can be sent to [email protected].
</p>
<p>
Thank you for peering with <span style=3D"color: rgb(51, 105, 232);">G</s=
pan><span style=3D"color: rgb(213, 15, 37);">o</span><span style=3D"color: =
rgb(238, 178, 17);">o</span><span style=3D"color: rgb(51, 105, 232);">g</sp=
an><span style=3D"color: rgb(0, 153, 37);">l</span><span style=3D"color: rg=
b(213, 15, 37);">e</span>!<br />
</p>
<hr />
<br />
<div style=3D"font-size: smaller; color: silver;">
PRIVILEGE AND CONFIDENTIALITY NOTICE: The information in this
e-mail communication and any attached documents may be privileged,
confidential or otherwise protected from disclosure and is intended onl=
y
for the use of the designated recipient(s). If the reader is neither th=
e
intended recipient nor an employee or agent thereof who is responsible
for delivering it to the intended recipient, you are hereby notified
that any review, dissemination, distribution, copying or other use of
this communication is strictly prohibited. If you have received this
communication in error, please immediately notify us by return e-mail
and promptly delete the original electronic e-mail communication and
any attached documentation. Receipt by anyone other than the intended
recipient is not a waiver of any attorney-client or work-product
privilege.
</div>
</div>

--000000000000a556e4060bffffff--
25 changes: 25 additions & 0 deletions tests/unit/data/google/google2_result.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
[
{
"account": "65001",
"circuits": [
{
"circuit_id": "192.0.2.1-192.0.2.0",
"impact": "OUTAGE"
},
{
"circuit_id": "2001:db8::1-2001:db8::",
"impact": "OUTAGE"
}
],
"end": 1701839100,
"maintenance_id": "PCR/123456",
"organizer": "[email protected]",
"provider": "google",
"sequence": 1,
"stamp": 1701823205,
"start": 1701809700,
"status": "CONFIRMED",
"summary": "Network Maintenance Notification - Reference PCR/123456",
"uid": "0"
}
]
11 changes: 11 additions & 0 deletions tests/unit/test_e2e.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
Colt,
CrownCastle,
EUNetworks,
Google,
GTT,
HGC,
Lumen,
Expand Down Expand Up @@ -420,6 +421,16 @@
Path(dir_path, "data", "hgc", "hgc2_result.json"),
],
),
# Google
(
Google,
[
("email", Path(dir_path, "data", "google", "google2.eml")),
],
[
Path(dir_path, "data", "google", "google2_result.json"),
],
),
# Lumen
(
Lumen,
Expand Down
Loading