diff --git a/config/facsimile/peeringdb.yaml b/config/facsimile/peeringdb.yaml index b06e4084..64d9e5df 100644 --- a/config/facsimile/peeringdb.yaml +++ b/config/facsimile/peeringdb.yaml @@ -152,6 +152,8 @@ install: - $SRC_DIR$/peeringdb_server/migrations/0014_clt_description.py - $SRC_DIR$/peeringdb_server/migrations/0015_email_address.py - $SRC_DIR$/peeringdb_server/migrations/0016_auto_20190110_2321.py + - $SRC_DIR$/peeringdb_server/migrations/0017_ixf_ixp_import_enabled.py + - $SRC_DIR$/peeringdb_server/migrations/0018_set_ixf_ixp_import_enabled.py - $SRC_DIR$/fixtures/initial_data.json - $SRC_DIR$/peeringdb_server/templates/admin/admin_extended.html - $SRC_DIR$/peeringdb_server/templates/admin/user-organizations.html diff --git a/peeringdb_server/ixf.py b/peeringdb_server/ixf.py index 45df541b..f5d864ab 100644 --- a/peeringdb_server/ixf.py +++ b/peeringdb_server/ixf.py @@ -56,8 +56,7 @@ class Importer(object): return {"pdb_error": exc} if result.status_code != 200: - # FIXME: log error somewhere - return None + return {"pdb_error": "Got HTTP status {}".format(result.status_code)} try: data = result.json() diff --git a/peeringdb_server/management/commands/pdb_ixf_ixp_member_import.py b/peeringdb_server/management/commands/pdb_ixf_ixp_member_import.py index eeae475c..0b62eee2 100644 --- a/peeringdb_server/management/commands/pdb_ixf_ixp_member_import.py +++ b/peeringdb_server/management/commands/pdb_ixf_ixp_member_import.py @@ -21,9 +21,9 @@ class Command(BaseCommand): def log(self, msg): if self.commit: - print(msg) + self.stdout.write(msg) else: - print("[Pretend] {}".format(msg)) + self.stdout.write("[Pretend] {}".format(msg)) def handle(self, *args, **options): self.commit = options.get("commit", False) @@ -33,6 +33,12 @@ class Command(BaseCommand): if only_id: q = q.filter(id=only_id) for ixlan in q: + + # if the ixlan has ix-f imports disabled we skip it + if not ixlan.ixf_ixp_import_enabled: + self.log("IX-F import disabled on ixlan {}, skippig..".format(ixlan.id)) + continue + self.log("Fetching data for {} from {}".format( ixlan, ixlan.ixf_ixp_member_list_url)) try: diff --git a/peeringdb_server/migrations/0017_ixf_ixp_import_enabled.py b/peeringdb_server/migrations/0017_ixf_ixp_import_enabled.py new file mode 100644 index 00000000..6dc21a47 --- /dev/null +++ b/peeringdb_server/migrations/0017_ixf_ixp_import_enabled.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.15 on 2019-03-20 08:02 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('peeringdb_server', '0016_auto_20190110_2321'), + ] + + operations = [ + migrations.AddField( + model_name='ixlan', + name='ixf_ixp_import_enabled', + field=models.BooleanField(default=False), + ), + ] diff --git a/peeringdb_server/migrations/0018_set_ixf_ixp_import_enabled.py b/peeringdb_server/migrations/0018_set_ixf_ixp_import_enabled.py new file mode 100644 index 00000000..067f4bec --- /dev/null +++ b/peeringdb_server/migrations/0018_set_ixf_ixp_import_enabled.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.15 on 2019-03-20 08:09 +from __future__ import unicode_literals + +from django.db import migrations, models + +def forwards_func(apps, schema_editor): + model = apps.get_model("peeringdb_server", "IXLan") + for ixlan in model.objects.all(): + if ixlan.ixf_ixp_member_list_url: + ixlan.ixf_ixp_import_enabled = True + ixlan.save() + +class Migration(migrations.Migration): + + dependencies = [ + ('peeringdb_server', '0017_ixf_ixp_import_enabled'), + ] + + operations = [ + migrations.AlterModelManagers( + name='ixlan', + managers=[], + ), + migrations.RunPython(forwards_func, migrations.RunPython.noop), + ] diff --git a/peeringdb_server/models.py b/peeringdb_server/models.py index f94c4cd1..a99f05fd 100644 --- a/peeringdb_server/models.py +++ b/peeringdb_server/models.py @@ -1314,6 +1314,7 @@ class IXLan(pdb_models.IXLanBase): ix = models.ForeignKey(InternetExchange, default=0, related_name="ixlan_set") ixf_ixp_member_list_url = models.URLField(null=True, blank=True) + ixf_ixp_import_enabled = models.BooleanField(default=False) # FIXME: delete cascade needs to be fixed in django-peeringdb, can remove # this afterwards diff --git a/peeringdb_server/serializers.py b/peeringdb_server/serializers.py index 8547fc8e..c9ccead8 100644 --- a/peeringdb_server/serializers.py +++ b/peeringdb_server/serializers.py @@ -1547,13 +1547,15 @@ class IXLanSerializer(ModelSerializer): fields = [ 'id', 'ix_id', "ix", "name", "descr", "mtu", "dot1q_support", "rs_asn", "arp_sponge", "net_set", "ixpfx_set", - "ixf_ixp_member_list_url" + "ixf_ixp_member_list_url", "ixf_ixp_import_enabled", ] + HandleRefSerializer.Meta.fields related_fields = ["ix", "net_set", "ixpfx_set"] list_exclude = ["ix"] - extra_kwargs = {"ixf_ixp_member_list_url": {"write_only": True}} + extra_kwargs = {"ixf_ixp_member_list_url": {"write_only": True}, + "ixf_ixp_import_enabled": {"write_only": True}, + } _ref_tag = model.handleref.tag diff --git a/peeringdb_server/static/peeringdb.js b/peeringdb_server/static/peeringdb.js index 39a734c5..c7653744 100644 --- a/peeringdb_server/static/peeringdb.js +++ b/peeringdb_server/static/peeringdb.js @@ -825,6 +825,7 @@ twentyc.editable.module.register( add : function(id, trigger, container, data, context) { var me =this; + var sentData = data; this.target.data = data; this.target.args[2] = "update" this.target.context = this.components.add || context; @@ -835,7 +836,7 @@ twentyc.editable.module.register( me[finalizer](data, function(data) { me.listing_add(data.id, trigger, container, data); container.editable("loading-shim","hide"); - }); + }, sentData); } else { me.listing_add(data.id, trigger, container, data); } @@ -1024,6 +1025,16 @@ twentyc.editable.module.register( // FINALIZERS: IXLAN + finalize_add_ixlan : function(data, callback, sentData) { + + // we currently do not publish ix-f setting fields on the API + // so we need to set those from sent data + data.ixf_ixp_member_list_url = sentData.ixf_ixp_member_list_url; + data.ixf_ixp_import_enabled = sentData.ixf_ixp_import_enabled; + callback(data); + }, + + finalize_row_ixlan : function(rowId, row, data) { row.editable("payload", { ix_id : data.ix_id diff --git a/peeringdb_server/static/site.css b/peeringdb_server/static/site.css index 24beca74..681ed485 100644 --- a/peeringdb_server/static/site.css +++ b/peeringdb_server/static/site.css @@ -92,6 +92,10 @@ span.tiny.suffix { margin-top: 60px; } +.marg-top-80 { + margin-top: 80px; +} + .pad-left-15 { padding-left: 15px; } @@ -158,8 +162,8 @@ h5 { } -.btn-primary, -.btn-default { +.btn-primary, +.btn-default { background-color: #33744a; margin-left: 10px; color: #ffffff; @@ -177,21 +181,21 @@ h5 { .btn-default:hover { background-color: #4b6063 !important; color: #ffffff !important; -} +} .btn:active, .btn-pimary:active, .btn-default:active { background-color: #4b6063 !important; color: #ffffff !important; -} +} .btn:focus, .btn-pimary:focus, .btn-default:focus { background-color: #4b6063 !important; color: #ffffff !important; -} +} /* error */ @@ -242,7 +246,7 @@ div.header div.nav div.user { div.header div.nav div.user div.status { font-size:11px; font-weight: normal; - color: #00203e; + color: #00203e; } div.header div.nav a.btn { @@ -259,15 +263,15 @@ div.header div.nav a.btn { div.header div.nav a.btn:active { background-color: #4b6063; -} +} div.header div.nav a.btn:focus { background-color: #4b6063; -} +} div.header div.nav a.btn:hover { background-color: #4b6063; -} +} div.header div.nav div.dropdown { @@ -1103,7 +1107,7 @@ div.advanced-search-view div.results div.row div { div.advanced-search-view div.headers .sort-asc:after { content: url('ico-down-arrow.png'); - color: #fff; + color: #fff; } div.advanced-search-view div.headers .sort-desc:after { content: url('ico-up-arrow.png'); diff --git a/peeringdb_server/templates/site/view_exchange_assets.html b/peeringdb_server/templates/site/view_exchange_assets.html index a832f076..214b7331 100644 --- a/peeringdb_server/templates/site/view_exchange_assets.html +++ b/peeringdb_server/templates/site/view_exchange_assets.html @@ -6,20 +6,20 @@ {% if permissions.can_delete %} × {% endif %} -
+
+ {% trans "Enable IX-F Import" %}
+