diff --git a/AS1024.CommunityDocumentationPage/Controllers/HomeController.cs b/AS1024.CommunityDocumentationPage/Controllers/HomeController.cs index c4e2490..127ee02 100644 --- a/AS1024.CommunityDocumentationPage/Controllers/HomeController.cs +++ b/AS1024.CommunityDocumentationPage/Controllers/HomeController.cs @@ -8,15 +8,16 @@ namespace AS1024.CommunityDocumentationPage.Controllers public class HomeController : Controller { private readonly ILogger _logger; - private readonly IBgpCommunityDocumentation _documentation; + private readonly IBgpCommunity _bgpCommunity; private readonly IConfiguration _configuration; public HomeController(ILogger logger, - IConfiguration configuration, IBgpCommunityDocumentation documentation) + IConfiguration configuration, + IBgpCommunity bgpCommunity) { _logger = logger; _configuration = configuration; - _documentation = documentation; + _bgpCommunity = bgpCommunity; } [ResponseCache(Duration = 3600)] @@ -24,11 +25,10 @@ namespace AS1024.CommunityDocumentationPage.Controllers { try { - RouteTargets results = await _documentation.GetBgpCommunities(); - List filtered = results.Results.Where(b => b.Name.StartsWith(_configuration["ASN"])) - .ToList(); + var result = + await _bgpCommunity.GetCommunities(); - return View(filtered); + return View(result); } catch (Exception ex) { _logger.LogError($"Failed to obtain data\n{ex}"); diff --git a/AS1024.CommunityDocumentationPage/DIScopes/NetBoxBgpCommunities.cs b/AS1024.CommunityDocumentationPage/DIScopes/NetBoxBgpCommunities.cs new file mode 100644 index 0000000..c8bc553 --- /dev/null +++ b/AS1024.CommunityDocumentationPage/DIScopes/NetBoxBgpCommunities.cs @@ -0,0 +1,57 @@ +using AS1024.CommunityDocumentationPage.Interfaces; +using AS1024.CommunityDocumentationPage.Models; +using Newtonsoft.Json; +using System.Net.Http.Headers; + +namespace AS1024.CommunityDocumentationPage.DIScopes +{ + public class NetBoxBgpCommunities : IBgpCommunity + { + protected readonly IConfiguration _configuration; + public NetBoxBgpCommunities(IConfiguration configuration) + { + _configuration = configuration; + } + string IBgpCommunity.DcimName => "netbox"; + + public async Task> GetCommunities() + { + var Tags = new List(); + using HttpClient client = new HttpClient(); + client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Token", _configuration["APIKey"]); + client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + HttpResponseMessage result = await client.GetAsync(BuildNetBoxURI()); + string stringResult = await result.Content.ReadAsStringAsync(); + var temp = + JsonConvert.DeserializeObject(stringResult); + + foreach (var route in temp.Results) + { + var community = new CommunityTag + { + ASN = int.Parse(route.Name.Split(':')[0]), + CommunityValue = int.Parse(route.Name.Split(':')[1]), + Description = route.Description, + Tag = route.Tags + }; + Tags.Add(community); + } + + return Tags.OrderBy(b => b.ASN) + .ThenBy(b => b.CommunityValue) + .ToList(); + } + + protected Uri BuildNetBoxURI() + { + UriBuilder endUrl = new UriBuilder + { + Path = "/api/ipam/route-targets/", + Host = _configuration["NetBoxHost"], + Scheme = "https" + }; + + return endUrl.Uri; + } + } +} diff --git a/AS1024.CommunityDocumentationPage/Interfaces/BgpCommunityDocumentation.cs b/AS1024.CommunityDocumentationPage/Interfaces/BgpCommunityDocumentation.cs index 3af56cd..8692497 100644 --- a/AS1024.CommunityDocumentationPage/Interfaces/BgpCommunityDocumentation.cs +++ b/AS1024.CommunityDocumentationPage/Interfaces/BgpCommunityDocumentation.cs @@ -17,4 +17,19 @@ namespace AS1024.CommunityDocumentationPage.Interfaces /// Task GetBgpCommunities(); } + /// + /// + /// + public interface IBgpCommunity + { + /// + /// + /// + string DcimName { get; } + /// + /// + /// + /// + Task> GetCommunities(); + } } diff --git a/AS1024.CommunityDocumentationPage/Models/RouteTargets.cs b/AS1024.CommunityDocumentationPage/Models/RouteTargets.cs index c7d6f94..01b6fca 100644 --- a/AS1024.CommunityDocumentationPage/Models/RouteTargets.cs +++ b/AS1024.CommunityDocumentationPage/Models/RouteTargets.cs @@ -35,4 +35,13 @@ public string slug { get; set; } public string color { get; set; } } + + public class CommunityTag + { + public int ASN { get; set; } + public int CommunityValue { get; set; } + public string FormattedVaule => $"{this.ASN}:{this.CommunityValue}"; + public string? Description { get; set; } + public IList? Tag { get; set; } + } } diff --git a/AS1024.CommunityDocumentationPage/Program.cs b/AS1024.CommunityDocumentationPage/Program.cs index b9452b9..22317e8 100644 --- a/AS1024.CommunityDocumentationPage/Program.cs +++ b/AS1024.CommunityDocumentationPage/Program.cs @@ -7,6 +7,7 @@ var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllersWithViews(); builder.Services.AddTransient(); +builder.Services.AddTransient(); var app = builder.Build(); diff --git a/AS1024.CommunityDocumentationPage/Views/Home/Index.cshtml b/AS1024.CommunityDocumentationPage/Views/Home/Index.cshtml index efdd0fd..19a3838 100644 --- a/AS1024.CommunityDocumentationPage/Views/Home/Index.cshtml +++ b/AS1024.CommunityDocumentationPage/Views/Home/Index.cshtml @@ -1,6 +1,6 @@ @using Microsoft.Extensions.DependencyInjection @inject IConfiguration Configuration -@model List +@model List @{ ViewData["Title"] = "BGP Communities"; } @@ -20,10 +20,10 @@ @foreach (var item in Model) { - @item.Name + @item.FormattedVaule @item.Description - @foreach (var tags in item.Tags) { + @foreach (var tags in item.Tag) {
@tags.display
}