mirror of
https://github.com/status-im/consul.git
synced 2025-02-03 09:24:25 +00:00
5fb9df1640
* Adding explicit MPL license for sub-package This directory and its subdirectories (packages) contain files licensed with the MPLv2 `LICENSE` file in this directory and are intentionally licensed separately from the BSL `LICENSE` file at the root of this repository. * Adding explicit MPL license for sub-package This directory and its subdirectories (packages) contain files licensed with the MPLv2 `LICENSE` file in this directory and are intentionally licensed separately from the BSL `LICENSE` file at the root of this repository. * Updating the license from MPL to Business Source License Going forward, this project will be licensed under the Business Source License v1.1. Please see our blog post for more details at <Blog URL>, FAQ at www.hashicorp.com/licensing-faq, and details of the license at www.hashicorp.com/bsl. * add missing license headers * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 --------- Co-authored-by: hashicorp-copywrite[bot] <110428419+hashicorp-copywrite[bot]@users.noreply.github.com>
221 lines
7.8 KiB
Handlebars
221 lines
7.8 KiB
Handlebars
{{!
|
|
Copyright (c) HashiCorp, Inc.
|
|
SPDX-License-Identifier: BUSL-1.1
|
|
}}
|
|
|
|
<Route @name={{routeName}} as |route|>
|
|
<DataLoader
|
|
@src={{uri
|
|
'/${partition}/${nspace}/${dc}/service-instance/${id}/${node}/${name}/${peer}'
|
|
(hash
|
|
partition=route.params.partition
|
|
nspace=route.params.nspace
|
|
dc=route.params.dc
|
|
id=route.params.id
|
|
node=route.params.node
|
|
name=route.params.name
|
|
peer=route.params.peer
|
|
)
|
|
}}
|
|
as |loader|
|
|
>
|
|
|
|
<BlockSlot @name='error'>
|
|
<AppError @error={{loader.error}} @login={{route.model.app.login.open}} />
|
|
</BlockSlot>
|
|
|
|
<BlockSlot @name='disconnected' as |after|>
|
|
{{#if (eq loader.error.status '404')}}
|
|
<Hds::Toast
|
|
@color='warning'
|
|
{{notification sticky=true}}
|
|
as |T|>
|
|
<T.Title>Warning!</T.Title>
|
|
<T.Description>
|
|
This service has been deregistered and no longer exists in the catalog.
|
|
</T.Description>
|
|
</Hds::Toast>
|
|
{{else if (eq loader.error.status '403')}}
|
|
<Hds::Toast
|
|
@color='critical'
|
|
{{notification sticky=true}}
|
|
as |T|>
|
|
<T.Title>Error!</T.Title>
|
|
<T.Description>
|
|
You no longer have access to this service.
|
|
</T.Description>
|
|
</Hds::Toast>
|
|
{{else}}
|
|
<Hds::Toast
|
|
@color='critical'
|
|
{{notification sticky=true}}
|
|
as |T|>
|
|
<T.Title>Warning!</T.Title>
|
|
<T.Description>
|
|
An error was returned whilst loading this data, refresh to try again.
|
|
</T.Description>
|
|
</Hds::Toast>
|
|
{{/if}}
|
|
</BlockSlot>
|
|
|
|
<BlockSlot @name='loaded'>
|
|
{{#let loader.data as |item|}}
|
|
{{#if item.IsOrigin}}
|
|
<DataSource
|
|
@src={{uri
|
|
'/${partition}/${nspace}/${dc}/proxy-instance/${id}/${node}/${name}'
|
|
(hash
|
|
partition=route.params.partition
|
|
nspace=route.params.nspace
|
|
dc=route.params.dc
|
|
id=route.params.id
|
|
node=route.params.node
|
|
name=route.params.name
|
|
)
|
|
}}
|
|
@onchange={{action (mut meta) value='data'}}
|
|
as |meta|
|
|
>
|
|
{{! We only really need meta to get the correct ServiceID }}
|
|
{{! but we may as well use the NodeName and ServiceName }}
|
|
{{! from meta also, but they should be the same as the instance }}
|
|
{{! so if we can ever get ServiceID from elsewhere we could save }}
|
|
{{! a HTTP request/long poll here }}
|
|
{{#if meta.data.ServiceID}}
|
|
{{! if we have a proxy then get the additional instance information }}
|
|
{{! for the proxy itself so if the service is called `backend` }}
|
|
{{! its likely to have a proxy service called `backend-sidecar-proxy` }}
|
|
{{! and this second request get the info for that instance and saves }}
|
|
{{! it into the `proxy` variable }}
|
|
<DataSource
|
|
@src={{uri
|
|
'/${partition}/${nspace}/${dc}/service-instance/${id}/${node}/${name}/${peer}'
|
|
(hash
|
|
partition=route.params.partition
|
|
nspace=route.params.nspace
|
|
dc=route.params.dc
|
|
id=meta.data.ServiceID
|
|
node=meta.data.NodeName
|
|
name=meta.data.ServiceName
|
|
peer=route.params.peer
|
|
)
|
|
}}
|
|
@onchange={{action (mut proxy) value='data'}}
|
|
/>
|
|
{{/if}}
|
|
</DataSource>
|
|
{{/if}}
|
|
<AppView>
|
|
<BlockSlot @name='breadcrumbs'>
|
|
<ol>
|
|
<li><a href={{href-to 'dc.services' params=(hash peer=undefined)}}>All Services</a></li>
|
|
<li><a
|
|
{{tooltip (concat 'Service (' item.Service.Service ')')}}
|
|
data-test-back
|
|
href={{href-to 'dc.services.show'}}
|
|
>
|
|
Service ({{item.Service.Service}})
|
|
</a></li>
|
|
</ol>
|
|
</BlockSlot>
|
|
<BlockSlot @name='header'>
|
|
<h1>
|
|
<route.Title @title={{item.Service.ID}} />
|
|
</h1>
|
|
<Consul::ExternalSource @item={{item}} @withInfo={{true}} />
|
|
<Consul::Kind @item={{item}} @withInfo={{true}} />
|
|
{{! TODO: Looks like we can get this straight from item.Proxy.Mode }}
|
|
{{! the less we need `proxy` and `meta` the better }}
|
|
{{#if (eq meta.ServiceProxy.Mode 'transparent')}}
|
|
<Consul::TransparentProxy />
|
|
{{/if}}
|
|
</BlockSlot>
|
|
<BlockSlot @name='nav'>
|
|
<dl>
|
|
<dt>Service Name</dt>
|
|
<dd><a
|
|
href='{{href-to "dc.services.show" item.Service.Service}}'
|
|
>{{item.Service.Service}}</a></dd>
|
|
</dl>
|
|
{{#unless item.Node.Meta.synthetic-node}}
|
|
<dl>
|
|
<dt>Node Name</dt>
|
|
<dd><a
|
|
data-test-service-instance-node-name
|
|
href='{{href-to "dc.nodes.show" item.Node.Node}}'
|
|
>{{item.Node.Node}}</a></dd>
|
|
</dl>
|
|
{{/unless}}
|
|
{{#if item.Service.PeerName}}
|
|
<dl>
|
|
<dt>Peer Name</dt>
|
|
<dd><a
|
|
data-test-service-instance-peer-name
|
|
href={{href-to
|
|
'dc.peers.show'
|
|
item.Service.PeerName
|
|
params=(hash peer=undefined)
|
|
}}
|
|
>{{item.Service.PeerName}}</a></dd>
|
|
</dl>
|
|
{{/if}}
|
|
</BlockSlot>
|
|
<BlockSlot @name='actions'>
|
|
{{#let (or item.Service.Address item.Node.Address) as |address|}}
|
|
<CopyButton @value={{address}} @name='Address'>{{address}}</CopyButton>
|
|
{{/let}}
|
|
</BlockSlot>
|
|
<BlockSlot @name='content'>
|
|
<TabNav
|
|
@items={{compact
|
|
(array
|
|
(hash
|
|
label='Health Checks'
|
|
href=(href-to 'dc.services.instance.healthchecks')
|
|
selected=(is-href 'dc.services.instance.healthchecks')
|
|
)
|
|
(if
|
|
(eq item.Service.Kind 'mesh-gateway')
|
|
(hash
|
|
label='Addresses'
|
|
href=(href-to 'dc.services.instance.addresses')
|
|
selected=(is-href 'dc.services.instance.addresses')
|
|
)
|
|
)
|
|
(if
|
|
proxy
|
|
(hash
|
|
label='Upstreams'
|
|
href=(href-to 'dc.services.instance.upstreams')
|
|
selected=(is-href 'dc.services.instance.upstreams')
|
|
)
|
|
)
|
|
(if
|
|
proxy
|
|
(hash
|
|
label='Exposed Paths'
|
|
href=(href-to 'dc.services.instance.exposedpaths')
|
|
selected=(is-href 'dc.services.instance.exposedpaths')
|
|
)
|
|
)
|
|
(hash
|
|
label='Tags & Meta'
|
|
href=(href-to 'dc.services.instance.metadata')
|
|
selected=(is-href 'dc.services.instance.metadata')
|
|
)
|
|
)
|
|
}}
|
|
/>
|
|
<Outlet
|
|
@name={{routeName}}
|
|
@model={{assign (hash proxy=proxy meta=meta item=item) route.model}}
|
|
as |o|
|
|
>
|
|
{{outlet}}
|
|
</Outlet>
|
|
</BlockSlot>
|
|
</AppView>
|
|
{{/let}}
|
|
</BlockSlot>
|
|
</DataLoader>
|
|
</Route> |