You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ea...@apache.org on 2018/05/23 18:29:59 UTC
[1/5] qpid-dispatch git commit: DISPATCH-1001 Removing developer tool
Repository: qpid-dispatch
Updated Branches:
refs/heads/master 5d5db8907 -> 4f42d5b34
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/schema.json
----------------------------------------------------------------------
diff --git a/console/config/schema.json b/console/config/schema.json
deleted file mode 100644
index c105e16..0000000
--- a/console/config/schema.json
+++ /dev/null
@@ -1,1814 +0,0 @@
-{
- "prefix": "org.apache.qpid.dispatch",
- "entityTypes": {
- "address": {
- "operations": [
- "CREATE",
- "DELETE",
- "READ"
- ],
- "attributes": {
- "egressPhase": {
- "type": "integer",
- "description": "Advanced - Override the egress phase for this address"
- },
- "pattern": {
- "type": "string",
- "description": "A wildcarded pattern for address matching. Incoming addresses are matched against this pattern. Matching addresses use the configured settings. The pattern consists of one or more tokens separated by a forward slash '/'. A token can be one of the following: a * character, a # character, or a sequence of characters that do not include /, *, or #. The * token matches any single token. The # token matches zero or more tokens. * has higher precedence than #, and exact match has the highest precedence. Cannot be used with a prefix attribute."
- },
- "prefix": {
- "type": "string",
- "description": "The address prefix for the configured settings. Cannot be used with a pattern attribute."
- },
- "ingressPhase": {
- "type": "integer",
- "description": "Advanced - Override the ingress phase for this address"
- },
- "waypoint": {
- "type": "boolean",
- "description": "Designates this address space as being used for waypoints. This will cause the proper address-phasing to be used."
- },
- "distribution": {
- "default": "balanced",
- "type": [
- "multicast",
- "closest",
- "balanced",
- "unavailable"
- ],
- "description": "Treatment of traffic associated with the address"
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.router.config.address",
- "description": "Entity type for address configuration. This is used to configure the treatment of message-routed deliveries within a particular address-space. The configuration controls distribution and address phasing."
- },
- "binding": {
- "operations": [
- "CREATE",
- "DELETE",
- "READ"
- ],
- "attributes": {
- "matchedCount": {
- "type": "integer",
- "description": "Total number of deliveries that matched this binding."
- },
- "bindingKey": {
- "type": "string",
- "description": "Pattern to compare against incoming message's subject. The key is a string of zero or more tokens and wildcards. The format depends on the matchMethod configured for the exchange. For AMQP each token is delimited by the '.' character and wild-card tokens '*' matches a single token and '#' matches zero or more tokens. For MQTT each token is delimited by the '/' character and wildcard tokens '+' matches a single token and '#' matches zero or more tokens at the end of the topic. If a key is not provided the binding will match all messages arriving at the exchange (fanout behavior)."
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- },
- "nextHopAddress": {
- "required": true,
- "type": "string",
- "description": "The address to forward the message to when the message's topic string matches the binding key pattern. This address is used by message consumers as the source of incoming messages."
- },
- "exchangeName": {
- "required": true,
- "type": "string",
- "description": "The name of the exchange to bind."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- },
- "nextHopPhase": {
- "type": "integer",
- "description": "The address phase used when forwarding messages that match this binding."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.router.config.binding",
- "description": "[EXPERIMENTAL] Defines a keyed next hop binding for a topic exchange. The subject field of the messages arriving at the exchange is compared against the binding's key value using the exchange's matchMethod. If the subject matches the key the message is forwarded to the nextHopAddress. The nextHopAddress overrides the message's original destination."
- },
- "entity": {
- "attributes": {
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.entity",
- "description": "Base entity type for all entities."
- },
- "sslProfile": {
- "operations": [
- "CREATE",
- "DELETE",
- "READ"
- ],
- "attributes": {
- "certFile": {
- "type": "path",
- "description": "The absolute path to the file containing the PEM-formatted public certificate to be used on the local end of any connections using this profile."
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- },
- "uidNameMappingFile": {
- "type": "string",
- "description": "The absolute path to the file containing the unique id to display name mapping"
- },
- "ciphers": {
- "type": "string",
- "description": "Specifies the enabled ciphers so the SSL Ciphers can be hardened. In other words, use this field to disable weak ciphers. The ciphers are specified in the format understood by the OpenSSL library. For example, ciphers can be set to ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; -- The full list of allowed ciphers can be viewed using the openssl ciphers command"
- },
- "caCertFile": {
- "type": "path",
- "description": "The absolute path to the database that contains the public certificates of trusted certificate authorities (CA)."
- },
- "uidFormat": {
- "type": "string",
- "description": "A list of x509 client certificate fields that will be used to build a string that will uniquely identify the client certificate owner. For e.g. a value of 'cou' indicates that the uid will consist of c - common name concatenated with o - organization-company name concatenated with u - organization unit; or a value of 'o2' indicates that the uid will consist of o (organization name) concatenated with 2 (the sha256 fingerprint of the entire certificate) . Allowed values can be any combination of 'c'( ISO3166 two character country code), 's'(state or province), 'l'(Locality; generally - city), 'o'(Organization - Company Name), 'u'(Organization Unit - typically certificate type or brand), 'n'(CommonName - typically a user name for client certificates) and '1'(sha1 certificate fingerprint, as displayed in the fingerprints section when looking at a certificate with say a web browser is the hash of the entire certificate) and 2 (sha256 certificate fingerprint) and
5 (sha512 certificate fingerprint). The user identifier (uid) that is generated based on the uidFormat is a string which has a semi-colon as a separator between the components"
- },
- "privateKeyFile": {
- "type": "path",
- "description": "The absolute path to the file containing the PEM-formatted private key for the above certificate."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- },
- "passwordFile": {
- "type": "path",
- "description": "If the above private key is password protected, this is the absolute path to a file containing the password that unlocks the certificate key."
- },
- "password": {
- "type": "string",
- "description": "An alternative to storing the password in a file referenced by passwordFile is to supply the password right here in the configuration file. This takes precedence over the passwordFile if both are specified."
- },
- "protocols": {
- "type": "string",
- "description": "The TLS protocols that this sslProfile can use. You can specify a list of one or more of TLSv1, TLSv1.1, or TLSv1.2. To specify multiple protocols, separate the protocols with a space. For example, to permit the sslProfile to use TLS v1.1 and TLS v1.2 only, you would set the value to TLSv1.1 TLSv1.2. If you do not specify a value, the sslProfile uses the TLS protocol specified by the system-wide configuration."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.sslProfile",
- "description": "Attributes for setting TLS/SSL configuration for connections."
- },
- "linkRoute": {
- "operations": [
- "CREATE",
- "DELETE",
- "READ"
- ],
- "attributes": {
- "direction": {
- "required": true,
- "type": [
- "in",
- "out"
- ],
- "description": "The permitted direction of links: 'in' means client senders; 'out' means client receivers"
- },
- "containerId": {
- "type": "string",
- "description": "ContainerID for the target container. Only one of containerId or connection should be specified for a linkRoute. Specifying both will result in the linkRoute not being created."
- },
- "operStatus": {
- "type": [
- "inactive",
- "active"
- ],
- "description": "The operational status of this linkRoute: inactive - The remote container is not connected; active - the remote container is connected and ready to accept link routed attachments."
- },
- "pattern": {
- "type": "string",
- "description": "A wildcarded pattern for address matching. Link addresses are matched against this pattern. Matching addresses use the configured settings. The pattern consists of one or more tokens separated by a forward slash '/'. A token can be one of the following: a * character, a # character, or a sequence of characters that do not include /, *, or #. The * token matches any single token. The # token matches zero or more tokens. * has higher precedence than #, and exact match has the highest precedence. Cannot be used with the prefix attribute."
- },
- "prefix": {
- "type": "string",
- "description": "The address prefix for the configured settings. Cannot be used with the pattern attribute."
- },
- "connection": {
- "type": "string",
- "description": "The name from a connector or listener. Only one of containerId or connection should be specified for a linkRoute. Specifying both will result in the linkRoute not being created."
- },
- "distribution": {
- "default": "linkBalanced",
- "type": [
- "linkBalanced"
- ],
- "description": "Treatment of traffic associated with the address"
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.router.config.linkRoute",
- "description": "Entity type for link-route configuration. This is used to identify remote containers that shall be destinations for routed link-attaches. The link-routing configuration applies to an addressing space defined by a prefix or a pattern."
- },
- "exchange": {
- "operations": [
- "CREATE",
- "DELETE",
- "READ"
- ],
- "attributes": {
- "divertedCount": {
- "type": "integer",
- "description": "A count of those deliveries that were forwarded via the alternateAddress only. This is a subset of the forwardedCount."
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- },
- "matchMethod": {
- "default": "amqp",
- "type": [
- "amqp",
- "mqtt"
- ],
- "description": "Key matching algorithm used. 'amqp' uses the legacy AMQP topic exchange wildcard match method as described in the pre-1.0 drafts. 'mqtt' uses the MQTT topic filter wildcard match method."
- },
- "forwardedCount": {
- "type": "integer",
- "description": "The total number of deliveries forwarded via matched bindings or to the alternateAddress"
- },
- "alternatePhase": {
- "type": "integer",
- "description": "The address phase for the alternateAddress. Defaults to '0'."
- },
- "receivedCount": {
- "type": "integer",
- "description": "The total number of deliveries received by this exchange."
- },
- "bindingCount": {
- "type": "integer",
- "description": "The number of bindings associated with this exchange."
- },
- "address": {
- "required": true,
- "type": "string",
- "description": "The address of the exchange. Used by the message publisher as the target for sending messages."
- },
- "phase": {
- "type": "integer",
- "description": "The address phase for the exchange. Defaults to '0'."
- },
- "alternateAddress": {
- "type": "string",
- "description": "The address to forward the message to if no bindings are matched."
- },
- "droppedCount": {
- "type": "integer",
- "description": "The total number of deliveries dropped due to the lack of an outgoing subscription."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.router.config.exchange",
- "description": "[EXPERIMENTAL] Defines a topic exchange."
- },
- "management": {
- "operations": [
- "GET-SCHEMA",
- "GET-JSON-SCHEMA",
- "GET-LOG",
- "PROFILE",
- "QUERY",
- "GET-TYPES",
- "GET-ANNOTATIONS",
- "GET-OPERATIONS",
- "GET-ATTRIBUTES",
- "GET-MGMT-NODES",
- "READ"
- ],
- "attributes": {
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- }
- },
- "singleton": true,
- "fullyQualifiedType": "org.apache.qpid.dispatch.management",
- "description": "Qpid dispatch router extensions to the standard org.amqp.management interface."
- },
- "console": {
- "operations": [
- "READ"
- ],
- "singleton": true,
- "fullyQualifiedType": "org.apache.qpid.dispatch.console",
- "description": "(DEPRECATED) Start a websocket/tcp proxy and http file server to serve the web console",
- "deprecated": true,
- "attributes": {
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- },
- "args": {
- "type": "string",
- "description": "Optional args to pass the proxy program for logging, authentication, etc."
- },
- "listener": {
- "type": "string",
- "description": "The name of the listener to send the proxied tcp traffic to."
- },
- "proxy": {
- "required": true,
- "type": "string",
- "description": "The full path to the proxy program to run."
- },
- "wsport": {
- "default": 5673,
- "type": "integer",
- "description": "port on which to listen for websocket traffic"
- },
- "home": {
- "required": true,
- "type": "string",
- "description": "The full path to the html/css/js files for the console."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- }
- }
- },
- "log": {
- "operations": [
- "UPDATE",
- "READ"
- ],
- "attributes": {
- "enable": {
- "type": "string",
- "description": "Levels are: trace, debug, info, notice, warning, error, critical. The enable string is a comma-separated list of levels. A level may have a trailing '\\+' to enable that level and above. For example 'trace,debug,warning+' means enable trace, debug, warning, error and critical. The value 'none' means disable logging for the module."
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- },
- "module": {
- "required": true,
- "type": [
- "ROUTER",
- "ROUTER_CORE",
- "ROUTER_HELLO",
- "ROUTER_LS",
- "ROUTER_MA",
- "MESSAGE",
- "SERVER",
- "AGENT",
- "CONTAINER",
- "ERROR",
- "POLICY",
- "HTTP",
- "CONN_MGR",
- "PYTHON",
- "DEFAULT"
- ],
- "description": "Module to configure. The special module 'DEFAULT' specifies defaults for all modules."
- },
- "outputFile": {
- "type": "string",
- "description": "Where to send log messages. Can be 'stderr', 'stdout', 'syslog' or a file name."
- },
- "includeSource": {
- "type": "boolean",
- "description": "Include source file and line number in log messages."
- },
- "includeTimestamp": {
- "type": "boolean",
- "description": "Include timestamp in log messages."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.log",
- "description": "Configure logging for a particular module. You can use the `UPDATE` operation to change log settings while the router is running."
- },
- "vhostUserGroupSettings": {
- "operations": [
- "READ"
- ],
- "attributes": {
- "allowAnonymousSender": {
- "type": "boolean",
- "description": "Whether this connection is allowed to create sending links if the sender does not provide a target address. By prohibiting anonymous senders, the router only needs to verify once, when the link is created, that the sender is permitted to send messages to the target address. The router does not need to verify each message that is sent on the link. A value of 'true' means that users may send messages to any address. Allowing anonymous senders can also decrease performance: if the sender does not specify a target address, then the router must parse each message to determine how to route it."
- },
- "maxReceivers": {
- "default": 2147483647,
- "type": "integer",
- "description": "The maximum number of receiving links that may be created on this connection. A value of '0' disables all receiver links."
- },
- "users": {
- "required": true,
- "type": "string",
- "description": "A list of authenticated users for this user group. Use commas to separate multiple users. A user may belong to only one vhost user group."
- },
- "maxSessions": {
- "default": 32768,
- "type": "integer",
- "description": "The maximum number of sessions that may be created on this connection. Non-zero policy values overwrite values specified for a listener object (AMQP Open, channel-max)."
- },
- "maxSessionWindow": {
- "default": 1638400,
- "type": "integer",
- "description": "The incoming capacity for new AMQP sessions, measured in octets. Non-zero policy values overwrite values specified for a listener object (AMQP Begin, incoming-window)."
- },
- "allowDynamicSource": {
- "type": "boolean",
- "description": "Whether this connection is allowed to create dynamic receiving links (links to resources that do not exist on the peer). A value of 'true' means that users are able to automatically create resources on the peer system."
- },
- "maxFrameSize": {
- "default": 16384,
- "type": "integer",
- "description": "The largest frame, in bytes, that may be sent on this connection. Non-zero policy values overwrite values specified for a listener object (AMQP Open, max-frame-size)."
- },
- "sources": {
- "type": "string",
- "description": "A list of source addresses from which users in this group may receive messages. To specify multiple addresses, separate the addresses with either a comma or a space. If you do not specify any addresses, users in this group are not allowed to receive messages from any addresses. You can use the substitution token '{user}' to specify an address that contains a user's authenticated user name. You can use an asterisk ('*') wildcard to match one or more characters in an address. However, this wildcard is only recognized if it is the last character in the address name."
- },
- "allowUserIdProxy": {
- "type": "boolean",
- "description": "Whether this connection is allowed to send messages with a user ID that is different than the connection's authenticated user name."
- },
- "remoteHosts": {
- "required": true,
- "type": "string",
- "description": "A list of remote hosts from which the users may connect. A host can be a hostname, IP address, or IP address range. Use commas to separate multiple hosts. To allow access from all remote hosts, specify a wildcard '*'. To deny access from all remote hosts, leave this attribute blank."
- },
- "maxSenders": {
- "default": 2147483647,
- "type": "integer",
- "description": "The maximum number of sending links that may be created on this connection. A value of '0' disables all sender links."
- },
- "targets": {
- "type": "string",
- "description": "A list of target addresses from which users in this group may send messages. To specify multiple addresses, separate the addresses with either a comma or a space. If you do not specify any addresses, users in this group are not allowed to send messages from any addresses. You can use the substitution token '{user}' to specify an address that contains a user's authenticated user name. You can use an asterisk ('*') wildcard to match one or more characters in an address. However, this wildcard is only recognized if it is the last character in the address name."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.vhostUserGroupSettings",
- "description": "Policy settings for users connecting to a vhost. Configuration files including this section must use .json format."
- },
- "vhostStats": {
- "operations": [
- "READ"
- ],
- "attributes": {
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- },
- "perHostState": {
- "type": "map",
- "description": "A map where the key is the host name and the value is a list of the host's connections."
- },
- "hostname": {
- "type": "string",
- "description": "The vhost name."
- },
- "id": {
- "type": "string",
- "description": "The vhost name. DEPRECATED - use 'hostname' instead."
- },
- "perUserState": {
- "type": "map",
- "description": "A map where the key is the authenticated user name and the value is a list of the user's connections."
- },
- "sessionDenied": {
- "graph": true,
- "type": "integer"
- },
- "connectionsApproved": {
- "graph": true,
- "type": "integer"
- },
- "receiverDenied": {
- "graph": true,
- "type": "integer"
- },
- "connectionsCurrent": {
- "graph": true,
- "type": "integer"
- },
- "connectionsDenied": {
- "graph": true,
- "type": "integer"
- },
- "senderDenied": {
- "graph": true,
- "type": "integer"
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.vhostStats",
- "description": "Virtual host connection and access statistics."
- },
- "connector": {
- "operations": [
- "CREATE",
- "DELETE",
- "READ"
- ],
- "attributes": {
- "maxSessionFrames": {
- "type": "integer",
- "description": "Session incoming window measured in transfer frames for sessions created on this connection. This is the number of transfer frames that may simultaneously be in flight for all links in the session. Setting this value to zero selects the default session window size. Policy settings will not overwrite this value. The numerical product of maxFrameSize and maxSessionFrames may not exceed 2^31-1. If (maxFrameSize x maxSessionFrames) exceeds 2^31-1 then maxSessionFrames is reduced to (2^31-1 / maxFrameSize). maxSessionFrames has a minimum value of 1. Defaults to 0 (unlimited window)."
- },
- "verifyHostname": {
- "default": true,
- "type": "boolean",
- "description": "yes: Ensures that when initiating a connection (as a client) the host name in the URL to which this connector connects to matches the host name in the digital certificate that the peer sends back as part of the SSL connection; no: Does not perform host name verification"
- },
- "saslPassword": {
- "type": "string",
- "description": "The password that the connector is using to connect to a peer."
- },
- "stripAnnotations": {
- "default": "both",
- "type": [
- "in",
- "out",
- "both",
- "no"
- ],
- "description": "['in', 'out', 'both', 'no'] in: Strip the dispatch router specific annotations only on ingress; out: Strip the dispatch router specific annotations only on egress; both: Strip the dispatch router specific annotations on both ingress and egress; no - do not strip dispatch router specific annotations"
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- },
- "saslUsername": {
- "type": "string",
- "description": "The user name that the connector is using to connect to a peer."
- },
- "allowRedirect": {
- "default": true,
- "type": "boolean",
- "description": "Allow the peer to redirect this connection to another address."
- },
- "idleTimeoutSeconds": {
- "default": 16,
- "type": "integer",
- "description": "The idle timeout, in seconds, for connections through this connector. If no frames are received on the connection for this time interval, the connection shall be closed."
- },
- "saslMechanisms": {
- "type": "string",
- "description": "Space separated list of accepted SASL authentication mechanisms."
- },
- "maxFrameSize": {
- "default": 16384,
- "type": "integer",
- "description": "The maximum frame size in octets that will be used in the connection-open negotiation with a connected peer. The frame size is the largest contiguous set of uninterrupted data that can be sent for a message delivery over the connection. Interleaving of messages on different links is done at frame granularity. Policy settings will not overwrite this value. Defaults to 16384."
- },
- "port": {
- "default": "amqp",
- "type": "string",
- "description": "Port number or symbolic service name."
- },
- "linkCapacity": {
- "type": "integer",
- "description": "The capacity of links within this connection, in terms of message deliveries. The capacity is the number of messages that can be in-flight concurrently for each link."
- },
- "host": {
- "default": "127.0.0.1",
- "type": "string",
- "description": "IP address: ipv4 or ipv6 literal or a host name"
- },
- "cost": {
- "default": 1,
- "type": "integer",
- "description": "For the 'inter-router' role only. This value assigns a cost metric to the inter-router connection. The default (and minimum) value is one. Higher values represent higher costs. The cost is used to influence the routing algorithm as it attempts to use the path with the lowest total cost from ingress to egress."
- },
- "role": {
- "default": "normal",
- "type": [
- "normal",
- "inter-router",
- "route-container"
- ],
- "description": "The role of an established connection. In the normal role, the connection is assumed to be used for AMQP clients that are doing normal message delivery over the connection. In the inter-router role, the connection is assumed to be to another router in the network. Inter-router discovery and routing protocols can only be used over inter-router connections. route-container role can be used for router-container connections, for example, a router-broker connection."
- },
- "sslProfile": {
- "type": "string",
- "description": "Name of the sslProfile."
- },
- "failoverUrls": {
- "type": "string",
- "description": "A read-only, comma-separated list of failover urls. "
- },
- "maxSessions": {
- "default": 32768,
- "type": "integer",
- "description": "The maximum number of sessions that can be simultaneously active on the connection. Setting this value to zero selects the default number of sessions. Policy settings will not overwrite this value. Defaults to 32768."
- },
- "protocolFamily": {
- "type": [
- "IPv4",
- "IPv6"
- ],
- "description": "['IPv4', 'IPv6'] IPv4: Internet Protocol version 4; IPv6: Internet Protocol version 6. If not specified, the protocol family will be automatically determined from the address."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- },
- "messageLoggingComponents": {
- "default": "none",
- "type": "string",
- "description": "A comma separated list that indicates which components of the message should be logged (no spaces allowed between list components). Defaults to 'none' (log nothing). If you want all properties and application properties of the message logged use 'all'. Specific components of the message can be logged by indicating the components via a comma separated list. The components are message-id, user-id, to, subject, reply-to, correlation-id, content-type, content-encoding, absolute-expiry-time, creation-time, group-id, group-sequence, reply-to-group-id, app-properties. The application-data part of the bare message will not be logged. This log message is written to the MESSAGE logging module. In the 'log' entity, set 'module' property to MESSAGE or DEFAULT and 'enable' to trace+ to see this log message"
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.connector",
- "description": "Establishes an outgoing connection from the router."
- },
- "logStats": {
- "operations": [
- "READ"
- ],
- "attributes": {
- "debugCount": {
- "graph": true,
- "type": "integer",
- "description": "How many debug-level events have happened on this log."
- },
- "criticalCount": {
- "graph": true,
- "type": "integer",
- "description": "How many critical-level events have happened on this log."
- },
- "traceCount": {
- "graph": true,
- "type": "integer",
- "description": "How many trace-level events have happened on this log."
- },
- "warningCount": {
- "graph": true,
- "type": "integer",
- "description": "How many warning-level events have happened on this log."
- },
- "infoCount": {
- "graph": true,
- "type": "integer",
- "description": "How many info-level events have happened on this log."
- },
- "noticeCount": {
- "graph": true,
- "type": "integer",
- "description": "How many notice-level events have happened on this log."
- },
- "errorCount": {
- "graph": true,
- "type": "integer",
- "description": "How many error-level events have happened on this log."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.logStats",
- "description": "histogram of the different severity-levels of events on the given log."
- },
- "allocator": {
- "operations": [
- "READ"
- ],
- "attributes": {
- "heldByThreads": {
- "graph": true,
- "type": "integer"
- },
- "localFreeListMax": {
- "graph": true,
- "type": "integer"
- },
- "transferBatchSize": {
- "type": "integer"
- },
- "globalFreeListMax": {
- "graph": true,
- "type": "integer"
- },
- "batchesRebalancedToGlobal": {
- "graph": true,
- "type": "integer"
- },
- "typeName": {
- "type": "string"
- },
- "batchesRebalancedToThreads": {
- "graph": true,
- "type": "integer"
- },
- "totalFreeToHeap": {
- "graph": true,
- "type": "integer"
- },
- "totalAllocFromHeap": {
- "graph": true,
- "type": "integer"
- },
- "typeSize": {
- "type": "integer"
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.allocator",
- "description": "Memory allocation pool."
- },
- "policy": {
- "operations": [
- "READ"
- ],
- "attributes": {
- "connectionsProcessed": {
- "graph": true,
- "type": "integer"
- },
- "policyDir": {
- "type": "path",
- "description": "The absolute path to a directory that holds vhost policy definition files in JSON format (*.json). The router processes all of the vhost policies in each JSON file that is in this directory."
- },
- "defaultVhost": {
- "default": "$default",
- "type": "string",
- "description": "The name of the default vhost policy, which is applied to any connection for which a vhost policy has not been configured. If 'defaultVhost' is not defined, then default vhost processing is disabled."
- },
- "connectionsDenied": {
- "graph": true,
- "type": "integer"
- },
- "enableVhostPolicy": {
- "type": "boolean",
- "description": "Enables the router to enforce the connection denials and resource limits defined in the configured vhost policies."
- },
- "maxConnections": {
- "default": 65535,
- "type": "integer",
- "description": "The maximum number of concurrent client connections allowed for this router. This limit is always enforced, even if no other policy settings have been defined. The limit is applied to all incoming connections regardless of remote host, authenticated user, or targeted vhost."
- },
- "connectionsCurrent": {
- "graph": true,
- "type": "integer"
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- }
- },
- "singleton": true,
- "fullyQualifiedType": "org.apache.qpid.dispatch.policy",
- "description": "Defines global connection limit"
- },
- "autoLink": {
- "operations": [
- "CREATE",
- "DELETE",
- "READ"
- ],
- "attributes": {
- "direction": {
- "required": true,
- "type": [
- "in",
- "out"
- ],
- "description": "The direction of the link to be created. In means into the router, out means out of the router."
- },
- "addr": {
- "required": true,
- "type": "string",
- "description": "The address of the provisioned object"
- },
- "linkRef": {
- "type": "string",
- "description": "Reference to the org.apache.qpid.dispatch.router.link if the link exists"
- },
- "containerId": {
- "type": "string",
- "description": "ContainerID for the target container. Only one of containerId or connection should be specified for an autoLink. Specifying both will result in the autoLink not being created"
- },
- "operStatus": {
- "type": [
- "inactive",
- "attaching",
- "failed",
- "active",
- "quiescing",
- "idle"
- ],
- "description": "The operational status of this autoLink: inactive - The remote container is not connected; attaching - the link is attaching to the remote node; failed - the link attach failed; active - the link is attached and operational; quiescing - the link is transitioning to idle state; idle - the link is attached but there are no deliveries flowing and no unsettled deliveries."
- },
- "connection": {
- "type": "string",
- "description": "The name from a connector or listener. Only one of containerId or connection should be specified for an autoLink. Specifying both will result in the autoLink not being created"
- },
- "phase": {
- "type": "integer",
- "description": "The address phase for this link. Defaults to '0' for 'out' links and '1' for 'in' links."
- },
- "lastError": {
- "type": "string",
- "description": "The error description from the last attach failure"
- },
- "externalAddr": {
- "type": "string",
- "description": "If present, an alternate address of the node on the remote container. This is used if the node has a different address than the address used internally by the router to route deliveries."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.router.config.autoLink",
- "description": "Entity type for configuring auto-links. Auto-links are links whose lifecycle is managed by the router. These are typically used to attach to waypoints on remote containers (brokers, etc.)."
- },
- "listener": {
- "operations": [
- "CREATE",
- "DELETE",
- "READ"
- ],
- "attributes": {
- "stripAnnotations": {
- "default": "both",
- "type": [
- "in",
- "out",
- "both",
- "no"
- ],
- "description": "['in', 'out', 'both', 'no'] in: Strip the dispatch router specific annotations only on ingress; out: Strip the dispatch router specific annotations only on egress; both: Strip the dispatch router specific annotations on both ingress and egress; no - do not strip dispatch router specific annotations"
- },
- "requireSsl": {
- "type": "boolean",
- "description": "yes: Require the use of SSL or TLS on the connection; no: Allow clients to connect without SSL or TLS."
- },
- "messageLoggingComponents": {
- "default": "none",
- "type": "string",
- "description": "A comma separated list that indicates which components of the message should be logged. Defaults to 'none' (log nothing). If you want all properties and application properties of the message logged use 'all'. Specific components of the message can be logged by indicating the components via a comma separated list. The components are message-id, user-id, to, subject, reply-to, correlation-id, content-type, content-encoding, absolute-expiry-time, creation-time, group-id, group-sequence, reply-to-group-id, app-properties. The application-data part of the bare message will not be logged. No spaces are allowed"
- },
- "maxSessionFrames": {
- "type": "integer",
- "description": "Session incoming window measured in transfer frames for sessions created on this connection. This is the number of transfer frames that may simultaneously be in flight for all links in the session. Setting this value to zero selects the default session window size. Policy settings, if specified, will overwrite this value. The numerical product of maxFrameSize and maxSessionFrames may not exceed 2^31-1. If (maxFrameSize x maxSessionFrames) exceeds 2^31-1 then maxSessionFrames is reduced to (2^31-1 / maxFrameSize). maxSessionFrames has a minimum value of 1. Defaults to 0 (unlimited window)."
- },
- "cost": {
- "default": 1,
- "type": "integer",
- "description": "For the 'inter-router' role only. This value assigns a cost metric to the inter-router connection. The default (and minimum) value is one. Higher values represent higher costs. The cost is used to influence the routing algorithm as it attempts to use the path with the lowest total cost from ingress to egress."
- },
- "port": {
- "default": "amqp",
- "type": "string",
- "description": "Port number or symbolic service name. If '0', the router shall assign an ephemeral port to the listener and log the port number with a log of the form 'SERVER (notice) Listening on <host>:<assigned-port> (<listener-name>)'"
- },
- "saslPlugin": {
- "type": "string",
- "description": "EXPERIMENTAL. Name of the a sasl plugin configuration section to use for this listener (e.g. authServicePlugin)."
- },
- "trustedCertsFile": {
- "type": "path",
- "description": "This optional setting can be used to reduce the set of available CAs for client authentication. If used, this setting must provide the absolute path to a PEM file that contains the trusted certificates."
- },
- "saslMechanisms": {
- "type": "string",
- "description": "Space separated list of accepted SASL authentication mechanisms."
- },
- "requireEncryption": {
- "type": "boolean",
- "description": "yes: Require the connection to the peer to be encrypted; no: Permit non-encrypted communication with the peer"
- },
- "linkCapacity": {
- "type": "integer",
- "description": "The capacity of links within this connection, in terms of message deliveries. The capacity is the number of messages that can be in-flight concurrently for each link."
- },
- "role": {
- "default": "normal",
- "type": [
- "normal",
- "inter-router",
- "route-container"
- ],
- "description": "The role of an established connection. In the normal role, the connection is assumed to be used for AMQP clients that are doing normal message delivery over the connection. In the inter-router role, the connection is assumed to be to another router in the network. Inter-router discovery and routing protocols can only be used over inter-router connections. route-container role can be used for router-container connections, for example, a router-broker connection."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- },
- "maxSessions": {
- "default": 32768,
- "type": "integer",
- "description": "The maximum number of sessions that can be simultaneously active on the connection. Setting this value to zero selects the default number of sessions. Policy settings, if specified, will overwrite this value. Defaults to 32768."
- },
- "authenticatePeer": {
- "type": "boolean",
- "description": "yes: Require the peer's identity to be authenticated; no: Do not require any authentication."
- },
- "http": {
- "type": "boolean",
- "description": "Accept HTTP connections that can upgrade to AMQP over WebSocket. Plain AMQP connections are not accepted on this listener."
- },
- "idleTimeoutSeconds": {
- "default": 16,
- "type": "integer",
- "description": "The idle timeout, in seconds, for connections through this listener. If no frames are received on the connection for this time interval, the connection shall be closed."
- },
- "multiTenant": {
- "type": "boolean",
- "description": "If true, apply multi-tenancy to endpoints connected at this listener. The address space is defined by the virtual host (hostname field in the Open)."
- },
- "host": {
- "type": "string",
- "description": "A host name, IPV4 or IPV6 literal, or the empty string. The empty string listens on all local addresses. A host name listens on all addresses associated with the name. An IPV6 literal address (or wildcard '[::]') listens only for IPV6. An IPV4 literal address (or wildcard '0.0.0.0') listens only for IPV4."
- },
- "initialHandshakeTimeoutSeconds": {
- "type": "integer",
- "description": "The timeout, in seconds, for the initial handshake for connections coming in through listeners. If the time interval expires before the peer sends the AMQP OPEN frame, the connection shall be closed. A value of zero (the default) disables this timeout."
- },
- "httpRootDir": {
- "type": "path",
- "description": "Serve HTTP files from this directory, defaults to the installed stand-alone console directory"
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- },
- "socketAddressFamily": {
- "type": [
- "IPv4",
- "IPv6"
- ],
- "description": "['IPv4', 'IPv6'] IPv4: Internet Protocol version 4; IPv6: Internet Protocol version 6. If not specified, the protocol family will be automatically determined from the address."
- },
- "maxFrameSize": {
- "default": 16384,
- "type": "integer",
- "description": "The maximum frame size in octets that will be used in the connection-open negotiation with a connected peer. The frame size is the largest contiguous set of uninterrupted data that can be sent for a message delivery over the connection. Interleaving of messages on different links is done at frame granularity. Policy settings, if specified, will overwrite this value. Defaults to 16384."
- },
- "sslProfile": {
- "type": "string",
- "description": "Name of the sslProfile."
- },
- "failoverUrls": {
- "type": "string",
- "description": "A comma-separated list of failover urls to be supplied to connected clients. Form: [(amqp|amqps|ws|wss)://]host_or_ip[:port]"
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.listener",
- "description": "Listens for incoming connections to the router."
- },
- "configurationEntity": {
- "operations": [
- "READ"
- ],
- "attributes": {
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.configurationEntity",
- "description": "Base type for entities containing configuration information."
- },
- "routerStats": {
- "operations": [
- "READ"
- ],
- "attributes": {
- "linkRouteCount": {
- "graph": true,
- "type": "integer",
- "description": "Number of link routes attached to the router node."
- },
- "droppedPresettledDeliveries": {
- "graph": true,
- "type": "integer",
- "description": "Number of presettled deliveries that were dropped by the router."
- },
- "rejectedDeliveries": {
- "graph": true,
- "type": "integer",
- "description": "Number of deliveries whose delivery state was set to REJECTED by the router. These deliveries were Invalid and unprocessable."
- },
- "autoLinkCount": {
- "graph": true,
- "type": "integer",
- "description": "Number of auto links attached to the router node."
- },
- "id": {
- "type": "string",
- "description": "Router's unique identity. The router will fail to start without id."
- },
- "presettledDeliveries": {
- "graph": true,
- "type": "integer",
- "description": "Number of presettled deliveries handled by the router."
- },
- "deliveriesIngress": {
- "graph": true,
- "type": "integer",
- "description": "Number of deliveries that were sent to it by a sender that is directly attached to the router."
- },
- "deliveriesIngressRouteContainer": {
- "graph": true,
- "type": "integer",
- "description": "Number of deliveries that were received from router container connections."
- },
- "acceptedDeliveries": {
- "graph": true,
- "type": "integer",
- "description": "Number of deliveries whose delivery state was set to ACCEPTED by the router. These deliveries were successfully processed by the router."
- },
- "version": {
- "type": "string",
- "description": "Software Version"
- },
- "linkCount": {
- "graph": true,
- "type": "integer",
- "description": "Number of links attached to the router node."
- },
- "connectionCount": {
- "graph": true,
- "type": "integer",
- "description": "Number of open connections to the router node."
- },
- "addrCount": {
- "graph": true,
- "type": "integer",
- "description": "Number of addresses known to the router."
- },
- "releasedDeliveries": {
- "graph": true,
- "type": "integer",
- "description": "Number of deliveries whose delivery state was set to RELEASED by the router. These deliveries was not (and will not be) processed"
- },
- "nodeCount": {
- "graph": true,
- "type": "integer",
- "description": "Number of known peer router nodes."
- },
- "modifiedDeliveries": {
- "graph": true,
- "type": "integer",
- "description": "Number of deliveries whose delivery state was set to MODIFIED by the router. These deliveries were modified but not processed."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- },
- "deliveriesEgress": {
- "graph": true,
- "type": "integer",
- "description": "Number of deliveries that were sent by the router to a receiver that is directly attached to the router."
- },
- "deliveriesEgressRouteContainer": {
- "graph": true,
- "type": "integer",
- "description": "Number of deliveries that were sent to route container connections."
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- },
- "deliveriesTransit": {
- "graph": true,
- "type": "integer",
- "description": "Number of deliveries that were sent to another router in the network."
- },
- "mode": {
- "default": "standalone",
- "type": [
- "standalone",
- "interior"
- ],
- "description": "In standalone mode, the router operates as a single component. It does not participate in the routing protocol and therefore will not cooperate with other routers. In interior mode, the router operates in cooperation with other interior routers in an interconnected network."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.routerStats",
- "description": "Overall router statistics."
- },
- "authServicePlugin": {
- "operations": [
- "CREATE",
- "DELETE",
- "READ"
- ],
- "attributes": {
- "saslInitHostname": {
- "type": "string",
- "description": "Value to set for hostname field on sasl-init"
- },
- "authSslProfile": {
- "type": "string",
- "description": "Name of the sslProfile to use for the authentication service."
- },
- "authService": {
- "required": true,
- "type": "string",
- "description": "Address of a service to delegate authentication to."
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.authServicePlugin",
- "description": "EXPERIMENTAL. Attributes for setting SASL plugin."
- },
- "router.node": {
- "operations": [
- "READ"
- ],
- "attributes": {
- "routerLink": {
- "type": "entityId",
- "description": "Local link to remote node"
- },
- "nextHop": {
- "type": "string",
- "description": "Neighbour ID of next hop to remote node from here."
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- },
- "index": {
- "type": "integer",
- "description": "Index number used in statistics histograms for this router node. This index is specific to this router."
- },
- "validOrigins": {
- "type": "list",
- "description": "List of valid origin nodes for messages arriving via the re mote node, used for duplicate elimination in redundant networks."
- },
- "linkState": {
- "type": "list",
- "description": "List of remote node's neighbours."
- },
- "instance": {
- "type": "integer",
- "description": "Remote node boot number."
- },
- "cost": {
- "type": "integer",
- "description": "Reachability cost"
- },
- "protocolVersion": {
- "type": "integer",
- "description": "Router-protocol version supported by the node."
- },
- "address": {
- "type": "string",
- "description": "Address of the remote node"
- },
- "lastTopoChange": {
- "type": "integer",
- "description": "Timestamp showing the most recent change to this node's neighborhood."
- },
- "id": {
- "type": "string",
- "description": "Remote node identifier."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.router.node",
- "description": "Remote router node connected to this router."
- },
- "dummy": {
- "operations": [
- "CREATE",
- "READ",
- "UPDATE",
- "DELETE",
- "CALLME"
- ],
- "attributes": {
- "num1": {
- "type": "integer"
- },
- "num2": {
- "type": "integer"
- },
- "arg1": {
- "type": "string"
- },
- "arg2": {
- "type": "string"
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.dummy",
- "description": "Dummy entity for test purposes."
- },
- "router.address": {
- "operations": [
- "READ"
- ],
- "attributes": {
- "subscriberCount": {
- "graph": true,
- "type": "integer",
- "description": "The number of local subscribers for this address (i.e. attached to this router)"
- },
- "deliveriesEgress": {
- "graph": true,
- "type": "integer",
- "description": "The number of deliveries to this address that exited the router network on this router"
- },
- "deliveriesEgressRouteContainer": {
- "graph": true,
- "type": "integer",
- "description": "Number of deliveries that were sent to a route-container address."
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- },
- "deliveriesIngress": {
- "graph": true,
- "type": "integer",
- "description": "The number of deliveries to this address that entered the router network on this router"
- },
- "transitOutstanding": {
- "type": "list",
- "description": "List of numbers of outstanding deliveries across a transit (inter-router) link for this address. This is for balanced distribution only."
- },
- "deliveriesIngressRouteContainer": {
- "graph": true,
- "type": "integer",
- "description": "Number of deliveries that were received from a route-container address."
- },
- "remoteCount": {
- "graph": true,
- "type": "integer",
- "description": "The number of remote routers that have at least one subscriber to this address"
- },
- "inProcess": {
- "type": "integer",
- "description": "The number of in-process subscribers for this address"
- },
- "deliveriesFromContainer": {
- "graph": true,
- "type": "integer",
- "description": "The number of deliveries to this address that were originated from an in-process entity"
- },
- "deliveriesTransit": {
- "graph": true,
- "type": "integer",
- "description": "The number of deliveries to this address that transited this router to another router"
- },
- "containerCount": {
- "graph": true,
- "type": "integer",
- "description": "The number of attached containers that serve this route address"
- },
- "key": {
- "type": "string",
- "description": "Internal unique (to this router) key to identify the address"
- },
- "distribution": {
- "type": [
- "flood",
- "multicast",
- "closest",
- "balanced",
- "linkBalanced",
- "unavailable"
- ],
- "description": "Forwarding treatment for the address: flood - messages delivered to all subscribers along all available paths (this will cause duplicate deliveries if there are redundant paths); multicast - one copy of each message delivered to all subscribers; closest - messages delivered to only the closest subscriber; balanced - messages delivered to one subscriber with load balanced across subscribers; linkBalanced - for link-routing, link attaches balanced across destinations; unavailable - this address is unavailable, link attaches to an address of unavailable distribution will be rejected."
- },
- "trackedDeliveries": {
- "type": "integer",
- "description": "Number of transit deliveries being tracked for this address (for balanced distribution)."
- },
- "deliveriesToContainer": {
- "graph": true,
- "type": "integer",
- "description": "The number of deliveries to this address that were given to an in-process subscriber"
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- },
- "remoteHostRouters": {
- "type": "list",
- "description": "List of remote routers on which there is a destination for this address."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.router.address",
- "description": "AMQP address managed by the router."
- },
- "router.link": {
- "operations": [
- "UPDATE",
- "READ"
- ],
- "attributes": {
- "adminStatus": {
- "default": "enabled",
- "type": [
- "enabled",
- "disabled"
- ]
- },
- "linkType": {
- "type": [
- "endpoint",
- "router-control",
- "inter-router"
- ],
- "description": "Type of link: endpoint: a link to a normally connected endpoint; inter-router: a link to another router in the network."
- },
- "releasedCount": {
- "graph": true,
- "type": "integer",
- "description": "The total number of released deliveries."
- },
- "capacity": {
- "type": "integer",
- "description": "The capacity, in deliveries, for the link. The number of undelivered plus unsettled deliveries shall not exceed the capacity. This is enforced by link flow control."
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- },
- "operStatus": {
- "type": [
- "up",
- "down",
- "quiescing",
- "idle"
- ]
- },
- "linkDir": {
- "type": [
- "in",
- "out"
- ],
- "description": "Direction of delivery flow over the link, inbound or outbound to or from the router."
- },
- "unsettledCount": {
- "graph": true,
- "type": "integer",
- "description": "The number of unsettled deliveries awaiting settlement on the link"
- },
- "deliveryCount": {
- "graph": true,
- "type": "integer",
- "description": "The total number of deliveries that have traversed this link."
- },
- "ingressHistogram": {
- "type": "list",
- "description": "For outgoing links on connections with 'normal' role. This histogram shows the number of settled deliveries on the link that ingressed the network at each interior router node."
- },
- "droppedPresettledCount": {
- "graph": true,
- "type": "integer",
- "description": "The total number of pre-settled deliveries that were dropped."
- },
- "peer": {
- "type": "string",
- "description": "Identifier of the paired link if this is an attach-routed link."
- },
- "owningAddr": {
- "type": "string",
- "description": "Address assigned to this link during attach: The target for inbound links or the source for outbound links."
- },
- "rejectedCount": {
- "graph": true,
- "type": "integer",
- "description": "The total number of rejected deliveries."
- },
- "undeliveredCount": {
- "graph": true,
- "type": "integer",
- "description": "The number of undelivered messages pending for the link."
- },
- "linkName": {
- "type": "string",
- "description": "Name assigned to the link in the Attach."
- },
- "presettledCount": {
- "graph": true,
- "type": "integer",
- "description": "The total number of pre-settled deliveries."
- },
- "acceptedCount": {
- "graph": true,
- "type": "integer",
- "description": "The total number of accepted deliveries."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- },
- "modifiedCount": {
- "graph": true,
- "type": "integer",
- "description": "The total number of modified deliveries."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.router.link",
- "description": "Link to another AMQP endpoint: router node, client or other AMQP process."
- },
- "org.amqp.management": {
- "operations": [
- "QUERY",
- "GET-TYPES",
- "GET-ANNOTATIONS",
- "GET-OPERATIONS",
- "GET-ATTRIBUTES",
- "GET-MGMT-NODES",
- "READ"
- ],
- "attributes": {
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.org.amqp.management",
- "description": "The standard AMQP management node interface."
- },
- "operationalEntity": {
- "operations": [
- "READ"
- ],
- "attributes": {
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.operationalEntity",
- "description": "Base type for entities containing current operational information."
- },
- "connection": {
- "operations": [
- "READ"
- ],
- "attributes": {
- "container": {
- "type": "string",
- "description": "The container for this connection"
- },
- "opened": {
- "type": "boolean",
- "description": "The connection has been opened (i.e. AMQP OPEN)"
- },
- "sslCipher": {
- "type": "string",
- "description": "SSL cipher name"
- },
- "user": {
- "type": "string",
- "description": "Identity of the authenticated user."
- },
- "sslProto": {
- "type": "string",
- "description": "SSL protocol name"
- },
- "dir": {
- "type": [
- "in",
- "out"
- ],
- "description": "Direction of connection establishment in or out of the router."
- },
- "ssl": {
- "type": "boolean",
- "description": "True iff SSL/TLS is in effect for this connection."
- },
- "host": {
- "type": "string",
- "description": "IP address and port number in the form addr:port."
- },
- "isEncrypted": {
- "type": "boolean",
- "description": "Indicates whether the connection content is encrypted."
- },
- "role": {
- "type": "string"
- },
- "isAuthenticated": {
- "type": "boolean",
- "description": "Indicates whether the identity of the connection's user is authentic."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- },
- "sasl": {
- "type": "string",
- "description": "SASL mechanism in effect for authentication."
- },
- "sslSsf": {
- "type": "integer",
- "description": "SSL strength factor in effect"
- },
- "properties": {
- "type": "map",
- "description": "Connection properties supplied by the peer."
- },
- "tenant": {
- "type": "string",
- "description": "If multi-tenancy is on for this connection, the tenant space in effect"
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.connection",
- "description": "Connections to the router's container."
- },
- "router": {
- "operations": [
- "READ"
- ],
- "attributes": {
- "debugDumpFile": {
- "type": "path",
- "description": "The absolute path to the location for the debug dump file. The router writes debug-level information to this file if the logger is not available."
- },
- "hostName": {
- "type": "string",
- "description": "hostName of machine on which router is running"
- },
- "workerThreads": {
- "default": 4,
- "type": "integer",
- "description": "The number of threads that will be created to process message traffic and other application work (timers, non-amqp file descriptors, etc.) ."
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- },
- "raIntervalSeconds": {
- "default": 30,
- "type": "integer",
- "description": "Interval in seconds between Router-Advertisements sent to all routers in a stable network."
- },
- "area": {
- "type": "string",
- "description": "Unused placeholder."
- },
- "raIntervalFluxSeconds": {
- "default": 4,
- "type": "integer",
- "description": "Interval in seconds between Router-Advertisements sent to all routers during topology fluctuations."
- },
- "allowResumableLinkRoute": {
- "default": true,
- "type": "boolean",
- "description": "Whether links can be routed where timeout is non-zero or expiry-policy is not link-detach"
- },
- "helloIntervalSeconds": {
- "default": 1,
- "type": "integer",
- "description": "Interval in seconds between HELLO messages sent to neighbor routers."
- },
- "helloMaxAgeSeconds": {
- "default": 3,
- "type": "integer",
- "description": "Time in seconds after which a neighbor is declared lost if no HELLO is received."
- },
- "saslConfigDir": {
- "type": "path",
- "description": "Absolute path to the SASL configuration file."
- },
- "defaultDistribution": {
- "default": "balanced",
- "type": [
- "multicast",
- "closest",
- "balanced",
- "unavailable"
- ],
- "description": "Default forwarding treatment for any address without a specified treatment. multicast - one copy of each message delivered to all subscribers; closest - messages delivered to only the closest subscriber; balanced - messages delivered to one subscriber with load balanced across subscribers; unavailable - this address is unavailable, link attaches to an address of unavilable distribution will be rejected."
- },
- "version": {
- "type": "string",
- "description": "Software Version"
- },
- "remoteLsMaxAgeSeconds": {
- "default": 60,
- "type": "integer",
- "description": "Time in seconds after which link state is declared stale if no RA is received."
- },
- "mode": {
- "default": "standalone",
- "type": [
- "standalone",
- "interior"
- ],
- "description": "In standalone mode, the router operates as a single component. It does not participate in the routing protocol and therefore will not cooperate with other routers. In interior mode, the router operates in cooperation with other interior routers in an interconnected network."
- },
- "allowUnsettledMulticast": {
- "type": "boolean",
- "description": "If true, allow senders to send unsettled deliveries to multicast addresses. These deliveries shall be settled by the ingress router. If false, unsettled deliveries to multicast addresses shall be rejected."
- },
- "saslConfigName": {
- "default": "qdrouterd",
- "type": "string",
- "description": "Name of the SASL configuration. This string + '.conf' is the name of the configuration file."
- },
- "id": {
- "type": "string",
- "description": "Router's unique identity. The router will fail to start without id."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- }
- },
- "singleton": true,
- "fullyQualifiedType": "org.apache.qpid.dispatch.router",
- "description": "Tracks peer routers and computes routes to destinations. This entity is mandatory. The router will not start without this entity."
- },
- "vhost": {
- "operations": [
- "CREATE",
- "UPDATE",
- "DELETE",
- "READ"
- ],
- "attributes": {
- "allowUnknownUser": {
- "type": "boolean",
- "description": "Whether unknown users (users who are not members of a defined user group) are allowed to connect to the vhost. Unknown users are assigned to the '$default' user group and receive '$default' settings."
- },
- "maxConnectionsPerUser": {
- "default": 65535,
- "type": "integer",
- "description": "The maximum number of concurrent client connections allowed for any user."
- },
- "hostname": {
- "required": true,
- "type": "string",
- "description": "The hostname of the vhost. This vhost policy will be applied to any client connection that is directed to this hostname."
- },
- "groups": {
- "type": "map",
- "description": "A map where each key is a vhost name and each value is a map of the settings for users of that vhost."
- },
- "maxConnections": {
- "default": 65535,
- "type": "integer",
- "description": "The global maximum number of concurrent client connections allowed for this vhost."
- },
- "maxConnectionsPerHost": {
- "default": 65535,
- "type": "integer",
- "description": "The maximum number of concurrent client connections allowed for any remote host (the host from which the client is connecting)."
- },
- "identity": {
- "unique": true,
- "type": "string",
- "description": "Unique identity generated by the system. Will not change."
- },
- "name": {
- "unique": true,
- "type": "string",
- "description": "Unique name optionally assigned by user. Can be changed."
- }
- },
- "fullyQualifiedType": "org.apache.qpid.dispatch.vhost",
- "description": "AMQP virtual host policy definition of users, user groups, allowed remote hosts, and AMQP restrictions."
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/topologies/config-2/A.conf
----------------------------------------------------------------------
diff --git a/console/config/topologies/config-2/A.conf b/console/config/topologies/config-2/A.conf
deleted file mode 100644
index 4b58d8b..0000000
--- a/console/config/topologies/config-2/A.conf
+++ /dev/null
@@ -1,40 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License
-#
-
-router {
- mode: interior
- id: A
-}
-
-# Listener for a console
-listener {
- port: 5673
- host: 0.0.0.0
- http: true
- saslMechanisms: ANONYMOUS
- name: Console Listener
-}
-
-# connect to B
-connector {
- host: 0.0.0.0
- role: inter-router
- saslMechanisms: ANONYMOUS
- port: 2000
-}
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/topologies/config-2/B.conf
----------------------------------------------------------------------
diff --git a/console/config/topologies/config-2/B.conf b/console/config/topologies/config-2/B.conf
deleted file mode 100644
index 87d9513..0000000
--- a/console/config/topologies/config-2/B.conf
+++ /dev/null
@@ -1,31 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License
-#
-
-router {
- mode: interior
- id: B
-}
-
-# listener for connectors from A
-listener {
- host: 0.0.0.0
- role: inter-router
- saslMechanisms: ANONYMOUS
- port: 2000
-}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[2/5] qpid-dispatch git commit: DISPATCH-1001 Removing developer tool
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/js/qdrTopology.js
----------------------------------------------------------------------
diff --git a/console/config/js/qdrTopology.js b/console/config/js/qdrTopology.js
deleted file mode 100644
index 2347c46..0000000
--- a/console/config/js/qdrTopology.js
+++ /dev/null
@@ -1,2034 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-/**
- * @module QDR
- */
-var QDR = (function(QDR) {
-
- /**
- * @method TopologyController
- *
- * Controller that handles the QDR topology page
- */
- QDR.module.controller("QDR.TopologyController", ['$scope', '$rootScope', 'QDRService', '$location', '$timeout', '$uibModal',
- function($scope, $rootScope, QDRService, $location, $timeout, $uibModal) {
-
- var settings = {baseName: "A", http_port: 5673, normal_port: 22000, internal_port: 2000, default_host: "0.0.0.0", artemis_port: 61616, qpid_port: 5672}
- var sections = ['log', 'connector', 'sslProfile', 'listener', 'address']
- // mouse event vars
- var selected_link = null,
- mousedown_link = null,
- mousedown_node = null,
- mouseover_node = null,
- mouseup_node = null,
- initial_mouse_down_position = null;
-
- $scope.selected_node = null
- $scope.selected_nodes = {}
- $scope.mockTopologies = []
- $scope.mockTopologyDir = ""
- $scope.ansible = false
-
- $scope.Publish = function () {
- doOperation("PUBLISH", function (response) {
- Core.notification('info', $scope.mockTopologyDir + " published");
- QDR.log.info("published " + $scope.mockTopologyDir)
- })
- }
- var startDeploy = function (hosts) {
- var extra = {}
- for (var i=0; i<hosts.length; i++) {
- if (hosts[i].pass !== '')
- extra['ansible_become_pass_' + hosts[i].name] = hosts[i].pass
- }
- // send the deploy command
- doOperation("DEPLOY", function (response) {
- QDR.log.info("deployment " + $scope.mockTopologyDir + " started")
- }, extra)
- }
- $scope.Deploy = function () {
- // show the deploy dialog
- doDeployDialog(startDeploy)
- }
-
- $scope.showConfig = function (node) {
- doOperation("SHOW-CONFIG", function (response) {
- doShowConfigDialog(response)
- }, {nodeIndex: node.index})
- }
- var doOperation = function (operation, callback, extraProps) {
- var l = []
- links.forEach( function (link) {
- if (link.source.nodeType === 'inter-router' && link.target.nodeType === 'inter-router')
- l.push({source: link.source.index,
- target: link.target.index,
- cls: link.cls})
- })
- var props = {nodes: nodes, links: l, topology: $scope.mockTopologyDir, settings: settings}
- if (extraProps)
- Object.assign(props, props, extraProps)
- QDRService.sendMethod(operation, props, function (response) {
- if (callback)
- callback(response)
- })
- }
-
- $scope.canDeploy = function () {
- return nodes.length > 0
- }
- $scope.$watch('mockTopologyDir', function(newVal, oldVal) {
- if (oldVal != newVal) {
- switchTopology(newVal)
- }
- })
- var switchTopology = function (topology) {
- var props = {topology: topology}
- QDRService.sendMethod("SWITCH", props, function (response) {
- if ($scope.mockTopologies.indexOf(topology) == -1) {
- $timeout(function () {$scope.mockTopologies.push(topology)})
- }
- nodes = []
- links = []
- var savedPositions = localStorage[topology] ? angular.fromJson(localStorage[topology]) : undefined
- for (var i=0; i<response.nodes.length; ++i) {
- var node = response.nodes[i]
- var x = 100+i*90
- var y = 200+(i % 2 ? -100 : 100)
- if (savedPositions && node.name in savedPositions) {
- x = savedPositions[node.name].x
- y = savedPositions[node.name].y
- }
- var anode = aNode(node.key, node.name, node.nodeType, 'router', nodes.length, x, y, undefined, false)
- if (node['host'])
- anode['host'] = node['host']
- sections.forEach( function (section) {
- if (node[section+'s']) {
- anode[section+'s'] = node[section+'s']
- }
- })
- nodes.push(anode)
- }
- for (var i=0; i<response.links.length; ++i) {
- var link = response.links[i]
- getLink(link.source, link.target, link.dir, "", link.source + '.' + link.target);
- }
-
- for (var i=0; i<nodes.length; ++i) {
- var node = nodes[i]
- sections.forEach( function (section) {
- if (node[section+'s']) {
- for (var key in node[section+'s']) {
- var type = section
- if (section === 'listener' && key == settings.http_port)
- type = 'console'
- if (section === 'connector' && key == settings.artemis_port && node['connectors'][settings.artemis_port+'']['role'] === 'route-container')
- type = 'artemis'
- if (section === 'connector' && key == settings.qpid_port && node['connectors'][settings.qpid_port+'']['role'] === 'route-container')
- type = 'qpid'
- var sub = genNodeToAdd(node, type, key)
- nodes.push(sub)
- var source = node.id
- var target = nodes.length-1
- getLink(source, target, sub.cdir, "small", source + '.' + target);
- }
- }
- })
- }
-
- animate = true
- QDR.log.info("switched to " + topology)
- initForceGraph()
- $timeout( function () {
- Core.notification('info', "switched to " + props.topology);
- })
- })
- }
-
- $scope.Clear = function () {
- nodes = []
- links = []
- $scope.selected_nodes = {}
- $scope.selected_node = null
- resetMouseVars()
- force.nodes(nodes).links(links).start();
- $timeout( function () {
- restart();
- })
- }
-
- $scope.deleteNode = function (multi) {
- if (multi) {
- var del = true
- while (del) {
- del = false
- for (var i=0; i<nodes.length; i++) {
- if (isSelectedNode(nodes[i])) {
- delNode(nodes[i]) // this changes nodes. we can't continue looping
- del = true
- break;
- }
- }
- }
- } else {
- delNode($scope.selected_node)
- }
- }
-
- var delNode = function (node, skipinit) {
- // loop through all the nodes
- if (node.nodeType !== 'inter-router') {
- var n = findParentNode(node)
- if (n)
- delete n[node.entity+'s'][node.entityKey]
- } else {
- var sub_nodes = []
- for (var x=0; x<sections.length; x++) {
- var section = sections[x]
- if (node[section+'s']) {
- for (var sectionKey in node[section+'s']) {
- var n = findChildNode(section, sectionKey, node.name)
- if (n)
- sub_nodes.push(n)
- }
- }
- }
- for (var x=0; x<sub_nodes.length; x++) {
- delNode(sub_nodes[x], true)
- }
- removeSelectedNode(node)
- }
- // find the index of the node
- var index = nodes.findIndex( function (n) {return n.name === node.name})
- nodes.splice(index, 1)
-
- nodes.forEach( function (n, i) {
- n.id = i
- n.index = i
- })
-
- var i = links.length
- while (i--) {
- if (links[i].source.name === node.name || links[i].target.name === node.name) {
- links.splice(i, 1)
- }
- }
- links.forEach( function (l, i) {
- l.uid = l.source.id + "." + l.target.id
- })
-
- $scope.selected_node = null
-
- if (!skipinit) {
- animate = true
- initGraph()
- initForce()
- restart();
- }
- }
-
- $scope.showMultiActions = function (e) {
- $(document).click();
- e.stopPropagation()
- var position = $('#multiple_action_button').position()
- position.top += $('#multiple_action_button').height() + 8
- position['display'] = "block"
- $('#multiple_action_menu').css(position)
- }
- $scope.showActions = function (e) {
- $(document).click();
- e.stopPropagation()
- var position = $('#action_button').position()
- position.top += $('#action_button').height() + 8
- position['display'] = "block"
- $('#action_menu').css(position)
- }
-
- var genNodeToAdd = function (contextNode, type, entityKey) {
- var id = contextNode.key
- var clients = nodes.filter ( function (node) {
- return node.nodeType !== 'inter-router' && node.routerId === contextNode.name
- })
- var clientLen = 0
- clients.forEach (function (client) {
- clientLen += client.normals.length
- })
- var dir = "out"
- if (type === 'listener')
- dir = "in"
- else if (type === 'console' || type === 'sslProfile')
- dir = "both"
- var name = contextNode.name + "." + (clientLen + 1)
- nodeType = "normal"
- var properties = type === 'console' ? {console_identifier: "Dispatch console"} : {}
- if (type === 'artemis') {
- properties = {product: 'apache-activemq-artemis'}
- nodeType = "route-container"
- }
- if (type === 'qpid') {
- properties = {product: 'qpid-cpp'}
- nodeType = "route-container"
- }
- var node = aNode(id, name, nodeType, type, nodes.length, contextNode.x, contextNode.y - radius - radiusNormal,
- contextNode.id, false, properties)
- var entity = type === 'console' ? 'listener' : type
- entity = (type === 'artemis' || type === 'qpid') ? 'connector' : entity
- node.user = "anonymous"
- node.isEncrypted = false
- node.connectionId = node.id
- node.cdir = dir
- node.entity = entity
- node.entityKey = entityKey
- node.normals = [{name: node.name}]
-
- return node
- }
-
- var addToNode = function (contextNode, type, key) {
- var node = genNodeToAdd(contextNode, type, key)
- nodes.push(node)
-
- var uid = "connection/" + node.host + ":" + node.connectionId
- getLink(contextNode.id, nodes.length-1, node.cdir, "small", uid);
- force.nodes(nodes).links(links).start();
- restart();
- }
-
- $scope.addingNode = {
- step: 0,
- hasLink: false,
- trigger: ''
- };
-
- $scope.cancel = function() {
- $scope.addingNode.step = 0;
- }
-
- $scope.hasConsoleListener = function (node) {
- if (!node) {
- for (var i=0; i<nodes.length; i++) {
- var n = nodes[i]
- var found = n.listeners ? Object.keys(n.listeners).some(function (key) {return key == settings.http_port}) : false
- if (found)
- return true
- }
- return false
- }
- return node.listeners ? Object.keys(node.listeners).some(function (key) {return key == settings.http_port}) : false
- }
- // return a list of keys in a node's extra entities maps
- // called from the template to construct the context menu for nodes
- $scope.getSectionList = function (node, section) {
- if (node && node[section+'s']) {
- if (section === 'listener')
- return node && node.listeners ? Object.keys(node.listeners).filter( function (key) {
- return !node.listeners[key].http
- }) : []
- else
- return Object.keys(node[section+'s'])
- }
- return []
- }
-
- $scope.addConsoleListener = function (node) {
- if (!node.listeners)
- node.listeners = {}
- var host = node.host || settings.default_host
- node.listeners[settings.http_port] = {name: 'Console Listener', http: true, port: settings.http_port, host: host, saslMechanisms: 'ANONYMOUS'}
- addToNode(node, "console", settings.http_port)
- }
- $scope.delConsoleListener = function (node) {
- // find the actual console listener
- var n = findChildNode('listener', settings.http_port, node.name)
- if (n)
- delNode(n)
- }
-
- var yoffset = 1; // toggles between 1 and -1. used to position new nodes
- $scope.addAnotherNode = function (calc) {
- resetMouseVars();
- // add a new node
- var x = radiusNormal * 4;
- var y = x;;
- var offset = $('#topology').offset();
- if (calc) {
- var w = $('#topology').width()
- var h = $('#topology').height()
- var x = (w + offset.left) / 4
- var y = (h + offset.top) / 4 + yoffset * radiusNormal
- yoffset *= -1
- var overlap = true
- while (overlap) {
- overlap = false
- for (var i=0; i<nodes.length; i++) {
- if ((Math.abs(nodes[i].x - x) < radiusNormal * 2) &&
- (Math.abs(nodes[i].y - y) < radiusNormal * 2)) {
- overlap = true
- x += radiusNormal
- if (x + radiusNormal/2 >= offset.left + w) {
- x = offset.left + radiusNormal/2
- y += radiusNormal
- if (y + radiusNormal/2 >= offset.top + h) {
- x = offset.left + radiusNormal
- y = offset.top + radiusNormal
- }
- }
- break;
- }
- }
- }
- } else {
- x = mouseX - offset.left + $(document).scrollLeft();
- y = mouseY - offset.top + $(document).scrollTop();;
- }
- var name = genNewName()
- var nextId = nodes.length //maxNodeIndex() + 1
- var id = "amqp:/_topo/0/" + name + "/$management";
- var node = aNode(id, name, "inter-router", 'router', nextId, x, y, undefined, false)
- node.host = settings.default_host
- nodes.push(node);
- $scope.selected_node = node
- force.nodes(nodes).links(links).start();
- restart(false);
- }
-
- var maxNodeIndex = function () {
- var maxIndex = -1
- nodes.forEach( function (node) {
- if (node.nodeType === "inter-router") {
- if (node.id > maxIndex)
- maxIndex = node.id
- }
- })
- return maxIndex;
- }
-
- // generate unique name for router and containerName
- var genNewName = function() {
- var re = /./g;
- for (var i=0, newName = '', found = true; found; ++i) {
- newName = i.toString(26).replace(re, function (m) {
- var ccode = m.charCodeAt(0)
- if (ccode >= 48 && ccode <= 57)
- return String.fromCharCode(ccode+17)
- return String.fromCharCode(ccode-22)
- })
- found = nodes.some( function (n) {return n.name === newName})
- }
- return newName
- }
-
- $scope.doSettings = function () {
- doSettingsDialog(settings);
- };
- $scope.showNewDlg = function () {
- doNewDialog();
- }
- $scope.reverseLink = function() {
- if (!mousedown_link)
- return;
- var d = mousedown_link;
- for (var i=0; i<links.length; i++) {
- if (links[i].source.index === d.source.index && links[i].target.index === d.target.index ) {
- var tmp = links[i].source
- links[i].source = links[i].target
- links[i].target = tmp
- }
- }
- restart(false);
- tick();
- }
- $scope.removeLink = function() {
- if (!mousedown_link)
- return;
- var d = mousedown_link;
- links.every(function(l, i) {
- if (l.source.id == d.source.id && l.target.id == d.target.id) {
- links.splice(i, 1);
- force.links(links).start();
- return false; // exit the 'every' loop
- }
- return true;
- });
- restart(false);
- tick();
- }
-
- var findChildNode = function (entity, entityKey, name) {
- // find the node that has entity and entityKey
- for (var i=0; i<nodes.length; i++) {
- if (nodes[i].entity === entity && nodes[i].entityKey == entityKey && nodes[i].routerId === name)
- return nodes[i]
- }
- }
- var findParentNode = function (node) {
- // find the node that contains the entity[entityKey] of this node
- for (var i=0; i<nodes.length; i++) {
- if (nodes[i][node.entity+'s'] && node.entityKey in nodes[i][node.entity+'s'])
- return nodes[i]
- }
- }
- // menu item of router to set host of all listeners
- $scope.setRouterHost = function (multi) {
- if (!$scope.selected_node)
- $scope.selected_node = firstSelectedNode()
- doSetRouterHostDialog($scope.selected_node, multi)
- }
- // menu item of router to edit one of its sub-entities
- $scope.editSection = function (multi, type, section) {
- if (!$scope.selected_node)
- $scope.selected_node = firstSelectedNode()
- doEditDialog($scope.selected_node, type, section, multi)
- }
- // menu item of sub-entity to edit itself
- $scope.editThisSection = function (node) {
- var n = findParentNode(node)
- if (n)
- doEditDialog(n, node.entity, node.entityKey, false)
- }
-
- var mouseX, mouseY;
- var relativeMouse = function () {
- var offset = $('#main-container').offset();
- return {left: (mouseX + $(document).scrollLeft()) - 1,
- top: (mouseY + $(document).scrollTop()) - 1,
- offset: offset
- }
- }
- // event handlers for popup context menu
- $(document).mousemove(function(e) {
- mouseX = e.clientX;
- mouseY = e.clientY;
- });
- $(document).mousemove();
- $(document).click(function(e) {
- $("#svg_context_menu").fadeOut(200);
- $("#multiple_action_menu").fadeOut(200);
- $("#action_menu").fadeOut(200);
- $("#link_context_menu").fadeOut(200);
- $("#client_context_menu").fadeOut(200);
- });
- function clearPopups() {
- d3.select("#crosssection").style("display", "none");
- $('.hastip').empty();
- d3.select("#multiple_details").style("display", "none")
- d3.select("#link_details").style("display", "none")
- d3.select('#multiple_action_menu').style('display', 'none');
- d3.select('#action_menu').style('display', 'none');
- d3.select('#svg_context_menu').style('display', 'none');
- d3.select('#link_context_menu').style('display', 'none');
- d3.select('#client_context_menu').style('display', 'none');
- }
-
- var radii = {
- 'inter-router': 25,
- 'normal': 15,
- 'on-demand': 15,
- 'route-container': 15,
- 'host': 20
- };
- var radius = 25;
- var radiusNormal = 15;
- var svg, lsvg;
- var force;
- var animate = false; // should the force graph organize itself when it is displayed
- var path, circle;
- var savedKeys = {};
- var dblckickPos = [0, 0];
- var width = 0;
- var height = 0;
-
- var getSizes = function() {
- var legendWidth = 143;
- var gap = 5;
- var width = $('#topology').width() - gap - legendWidth;
- var top = $('#topology').offset().top
- var height = Math.max(window.innerHeight, top) - top - gap;
- if (width < 10) {
- QDR.log.info("page width and height are abnormal w:" + width + " height:" + height)
- return [0, 0];
- }
- return [width, height]
- }
- var resize = function() {
- if (!svg)
- return;
- var sizes = getSizes();
- width = sizes[0]
- height = sizes[1]
- if (width > 0) {
- // set attrs and 'resume' force
- svg.attr('width', width);
- svg.attr('height', height);
- force.size(sizes).resume();
- }
- }
- window.addEventListener('resize', resize);
- var sizes = getSizes()
- width = sizes[0]
- height = sizes[1]
- if (width <= 0 || height <= 0)
- return
-
- // set up initial nodes and links
- // - nodes are known by 'id', not by index in array.
- // - selected edges are indicated on the node (as a bold red circle).
- // - links are always source < target; edge directions are set by 'left' and 'right'.
- var nodes = [];
- var links = [];
-
- var aNode = function(id, name, nodeType, nodeInfo, nodeIndex, x, y, resultIndex, fixed, properties) {
- for (var i=0; i<nodes.length; ++i) {
- if (nodes[i].name === name)
- return nodes[i]
- }
- properties = properties || {};
- var routerId = QDRService.nameFromId(id)
- return {
- key: id,
- name: name,
- nodeType: nodeType,
- properties: properties,
- routerId: routerId,
- x: x,
- y: y,
- id: nodeIndex,
- host: '0.0.0.0',
- resultIndex: resultIndex,
- cls: nodeInfo
- };
- };
-
-
- var initForm = function(attributes, results, entityType, formFields) {
-
- while (formFields.length > 0) {
- // remove all existing attributes
- formFields.pop();
- }
-
- for (var i = 0; i < attributes.length; ++i) {
- var name = attributes[i];
- var val = results[i];
- var desc = "";
- if (entityType.attributes[name])
- if (entityType.attributes[name].description)
- desc = entityType.attributes[name].description;
-
- formFields.push({
- 'attributeName': name,
- 'attributeValue': val,
- 'description': desc
- });
- }
- }
-
- var savePositions = function () {
- var positions = {}
- nodes.forEach( function (d) {
- positions[d.name] = {
- x: Math.round(d.x),
- y: Math.round(d.y)
- };
- })
- localStorage[$scope.mockTopologyDir] = angular.toJson(positions)
- }
-
- // vary the following force graph attributes based on nodeCount
- // <= 6 routers returns min, >= 80 routers returns max, interpolate linearly
- var forceScale = function(nodeCount, min, max) {
- var count = nodeCount
- if (nodeCount < 6) count = 6
- if (nodeCount > 200) count = 200
- var x = d3.scale.linear()
- .domain([6,200])
- .range([min, max]);
-//QDR.log.debug("forceScale(" + nodeCount + ", " + min + ", " + max + " returns " + x(count) + " " + x(nodeCount))
- return x(count)
- }
- var linkDistance = function (d, nodeCount) {
- if (d.target.nodeType === 'inter-router')
- return forceScale(nodeCount, 150, 20)
- return forceScale(nodeCount, 75, 10)
- }
- var charge = function (d, nodeCount) {
- if (d.nodeType === 'inter-router')
- return forceScale(nodeCount, -1800, -200)
- return -900
- }
- var gravity = function (d, nodeCount) {
- return forceScale(nodeCount, 0.0001, 0.1)
- }
-
- var initGraph = function () {
- d3.select("#SVG_ID").remove();
- svg = d3.select('#topology')
- .append('svg')
- .attr("id", "SVG_ID")
- .attr('width', width)
- .attr('height', height)
- .on("contextmenu", function(d) {
- if (d3.event.defaultPrevented)
- return;
- d3.event.preventDefault();
-
- //if ($scope.addingNode.step != 0)
- // return;
- if (d3.select('#svg_context_menu').style('display') !== 'block')
- $(document).click();
- var rm = relativeMouse()
- d3.select('#svg_context_menu')
- .style('left', (rm.left - 16) + "px")
- .style('top', (rm.top - rm.offset.top) + "px")
- .style('display', 'block');
- })
-
- svg.append("svg:defs").selectAll('marker')
- .data(["end-arrow", "end-arrow-selected", "end-arrow-small", "end-arrow-highlighted"]) // Different link/path types can be defined here
- .enter().append("svg:marker") // This section adds in the arrows
- .attr("id", String)
- .attr("viewBox", "0 -5 10 10")
- .attr("markerWidth", 4)
- .attr("markerHeight", 4)
- .attr("orient", "auto")
- .classed("small", function (d) {return d.indexOf('small') > -1})
- .append("svg:path")
- .attr('d', 'M 0 -5 L 10 0 L 0 5 z')
-
- svg.append("svg:defs").selectAll('marker')
- .data(["start-arrow", "start-arrow-selected", "start-arrow-small", "start-arrow-highlighted"]) // Different link/path types can be defined here
- .enter().append("svg:marker") // This section adds in the arrows
- .attr("id", String)
- .attr("viewBox", "0 -5 10 10")
- .attr("refX", 5)
- .attr("markerWidth", 4)
- .attr("markerHeight", 4)
- .attr("orient", "auto")
- .append("svg:path")
- .attr('d', 'M 10 -5 L 0 0 L 10 5 z');
-
- var hostColors = d3.scale.category10();
- var colors = []
- for (var i=0; i<10; i++) {
- colors.push(hostColors(i))
- }
- svg.append("svg:defs").selectAll('pattern')
- .data(colors)
- .enter().append("pattern")
- .attr({ id:"host"+i, width:"8", height:"8", patternUnits:"userSpaceOnUse", patternTransform:"rotate(-45)"})
- .attr('id', function (d, i) {return 'host_'+i})
- .attr({width:"4", height:"8", patternUnits:"userSpaceOnUse", patternTransform:"rotate(-45)"})
- .append("rect")
- .attr('fill', function (d) {return d})
- .attr({ width:"2", height:"8", transform:"translate(0,0)"});
-
- // handles to link and node element groups
- path = svg.append('svg:g').selectAll('path')
- circle = svg.append('svg:g').selectAll('g')
-
- }
-
- var initLegend = function () {
- // the legend
- d3.select("#svg_legend svg").remove();
- lsvg = d3.select("#svg_legend")
- .append('svg')
- .attr('id', 'svglegend')
- lsvg = lsvg.append('svg:g')
- .attr('transform', 'translate(' + (radii['inter-router'] + 2) + ',' + (radii['inter-router'] + 2) + ')')
- .selectAll('g');
- }
-
- var initForce = function () {
- // convert link source/target into node index numbers
- links.forEach( function (link, i) {
- if (link.source.id) {
- link.source = link.source.id
- link.target = link.target.id
- }
- })
- var routerCount = nodes.filter(function (n) {
- return n.nodeType === 'inter-router'
- }).length
-
- force = d3.layout.force()
- .nodes(nodes)
- .links(links)
- .size([width, height])
- .linkDistance(function(d) { return linkDistance(d, routerCount) })
- .charge(function(d) { return charge(d, routerCount) })
- .friction(.10)
- .gravity(function(d) { return gravity(d, routerCount) })
- .on('tick', tick)
- .on('end', function () {savePositions()})
- .start()
- }
- // initialize the nodes and links array from the QDRService.topology._nodeInfo object
- var initForceGraph = function() {
-
- mouseover_node = null;
- $scope.selected_nodes = {};
- $scope.selected_node = null
- selected_link = null;
-
- initGraph()
- initLegend()
-
- // mouse event vars
- mousedown_link = null;
- mousedown_node = null;
- mouseup_node = null;
-
- savePositions()
- // init D3 force layout
- initForce()
-
- // app starts here
- restart(false);
- force.start();
- tick();
- }
-
- function getContainerIndex(_id, nodeInfo) {
- var nodeIndex = 0;
- for (var id in nodeInfo) {
- if (QDRService.nameFromId(id) === _id)
- return nodeIndex;
- ++nodeIndex;
- }
- return -1;
- }
-
- function getLink(_source, _target, dir, cls, uid) {
- for (var i = 0; i < links.length; i++) {
- var s = links[i].source,
- t = links[i].target;
- if (typeof links[i].source == "object") {
- s = s.id;
- t = t.id;
- }
- if (s == _source && t == _target) {
- return i;
- }
- // same link, just reversed
- if (s == _target && t == _source) {
- return -i;
- }
- }
-
- var link = {
- source: _source,
- target: _target,
- left: dir != "out",
- right: (dir == "out" || dir == "both"),
- cls: cls,
- uid: uid,
- };
- return links.push(link) - 1;
- }
-
-
- function resetMouseVars() {
- mousedown_node = null;
- mouseover_node = null;
- mouseup_node = null;
- mousedown_link = null;
- }
-
- // update force layout (called automatically each iteration)
- function tick() {
- circle.attr('transform', function(d) {
- var cradius;
- if (d.nodeType == "inter-router") {
- cradius = d.left ? radius + 8 : radius;
- } else {
- cradius = d.left ? radiusNormal + 18 : radiusNormal;
- }
- d.x = Math.max(d.x, radiusNormal * 2);
- d.y = Math.max(d.y, radiusNormal * 2);
- d.x = Math.max(0, Math.min(width - cradius, d.x))
- d.y = Math.max(0, Math.min(height - cradius, d.y))
- return 'translate(' + d.x + ',' + d.y + ')';
- });
-
- // draw directed edges with proper padding from node centers
- path.attr('d', function(d) {
- var sourcePadding, targetPadding, r;
-
- if (d.target.nodeType == "inter-router") {
- r = radius;
- // right arrow left line start
- sourcePadding = d.left ? radius + 8 : radius;
- // left arrow right line start
- targetPadding = d.right ? radius + 16 : radius;
- } else {
- r = radiusNormal - 18;
- sourcePadding = d.left ? radiusNormal + 18 : radiusNormal + 10;
- targetPadding = d.right ? radiusNormal + 6 : radiusNormal;
- }
- var dtx = Math.max(targetPadding, Math.min(width - r, d.target.x)),
- dty = Math.max(targetPadding, Math.min(height - r, d.target.y)),
- dsx = Math.max(sourcePadding, Math.min(width - r, d.source.x)),
- dsy = Math.max(sourcePadding, Math.min(height - r, d.source.y));
-
- var deltaX = dtx - dsx,
- deltaY = dty - dsy,
- dist = Math.sqrt(deltaX * deltaX + deltaY * deltaY),
- normX = deltaX / dist,
- normY = deltaY / dist;
- var sourceX = dsx + (sourcePadding * normX),
- sourceY = dsy + (sourcePadding * normY),
- targetX = dtx - (targetPadding * normX),
- targetY = dty - (targetPadding * normY);
- sourceX = Math.max(0, Math.min(width, sourceX))
- sourceY = Math.max(0, Math.min(width, sourceY))
- targetX = Math.max(0, Math.min(width, targetX))
- targetY = Math.max(0, Math.min(width, targetY))
-
- return 'M' + sourceX + ',' + sourceY + 'L' + targetX + ',' + targetY;
- });
-
- if (!animate) {
- animate = true;
- force.stop();
- }
- }
-
- function nodeFor(name) {
- for (var i = 0; i < nodes.length; ++i) {
- if (nodes[i].name == name)
- return nodes[i];
- }
- return null;
- }
-
- function genLinkName(d1, d2) {
- return d1.id + "." + d2.id
- }
- function linkFor(source, target) {
- for (var i = 0; i < links.length; ++i) {
- if ((links[i].source == source) && (links[i].target == target))
- return links[i];
- if ((links[i].source == target) && (links[i].target == source))
- return links[i];
- }
- return null;
- }
-
- function hideLinkDetails() {
- d3.select("#link_details").transition()
- .duration(500)
- .style("opacity", 0)
- .each("end", function(d) {
- d3.select("#link_details").style("display", "none")
- })
- }
-
- var appendTitle = function(g) {
- g.append("svg:title").text(function(d) {
- if (QDRService.isConsole(d)) {
- return 'Dispatch console'
- }
- if (d.properties.product == 'qpid-cpp') {
- return 'Broker - Qpid'
- }
- if (QDRService.isArtemis(d)) {
- return 'Broker - Artemis'
- }
- if (d.cls === 'log') {
- return 'Log' + (d.entityKey ? (': ' + d.entityKey) : '')
- }
- if (d.cls === 'address') {
- return 'Address' + (d.entityKey ? (': ' + d.entityKey) : '')
- }
- if (d.cdir === 'in')
- return 'Listener on port ' + d.entityKey
- if (d.cdir === 'out')
- return 'Connector to ' + d.host + ':' + d.entityKey
- if (d.cdir === 'both')
- return 'sslProfile'
- if (d.cls === 'host')
- return 'Host ' + d.name
- return d.nodeType == 'normal' ? 'client' : (d.nodeType == 'route-container' ? 'broker' : 'Router ' + d.name)
- })
- }
-
- var appendCircle = function(g) {
- // add new circles and set their attr/class/behavior
- return g.append('svg:circle')
- .attr('class', 'node')
- .attr('r', function(d) {
- return radii[d.nodeType]
- })
- .classed('normal', function(d) {
- return d.nodeType == 'normal' || QDRService.isConsole(d)
- })
- .classed('in', function(d) {
- return d.cdir == 'in'
- })
- .classed('out', function(d) {
- return d.cdir == 'out'
- })
- .classed('connector', function(d) {
- return d.cls == 'connector'
- })
- .classed('address', function(d) {
- return d.cls == 'address'
- })
- .classed('listener', function(d) {
- return d.cls == 'listener'
- })
- .classed('selected', function (d) {
- return $scope.selected_node === d
- })
- .classed('inout', function(d) {
- return d.cdir == 'both'
- })
- .classed('inter-router', function(d) {
- return d.nodeType == 'inter-router'
- })
- .classed('on-demand', function(d) {
- return d.nodeType == 'route-container'
- })
- .classed('log', function(d) {
- return d.cls === 'log'
- })
- .classed('console', function(d) {
- return QDRService.isConsole(d)
- })
- .classed('artemis', function(d) {
- return QDRService.isArtemis(d)
- })
- .classed('qpid-cpp', function(d) {
- return QDRService.isQpid(d)
- })
- .classed('route-container', function (d) {
- return (!QDRService.isArtemis(d) && !QDRService.isQpid(d) && d.nodeType === 'route-container')
- })
- .classed('client', function(d) {
- return d.nodeType === 'normal' && !d.properties.console_identifier
- })
- }
-
- var appendContent = function(g) {
- // show node IDs
- g.append('svg:text')
- .attr('x', 0)
- .attr('y', function(d) {
- var y = 7;
- if (QDRService.isArtemis(d))
- y = 8;
- else if (QDRService.isQpid(d))
- y = 9;
- else if (d.nodeType === 'inter-router')
- y = 4;
- return y;
- })
- .attr('class', 'id')
- .classed('log', function(d) {
- return d.cls === 'log'
- })
- .classed('address', function(d) {
- return d.cls === 'address'
- })
- .classed('console', function(d) {
- return QDRService.isConsole(d)
- })
- .classed('normal', function(d) {
- return d.nodeType === 'normal'
- })
- .classed('on-demand', function(d) {
- return d.nodeType === 'on-demand'
- })
- .classed('artemis', function(d) {
- return QDRService.isArtemis(d)
- })
- .classed('qpid-cpp', function(d) {
- return QDRService.isQpid(d)
- })
- .text(function(d) {
- if (QDRService.isConsole(d)) {
- return '\uf108'; // icon-desktop for this console
- } else if (QDRService.isArtemis(d)) {
- return '\ue900'
- } else if (QDRService.isQpid(d)) {
- return '\ue901';
- } else if (d.cls === 'log') {
- return '\uf036';
- } else if (d.cls === 'address') {
- return '\uf2bc';
- } else if (d.nodeType === 'route-container') {
- return d.properties.product ? d.properties.product[0].toUpperCase() : 'S'
- } else if (d.nodeType === 'normal' && d.cdir === "in") // listener
- return '\uf2a0'; // phone top
- else if (d.nodeType === 'normal' && d.cdir === "out") // connector
- return '\uf2a0'; // phone top (will be rotated)
- else if (d.nodeType === 'normal' && d.cdir === "both") // not used
- return '\uf023'; // icon-laptop for clients
- else if (d.nodeType === 'host')
- return ''
-
- return d.name.length > 7 ? d.name.substr(0, 6) + '...' : d.name;
- })
- // rotatie the listener icon 180 degrees to use as the connector icon
- .attr("transform", function (d) {
- var nAngle = 0
- if (d.nodeType === 'normal' && d.cdir === "out" && d.cls === 'connector')
- nAngle = 180
- return "rotate("+nAngle+")"
- });
- }
-
- // takes the nodes and links array of objects and adds svg elements for everything that hasn't already
- // been added
- function restart(start) {
- circle.call(force.drag);
-
- // path (link) group
- path = path.data(links, function(d) {return d.uid});
-
- // update existing links
- path.classed('selected', function(d) {
- return d === selected_link;
- })
- .classed('highlighted', function(d) {
- return d.highlighted;
- })
- .attr('marker-start', function(d) {
- var sel = d === selected_link ? '-selected' : (d.cls === 'small' ? '-small' : '');
- if (d.highlighted)
- sel = "-highlighted"
- return d.left ? 'url(#start-arrow' + sel + ')' : '';
- })
- .attr('marker-end', function(d) {
- var sel = d === selected_link ? '-selected' : (d.cls === 'small' ? '-small' : '');
- if (d.highlighted)
- sel = "-highlighted"
- return d.right ? 'url(#end-arrow' + sel + ')' : '';
- })
-
-
- // add new links. if links[] is longer than the existing paths, add a new path for each new element
- path.enter().append('svg:path')
- .attr('class', 'link')
- .attr('marker-start', function(d) {
- var sel = d === selected_link ? '-selected' : (d.cls === 'small' ? '-small' : '');
- return d.left ? 'url(#start-arrow' + sel + ')' : '';
- })
- .attr('marker-end', function(d) {
- var sel = d === selected_link ? '-selected' : (d.cls === 'small' ? '-small' : '');
- return d.right ? 'url(#end-arrow' + sel + ')' : '';
- })
- .classed('small', function(d) {
- return d.cls == 'small';
- })
- .on('mouseover', function(d) { // mouse over a path
- if ($scope.addingNode.step > 0) {
- if (d.cls == 'temp') {
- d3.select(this).classed('over', true);
- }
- return;
- }
-
- mousedown_link = d;
- selected_link = mousedown_link;
- restart();
- })
- .on('mouseout', function(d) { // mouse out of a path
- if ($scope.addingNode.step > 0) {
- if (d.cls == 'temp') {
- d3.select(this).classed('over', false);
- }
- return;
- }
- selected_link = null;
- restart();
- })
- .on("contextmenu", function(d) { // right click a path
- $(document).click();
- d3.event.preventDefault();
-
- mousedown_link = d;
- var rm = relativeMouse()
- d3.select('#link_context_menu')
- .style('left', rm.left + "px")
- .style('top', (rm.top - rm.offset.top) + "px")
- .style('display', 'block');
- })
- // left click a path
- .on("click", function (d) {
- var clickPos = d3.mouse(this);
- d3.event.stopPropagation();
- clearPopups();
- })
- // remove old links
- path.exit().remove();
-
- // circle (node) group
- // nodes are known by id
- circle = circle.data(nodes, function(d) { return d.name + d.host });
-
- // update existing nodes visual states
- circle.selectAll('circle')
- .classed('highlighted', function(d) {
- return d.highlighted;
- })
- .classed('selected', function(d) {
- return (d === $scope.selected_node)
- })
- // add 'multiple' class to existing <g> elements as needed
- .each(function (d) {
- if (d.normals && d.normals.length > 1) {
- // add the "multiple" class to the parent <g>
- var d3g = d3.select(this.parentElement)
- d3g.attr('class', 'multiple')
- d3g.select('title').remove()
- appendTitle(d3g)
- }
- })
-
- // add new circle nodes. if nodes[] is longer than the existing paths, add a new path for each new element
- var g = circle.enter().append('svg:g')
- .classed('multiple', function(d) {
- return (d.normals && d.normals.length > 1)
- })
-
- appendCircle(g)
- .on('mouseover', function(d) { // mouseover a circle
- if ($scope.addingNode.step > 0) {
- d3.select(this).attr('transform', 'scale(1.1)');
- return;
- }
-
- if (d === mousedown_node)
- return;
- // enlarge target node
- d3.select(this).attr('transform', 'scale(1.1)');
- mousedown_node = null;
- })
- .on('mouseout', function(d) { // mouse out for a circle
- // unenlarge target node
- d3.select(this).attr('transform', '');
- mouseover_node = null;
- restart();
- })
- .on('mousedown', function(d) { // mouse down for circle
- if (d3.event.button !== 0) { // ignore all but left button
- return;
- }
- mousedown_node = d;
- // mouse position relative to svg
- initial_mouse_down_position = d3.mouse(this.parentElement.parentElement.parentElement).slice();
- })
- .on('mouseup', function(d) { // mouse up for circle
- if (!mousedown_node)
- return;
-
- selected_link = null;
- // unenlarge target node
- d3.select(this).attr('transform', '');
-
- // check for drag
- mouseup_node = d;
- var mySvg = this.parentElement.parentElement.parentElement;
- // if we dragged the node, don't do anything
- var cur_mouse = d3.mouse(mySvg);
- if (Math.abs(cur_mouse[0] - initial_mouse_down_position[0]) > 4 ||
- Math.abs(cur_mouse[1] - initial_mouse_down_position[1]) > 4) {
- return
- }
- if (d3.event.ctrlKey && d.cls === 'router') {
- return
- }
- // we want a link between the selected_node and this node
- if ($scope.selected_node && d !== $scope.selected_node) {
- if (d.nodeType !== 'inter-router')
- return;
-
- // add a link from the clicked node to the selected node
- var source = nodes.findIndex( function (n) {
- return (n.key === d.key && n.nodeType === 'inter-router')
- })
- var target = nodes.findIndex( function (n) {
- return (n.key === $scope.selected_node.key && n.nodeType === 'inter-router')
- })
- var curLinkCount = links.length
- var newIndex = getLink(source, target, "in", "", genLinkName(d, $scope.selected_node));
- // there was already a link from selected to clicked node
- if (newIndex != curLinkCount) {
- $scope.selected_node = d
- restart();
- return;
- }
- // add new elements to the svg
- force.links(links).start();
- restart();
- return;
-
- }
-
- // if this node was selected, unselect it
- if (mousedown_node === $scope.selected_node) {
- $scope.selected_node = null;
- } else {
- if (d.nodeType !== 'normal' && d.nodeType !== 'on-demand')
- $scope.selected_node = mousedown_node;
- }
- mousedown_node = null;
- if (!$scope.$$phase) $scope.$apply()
- restart(false);
-
- })
- .on("contextmenu", function(d) { // circle
- clearPopups();
-
- d3.event.preventDefault();
- $scope.selected_node = d;
- if (!$scope.$$phase) $scope.$apply() // we just changed a scope variable during an async event
- var rm = relativeMouse()
- var menu = d.nodeType === 'inter-router' ? 'action_menu' : 'client_context_menu'
- if (isSelectedNode(d))
- menu = 'multiple_action_menu'
- d3.select('#'+menu)
- .style('left', rm.left + "px")
- .style('top', (rm.top - rm.offset.top) + "px")
- .style('display', 'block');
- })
- .on("click", function(d) { // circle
- if (!mouseup_node)
- return;
- if (d3.event.ctrlKey && d.cls === 'router') {
- $timeout( function () {
- toggleSelectedNode(d)
- })
- }
- // clicked on a circle
- clearPopups();
- clickPos = d3.mouse(this);
- d3.event.stopPropagation();
- })
- //.attr("transform", function (d) {return "scale(" + (d.nodeType === 'normal' ? .5 : 1) + ")"})
- //.transition().duration(function (d) {return d.nodeType === 'normal' ? 3000 : 0}).ease("elastic").attr("transform", "scale(1)")
- resetCircleHosts()
- appendContent(g)
- appendTitle(g);
-
- // remove old nodes
- circle.exit().remove();
-
- // add subcircles
- svg.selectAll('.more').remove();
- svg.selectAll('.multiple')
- .append('svg:path')
- .attr('d', "M1.5,-1 V4 M-1,1.5 H4")
- .attr('class', 'more')
- .attr('transform', "translate(18, -3) scale(2)")
-
- // dynamically create the legend based on which node types are present
- // the legend
- updateLegend()
-
- if (!mousedown_node || !$scope.selected_node)
- return;
-
- if (!start)
- return;
- // set the graph in motion
- force.start();
-
- }
-
- function updateLegend() {
- initLegend()
- var legendNodes = [];
- //legendNodes.push(aNode("Router", "", "inter-router", 'router', 0, 0, 0, 0, false, {}))
-
- if (!svg.selectAll('circle.console').empty()) {
- legendNodes.push(aNode("Console", "", "normal", 'console', 1, 0, 0, 0, false, {
- console_identifier: 'Dispatch console'
- }))
- }
- if (!svg.selectAll('circle.listener').empty()) {
- var node = aNode("Listener", "", "normal", 'listener', 2, 0, 0, 0, false, {})
- node.cdir = "in"
- legendNodes.push(node)
- }
- if (!svg.selectAll('circle.connector').empty()) {
- var node = aNode("Connector", "", "normal", 'connector', 3, 0, 0, 0, false, {})
- node.cdir = "out"
- legendNodes.push(node)
- }
- if (!svg.selectAll('circle.address').empty()) {
- var node = aNode("Address", "", "normal", 'address', 4, 0, 0, 0, false, {})
- node.cdir = "out"
- legendNodes.push(node)
- }
- if (!svg.selectAll('circle.sslProfile').empty()) {
- var node = aNode("sslProfile", "", "normal", 'sslProfile', 5, 0, 0, 0, false, {})
- node.cdir = "both"
- legendNodes.push(node)
- }
- if (!svg.selectAll('circle.log').empty()) {
- legendNodes.push(aNode("Logs", "", "normal", 'log', 6, 0, 0, 0, false, {}))
- }
- if (!svg.selectAll('circle.qpid-cpp').empty()) {
- legendNodes.push(genNodeToAdd({key:'Qpid broker', name:'legend', x:0, y:0, id:'legend'}, 'qpid', ''))
- }
- if (!svg.selectAll('circle.artemis').empty()) {
- legendNodes.push(genNodeToAdd({key:'Artemis broker', name:'legend', x:0, y:0, id:'legend'}, 'artemis', ''))
- }
- if (!svg.selectAll('circle.route-container').empty()) {
- legendNodes.push(aNode("Service", "", "route-container", 'service', 9, 0, 0, 0, false,
- {product: ' External Service'}))
- }
- // add a circle for each unique host in nodes
- var hosts = getHosts()
- for (var i=0; i<hosts.length; i++) {
- var host = hosts[i]
- legendNodes.push({key: host, name: host, nodeType: 'host', id: getHostIndex(host), properties: {}, host: host, cls: 'host'})
- }
-
- lsvg = lsvg.data(legendNodes, function(d) {
- return d.key;
- });
- var lg = lsvg.enter().append('svg:g')
- .attr('transform', function(d, i) {
- // 45px between lines and add 10px space after 1st line
- return "translate(0, " + (45 * i) + ")"
- })
-
- appendCircle(lg)
- resetCircleHosts()
- appendContent(lg)
- appendTitle(lg)
- lg.append('svg:text')
- .attr('x', 35)
- .attr('y', 6)
- .attr('class', "label")
- .text(function(d) {
- return d.key
- })
- lsvg.exit().remove();
- var svgEl = document.getElementById('svglegend')
- if (svgEl) {
- var bb;
- // firefox can throw an exception on getBBox on an svg element
- try {
- bb = svgEl.getBBox();
- } catch (e) {
- bb = {
- y: 0,
- height: 200,
- x: 0,
- width: 200
- }
- }
- svgEl.style.height = (bb.y + bb.height) + 'px';
- svgEl.style.width = (bb.x + bb.width) + 'px';
- }
-
- }
-
- // Ensure a host name will always return the same number (for this session)
- // This is to make sure the colors associated with host names don't change
- // In other words, if you have a node with host==localhost and then delete it, all the
- // other host colors won't change and if you re-add localhost it would get the original color
- var knownHosts = {}
- function initHosts() {
- var hosts = getHosts()
- var hostColors = d3.scale.category10();
- for (var i=0; i<hosts.length; i++) {
- knownHosts[hosts[i]] = i
- }
-
- var style = document.createElement("style");
- style.appendChild(document.createTextNode(""));
- document.head.appendChild(style);
- var sheet = style.sheet ? style.sheet : style.styleSheet;
- for (var i=0; i<10; i++) {
- if (sheet.insertRule) {
- sheet.insertRule("button {color:red}", 0);
- sheet.insertRule("circle.node.host"+i+" {fill: " + hostColors(i) + ";}", 0);
- sheet.insertRule("circle.node.host"+i+".multi-selected {fill: url(#host_"+i+");}", 1);
- sheet.insertRule("div.node.host"+i+" {background-color: " + hostColors(i) + ";}", 2);
- } else if (sheet.addRule) { // for IE < 9
- sheet.addRule("circle.node.host"+i, "fill: " + hostColors(i) + ";", 0);
- sheet.addRule("circle.node.host"+i+".multi-selected", "fill: url(#host_"+i+")", 1);
- sheet.addRule("div.node.host"+i, "background-color: " + hostColors(i) + ";", 2);
- }
- }
-
- }
- function getHosts() {
- var hosts = {}
- for (var i=0; i<nodes.length; i++) {
- var node = nodes[i]
- if (node.host && node.cls === 'router')
- hosts[node.host] = 1
- }
- return Object.keys(hosts)
- }
- initHosts()
- function getHostIndex(h) {
- if (h in knownHosts)
- return knownHosts[h]
- knownHosts[h] = Object.keys(knownHosts).length
- return knownHosts[h]
- }
- function mousedown() {
- // prevent I-bar on drag
- //d3.event.preventDefault();
-
- // because :active only works in WebKit?
- svg.classed('active', true);
- }
-
- // we are about to leave the page, save the node positions
- $rootScope.$on('$locationChangeStart', function(event, newUrl, oldUrl) {
- savePositions()
- });
- // When the DOM element is removed from the page,
- // AngularJS will trigger the $destroy event on
- // the scope
- $scope.$on("$destroy", function(event) {
- savePositions();
- d3.select("#SVG_ID").remove();
- window.removeEventListener('resize', resize);
- });
-
- QDRService.sendMethod("ANSIBLE-INSTALLED", {}, function (response) {
- $scope.ansible = (response !== "")
- })
- QDRService.sendMethod("GET-TOPOLOGY-LIST", {}, function (response) {
- $scope.mockTopologies = response.sort()
- QDRService.sendMethod("GET-TOPOLOGY", {}, function (response) {
- // this will trigger the watch on this variable which will get the topology
- $timeout(function () {
- $scope.mockTopologyDir = response
- })
- })
- })
-
- function doShowConfigDialog(config) {
- var d = $uibModal.open({
- dialogClass: "modal dlg-large",
- backdrop: true,
- keyboard: true,
- backdropClick: true,
- controller: 'QDR.ShowConfigDialogController',
- templateUrl: 'show-config-template.html',
- resolve: {
- config: function() {
- return config;
- }
- }
- });
- }
- // set the host# class for all inter-router circles
- function resetCircleHosts() {
- var sel = d3.selectAll('circle.node')
- for (var i=0; i<10; i++) {
- sel.classed('host'+i, function (d) {
- return i === getHostIndex(d.host) && (d.cls === 'router' || d.cls === 'host')
- })
- }
- }
-
- function firstSelectedNode() {
- return $scope.selected_nodes[Object.keys($scope.selected_nodes)[0]]
- }
- function isSelectedNode(d) {
- return d.name in $scope.selected_nodes
- }
- $scope.anySelectedNodes = function() {
- return (Object.keys($scope.selected_nodes).length > 0)
- }
- function updateSelectedNodes() {
- d3.selectAll('circle.node.inter-router')
- .classed('multi-selected', function (d) {
- return d.name in $scope.selected_nodes
- })
- .attr('fill', function (d) {
- var hostIndex = getHostIndex(d.host)
- return "url(#host_" + hostIndex+")"
- })
- restart();
- }
- function removeSelectedNode(d) {
- if (d.name in $scope.selected_nodes) {
- delete $scope.selected_nodes[d.name]
- updateSelectedNodes()
- }
- }
- function toggleSelectedNode(d) {
- if (d.name in $scope.selected_nodes)
- delete $scope.selected_nodes[d.name]
- else
- $scope.selected_nodes[d.name] = d
- updateSelectedNodes()
- }
- function addSelectedNode(d) {
- $scope.selected_nodes[d.name] = d
- updateSelectedNodes()
- }
-
- function doSetRouterHostDialog(node, multi) {
- var d = $uibModal.open({
- dialogClass: "modal dlg-large",
- backdrop: true,
- keyboard: true,
- backdropClick: true,
- controller: 'QDR.SetRouterHostDialogController',
- templateUrl: 'set-router-host.html',
- resolve: {
- host: function() {
- var host = node.host || '0.0.0.0'
- return host;
- }
- }
- });
- $timeout(function () {
- d.result.then(function(result) {
- if (result) {
- function setAHost(n) {
- n.host = result.host
- // loop through all listeners and set the host
- if (node.listeners) {
- for (var listener in n.listeners) {
- n.listeners[listener].host = result.host
- }
- }
- }
- if (multi) {
- for (var i=0; i<nodes.length; i++) {
- if (isSelectedNode(nodes[i]))
- setAHost(nodes[i])
- }
- } else
- setAHost(node)
- resetCircleHosts()
- restart()
- }
- });
- })
- }
-
- function doNewDialog() {
- var d = $uibModal.open({
- dialogClass: "modal dlg-large",
- backdrop: true,
- keyboard: true,
- backdropClick: true,
- controller: 'QDR.NewDialogController',
- templateUrl: 'new-config-template.html',
- resolve: {
- list: function() {
- return $scope.mockTopologies;
- }
- }
- });
- $timeout(function () {
- d.result.then(function(result) {
- if (result) {
- // append the new topology to the list of configs and switch to the new one
- if ($scope.mockTopologies.indexOf(result.newTopology) < 0) {
- $scope.mockTopologies.push(result.newTopology)
- $scope.mockTopologies.sort()
- }
- $scope.mockTopologyDir = result.newTopology
- }
- });
- })
- };
- function doDeployDialog(startFn) {
- var host = undefined
- var port = undefined
- for (var i=0; i<nodes.length; i++) {
- var node = nodes[i]
- if (node.listeners) {
- for (var l in node.listeners) {
- var listener = node.listeners[l]
- if (listener.http) {
- host = node.host
- port = listener.port
- }
- }
- }
- }
- var d = $uibModal.open({
- dialogClass: "modal dlg-large",
- backdrop: true,
- keyboard: true,
- backdropClick: true,
- controller: 'QDR.DeployDialogController',
- templateUrl: 'deploy-template.html',
- resolve: {
- dir: function () {
- return $scope.mockTopologyDir
- },
- http_host: function () {
- return host
- },
- http_port: function () {
- return port
- },
- start_fn: function () {
- return startFn
- },
- hosts: function () {
- var hosts = []
- var hostNames = getHosts()
- for (var i=0; i<hostNames.length; i++) {
- var hostName = hostNames[i]
- var hostIndex = getHostIndex(hostName)
- var hostNodes = []
- for (var j=0; j<nodes.length; j++) {
- if (nodes[j].host === hostName && nodes[j].cls === 'router') {
- hostNodes.push(nodes[j].name)
- }
- }
- hosts.push({name: hostName, nodes: hostNodes, color: 'host'+hostIndex, pass: ''})
- }
- return hosts
- }
- }
- });
- $timeout(function () {
- d.result.then(function(result) {
- if (result) {
- }
- });
- })
- }
-
- function doSettingsDialog(opts) {
- var d = $uibModal.open({
- dialogClass: "modal dlg-large",
- backdrop: true,
- keyboard: true,
- backdropClick: true,
- controller: 'QDR.SettingsDialogController',
- templateUrl: 'settings-template.html',
- resolve: {
- settings: function() {
- return opts
- }
- }
- });
- $timeout(function () {
- d.result.then(function(result) {
- if (result) {
- Object.assign(settings, result)
- }
- });
- })
- };
- function valFromMapArray(ar, key, val) {
- for (var i=0; i<ar.length; i++) {
- if (ar[i][key] && ar[i][key] === val)
- return ar[i]
- }
- return undefined
- }
-
- function doEditDialog(node, entity, context, multi) {
- var entity2key = {router: 'name', log: 'module', sslProfile: 'name', connector: 'port', listener: 'port', address: 'pattern|prefix'}
- var d = $uibModal.open({
- dialogClass: "modal dlg-large",
- backdrop: true,
- keyboard: true,
- backdropClick: true,
- controller: 'QDR.NodeDialogController',
- templateUrl: 'node-config-template.html',
- resolve: {
- node: function() {
- return node;
- },
- entityType: function() {
- return entity
- },
- context: function () {
- return context
- },
- entityKey: function () {
- return entity2key[entity]
- },
- hasLinks: function () {
- return links.some(function (l) {
- return l.source.key === node.key || l.target.key === node.key
- })
- },
- maxPort: function () {
- var maxPort = settings.normal_port
- nodes.forEach(function (node) {
- if (node.entity === 'listener' || node.entity === 'connector') {
- if (node.entityKey !== 'amqp' && node.entityKey != settings.artemis_port && node.entityKey != settings.qpid_port)
- if (parseInt(node.entityKey) > maxPort)
- maxPort = parseInt(node.entityKey)
- }
- })
- return maxPort
- }
- }
- });
- d.result.then(function(result) {
- if (result) {
- if (entity === 'router') {
- var router = valFromMapArray(result.entities, "actualName", "router")
- if (router) {
- var r = new FormValues(router)
- r.name(router)
- Object.assign(node, r.node)
- initGraph()
- initForce()
- restart();
- }
- }
- else {
- if ('del' in result) {
- // find the 'normal' node that is associated with this entry
- var n = findChildNode(entity, context, node.name)
- if (n)
- delNode(n)
- } else {
- var rVals = valFromMapArray(result.entities, "actualName", entity)
- if (rVals) {
- var nodeObj = node[entity+'s']
- var key = entity2key[entity]
- var o = new FormValues(rVals)
- oNodeKey = o.node[key]
- // address can have either a prefix or pattern
- if (entity === 'address') {
- oNodeKey = o.node['prefix'] ? o.node['prefix'] : o.node['pattern']
- }
- if (!angular.isDefined(nodeObj)) {
- node[entity+'s'] = {}
- nodeObj = node[entity+'s']
- }
- // we were editing an existing section and the key for that section was changed
- else if (oNodeKey !== context && context !== 'new' && context !== 'artemis' && context != 'qpid') {
- delete nodeObj[context]
- }
- if (entity === 'log' || entity === 'address') {
- if (multi) {
- // apply this entity's key to all selected routers
- for (var i=0; i<nodes.length; i++) {
- if (isSelectedNode(nodes[i])) {
- var ents = nodes[i][entity+'s']
- if (!ents)
- nodes[i][entity+'s'] = {}
- if (!nodes[i][entity+'s'][oNodeKey])
- addToNode(nodes[i], entity, oNodeKey)
- nodes[i][entity+'s'][oNodeKey] = o.node
- }
- }
- return
- }
- }
- nodeObj[oNodeKey] = o.node
- if (entity === 'sslProfile')
- return
- if (context === 'new' || context === 'artemis' || context === 'qpid') {
- if (context !== 'new')
- entity = context
- addToNode(node, entity, oNodeKey)
- }
- }
- }
- }
- }
- });
- };
-
- var FormValues = function (entity) {
- this.node = {};
- for (var i=0; i<entity.attributes.length; i++) {
- var attr = entity.attributes[i]
- if (typeof attr.rawtype === 'object' && attr['selected'])
- attr['value'] = attr['selected']
- this.node[attr['name']] = attr['value']
- }
- };
-
- FormValues.prototype.name = function (entity) {
- var name = valFromMapArray(entity.attributes, "name", "name")
- if (name) {
- name = name.value
- this.node['name'] = name
- this.node['routerId'] = name
- this.node['key'] = "amqp:/_topo/0/" + name + "/$management"
- }
- };
-
-
- }
- ]);
-
- QDR.module.controller("QDR.SetRouterHostDialogController", function ($scope, $uibModalInstance, host) {
- $scope.host = host
- $scope.setSettings = function () {
- $uibModalInstance.close({host: $scope.host});
- }
-
- $scope.cancel = function () {
- $uibModalInstance.close()
- }
- })
-
- QDR.module.controller("QDR.ShowConfigDialogController", function ($scope, $uibModalInstance, config) {
- $scope.config = config
- $scope.ok = function () {
- $uibModalInstance.close()
- }
- })
-
- QDR.module.controller("QDR.NewDialogController", function($scope, $uibModalInstance, list) {
- $scope.newTopology = ""
- $scope.exclude = list
- $scope.inList = function () {
- return $scope.exclude.indexOf($scope.newTopology) >= 0
- }
-
- $scope.setSettings = function () {
- $uibModalInstance.close({
- newTopology: $scope.newTopology
- });
- }
- $scope.cancel = function () {
- $uibModalInstance.close()
- }
- })
-
- QDR.module.controller("QDR.SettingsDialogController", function($scope, $uibModalInstance, settings) {
- var local_settings = {}
- Object.assign(local_settings, settings)
- $scope.entity = {description: "Settings",
- attributes: [
- {name: "baseName", humanName: "Starting router name", input: "input", type: "text", value: local_settings.baseName, required: true},
- {name: "http", humanName: "Port for console listeners", input: "input", type: "text", value: local_settings.http_port, required: true},
- {name: "normal_port", humanName: "Starting port for normal listeners/connectors", input: "input", type: "text", value: local_settings.normal_port, required: true},
- {name: "internal_port", humanName: "Starting port for inter-router listeners/connectors", input: "input", type: "text", value: local_settings.internal_port, required: true}
- ]}
-
- $scope.setSettings = function () {
- var newSettings = {}
- $scope.entity.attributes.forEach( function (attr) {
- newSettings[attr.name] = attr.value
- })
- $uibModalInstance.close(newSettings);
- }
-
- $scope.cancel = function () {
- $uibModalInstance.close()
- }
-
- })
-
- QDR.module.directive('focusWhen', function($timeout) {
- return {
- restrict : 'A',
- link : function($scope, $element, $attr) {
- $scope.$watch($attr.focusWhen, function(val) {
- $timeout(function() {
- if (val)
- $element[0].focus()
- });
- });
- }
- }
- })
-
- QDR.module.controller("QDR.DeployDialogController", function($scope, $uibModalInstance, QDRService, $timeout, $sce, dir, http_host, http_port, hosts, start_fn) {
- // setup polling to get deployment status
- $scope.polling = true
- $scope.state = "Deploying " + dir
- $scope.deploy_state = ""
- $scope.close_button_class = "btn-warning"
- var success_state = "Deploy Completed"
- $scope.address = ""
- var pollTimer = null
- function doPoll() {
- QDRService.sendMethod("DEPLOY-STATUS", {config: dir}, function (response) {
- if (response[1] !== 'DEPLOYING') {
- $scope.polling = false
- if (response[1] === "DONE") {
- $scope.state = success_state
- $scope.close_button_class = "btn-success"
- Core.notification('info', dir + " deployed");
- if (http_host && http_port) {
- $scope.address = $sce.trustAsHtml("http://" + http_host + ":" + http_port + "/#!/topology")
- }
- } else {
- $scope.state = "Deploy Failed"
- $scope.close_button_class = "btn-danger"
- Core.notification('error', dir + " deployment failed");
- }
- }
- $timeout(function () {
- $scope.status = response[0]
- scrollToEnd()
- if ($scope.polling) (
- pollTimer = setTimeout(doPoll, 1000)
- )
- })
- })
- }
- $scope.deploy = function () {
- $scope.deploy_state = "deploying"
- start_fn(hosts)
- doPoll()
- }
- $scope.done = function () {
- return !$scope.polling && $scope.state === success_state
- }
- $scope.hasConsole = function () {
- return http_host && http_port && $scope.state === success_state
- }
-
- $scope.showing_pass = undefined
- $scope.show_pass = function (host) {
- $scope.showing_pass = (host) ? host.name : ''
- }
- $scope.hosts = hosts
- $scope.pass = function () {
- console.log('set password')
- }
-
- function scrollTopTween(scrollTop) {
- return function() {
- var i = d3.interpolateNumber(this.scrollTop, scrollTop);
- return function(t) { this.scrollTop = i(t); };
- }
- }
- var scrollToEnd = function () {
- var scrollheight = d3.select("#deploy_output").property("scrollHeight");
-
- d3.select('#deploy_output')
- .transition().duration(1000)
- .tween("uniquetweenname", scrollTopTween(scrollheight));
- }
- $scope.cancel = function () {
- polling = false
- clearTimeout(pollTimer)
- $uibModalInstance.close()
- }
-
- })
-
- return QDR;
-}(QDR || {}));
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/mock/__init__.py
----------------------------------------------------------------------
diff --git a/console/config/mock/__init__.py b/console/config/mock/__init__.py
deleted file mode 100644
index 60a44fd..0000000
--- a/console/config/mock/__init__.py
+++ /dev/null
@@ -1,23 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License
-#
-
-from section import *
-from schema import Schema
-
-
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/mock/schema.py
----------------------------------------------------------------------
diff --git a/console/config/mock/schema.py b/console/config/mock/schema.py
deleted file mode 100644
index 524164b..0000000
--- a/console/config/mock/schema.py
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/env python
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-import json
-
-class Schema(object):
- schema = {}
-
- @staticmethod
- def i(entity, attribute):
- return Schema.schema[entity]["attributeNames"].index(attribute)
-
- @staticmethod
- def type(entity):
- return Schema.schema[entity]["fullyQualifiedType"]
-
- @staticmethod
- def attrs(entity):
- return Schema.schema[entity]['attributeNames']
-
- @staticmethod
- def default(entity, attribute):
- return Schema.schema[entity]["defaults"].get(attribute)
-
- @staticmethod
- def init(path=''):
- with open(path+"schema.json") as fp:
- data = json.load(fp)
- for entity in data["entityTypes"]:
- Schema.schema[entity] = {"attributeNames": [],
- "fullyQualifiedType": data["entityTypes"][entity]["fullyQualifiedType"],
- "defaults": {}}
- for attribute in data["entityTypes"][entity]["attributes"]:
- Schema.schema[entity]["attributeNames"].append(attribute)
- if "default" in data["entityTypes"][entity]["attributes"][attribute]:
- Schema.schema[entity]["defaults"][attribute] = data["entityTypes"][entity]["attributes"][attribute]["default"]
- Schema.schema[entity]["attributeNames"].append("type")
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/mock/section.py
----------------------------------------------------------------------
diff --git a/console/config/mock/section.py b/console/config/mock/section.py
deleted file mode 100644
index ce71d7c..0000000
--- a/console/config/mock/section.py
+++ /dev/null
@@ -1,111 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-import json
-import re
-from schema import Schema
-import pdb
-
-class ConfigSection(object):
- def __init__(self, type, defaults, ignore, forced, opts):
- self.type = type
- self.entries = {}
- for key in defaults:
- if not key in opts:
- opts[key] = defaults[key]
-
- for key in list(opts.keys()):
- if not key in Schema.attrs(self.type):
- del opts[key]
- elif key.endswith('Count') or key in ignore or opts[key] is None:
- del opts[key]
- elif opts[key] == Schema.default(self.type, key) and key not in forced:
- del opts[key]
-
- self.setEntries(opts)
-
- def setType(self, type):
- self.type = type
-
- def setEntry(self, name, val):
- self.entries[name] = val
-
- def setEntries(self, d):
- self.entries.update(d)
-
- def __repr__(self):
- # ensure all entries have values
- self.entries = {k: v for k, v in self.entries.iteritems() if self.entries.get(k)}
- raw = self.type + " " + json.dumps(self.entries, indent=4, separators=('', ': '))
- return re.sub('["]', '', raw)
-
-class RouterSection(ConfigSection):
- defaults = {"mode": "interior"}
- ignore = ["type", "routerId", "identity", "name"]
- def __init__(self, id, **kwargs):
- super(RouterSection, self).__init__("router", RouterSection.defaults, RouterSection.ignore, [], kwargs)
- self.setEntry("id", id)
-
- def __repr__(self):
- s = super(RouterSection, self).__repr__()
- return s.replace('deploy_host', '#deploy_host', 1)
-
-class ListenerSection(ConfigSection):
- defaults = {"role": "normal",
- "host": "0.0.0.0",
- "saslMechanisms": 'ANONYMOUS'
- }
- def __init__(self, port, **kwargs):
- super(ListenerSection, self).__init__("listener", ListenerSection.defaults, [], [], kwargs)
- self.setEntry("port", port)
-
-class ConnectorSection(ConfigSection):
- defaults = {"role": "normal",
- "host": "0.0.0.0",
- "saslMechanisms": 'ANONYMOUS'
- }
- def __init__(self, port, **kwargs):
- super(ConnectorSection, self).__init__("connector", ConnectorSection.defaults, [], [], kwargs)
- self.setEntry("port", port)
-
-class SslProfileSection(ConfigSection):
- def __init__(self, **kwargs):
- super(SslProfileSection, self).__init__("sslProfile", {}, [], [], kwargs)
-
-class LogSection(ConfigSection):
- def __init__(self, **kwargs):
- super(LogSection, self).__init__("log", {}, [], [], kwargs)
-
-class AddressSection(ConfigSection):
- def __init__(self, **kwargs):
- super(AddressSection, self).__init__("address", {}, [], ['distribution'], kwargs)
-
-if __name__ == '__main__':
- Schema.init('../')
- r = RouterSection("QDR.A")
- l = ListenerSection(20000)
- c = ConnectorSection(20001)
- s = SslProfileSection()
- g = LogSection(module="ROUTER", enable="trace+")
- print r
- print l
- print c
- print s
- print g
-
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/package.json
----------------------------------------------------------------------
diff --git a/console/config/package.json b/console/config/package.json
deleted file mode 100644
index 17e801a..0000000
--- a/console/config/package.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "name": "qpid-dispatch-console-config",
- "version": "0.1.0",
- "description": "Apache Qpid Dispatch Console Config and Deploy Utility",
- "main": "index.html",
- "scripts": {
- "test": "echo \"Error: no test specified\" && exit 1"
- },
- "keywords": [
- "Apache",
- "Qpid",
- "Dispatch",
- "Console"
- ],
- "author": "Apache Qpid",
- "license": "Apache-2.0",
- "dependencies": {
- "angular": "^1.6.6",
- "angular-animate": "^1.6.6",
- "angular-resource": "^1.6.6",
- "angular-sanitize": "^1.6.6",
- "angular-ui-bootstrap": "^2.5.6",
- "d3": "^3.5.17",
- "font-awesome": "^4.7.0",
- "html5shiv": "^3.7.3",
- "jquery": "^3.2.1",
- "jquery-ui-dist": "^1.12.1",
- "jquery-ui-themes": "^1.12.0",
- "notifyjs-browser": "^0.4.2",
- "patternfly": "^3.28.1"
- },
- "devDependencies": {},
- "repository": {
- "type": "git",
- "url": "https://git-wip-us.apache.org/repos/asf/qpid-dispatch"
- }
-}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[3/5] qpid-dispatch git commit: DISPATCH-1001 Removing developer tool
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/html/qdrTopology.html
----------------------------------------------------------------------
diff --git a/console/config/html/qdrTopology.html b/console/config/html/qdrTopology.html
deleted file mode 100644
index 77ab74a..0000000
--- a/console/config/html/qdrTopology.html
+++ /dev/null
@@ -1,279 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<div class="qdrTopology row-fluid" ng-controller="QDR.TopologyController">
- <div id="buttonBar" class="navbar-primary">
- Current topology
- <select ng-model="mockTopologyDir" ng-options="item for item in mockTopologies"></select>
- <button class="btn btn-primary" type="button" ng-click="Publish()" title="Save this topology">Save</button>
- <button class="btn btn-primary" type="button" ng-click="Clear()" title="Remove all routers">Clear</button>
- <button class="btn btn-primary" type="button" ng-click="Deploy()" ng-disabled="!canDeploy()" ng-if="ansible" title="Deploy this topology">Deploy</button>
- <button class="btn btn-primary pull-right" type="button" ng-click="doHelp()" title="Show help">?</button>
- <button class="btn btn-primary pull-right" type="button" ng-click="doSettings()" title="Show global settings">Settings</button>
- <button class="btn btn-primary pull-right" type="button" ng-click="showNewDlg()" title="Enter a new topology name">New Topology</button>
- <div class="selected-node pull-right">
- <button class="btn btn-primary" type="button" ng-click="addAnotherNode(true)"><b class="plus caret"></b> Add new router</button>
- <!-- <button id="action_button" class="btn btn-primary" type="button" ng-disabled="!selected_node" ng-click="showActions($event)" title="Show actions on selected router">Actions <b class="down caret"></b></button> -->
- <button id="multiple_action_button" class="btn btn-primary" type="button" ng-disabled="!anySelectedNodes()" ng-click="showMultiActions($event)" title="Show actions on selected routers">Actions for selected routers<b class="down caret"></b></button>
- </div>
- </div>
- <div id="topology"><!-- d3 toplogy here --></div>
- <div id="svg_context_menu" class="contextMenu">
- <ul>
- <li ng-click="addAnotherNode()">Add a new router</li>
- </ul>
- </div>
- <div id="link_context_menu" class="contextMenu">
- <ul>
- <li ng-click="reverseLink()">Reverse connection direction</li>
- <li ng-click="removeLink()">Remove connection</li>
- <li class="context-separator"></li>
- <li ng-click="linkConfig()">Set port for connection.</li>
- </ul>
- </div>
- <div id="svg_legend"></div>
- <div id="action_menu" class="contextMenu">
- <ul>
- <li ng-click="editSection(selected_node, 'router')">Edit router info</li>
- <li ng-click="setRouterHost()">Set router host</li>
-
- <li class="context-separator"></li>
- <li ng-click="editSection(false, 'log', 'new')">Add new log section</li>
- <li ng-repeat="log in getSectionList(selected_node, 'log')" ng-click="editSection(selected_node, 'log', log)">Edit/Delete {{log}} log section</li>
-
- <li class="context-separator"></li>
- <li ng-click="editSection(false, 'address', 'new')">Add new address section</li>
- <li ng-repeat="address in getSectionList(selected_node, 'address')" ng-click="editSection(selected_node, 'address', address)">Edit/Delete {{address}} address section</li>
-
- <li class="context-separator"></li>
- <li ng-click="editSection(selected_node, 'sslProfile', 'new')">Add new sslProfile section</li>
- <li ng-repeat="ssl in getSectionList(selected_node, 'sslProfile')" ng-click="editSection(selected_node, 'sslProfile', ssl)">Edit/Delete {{ssl}} sslProfile section</li>
-
- <li class="context-separator"></li>
- <li ng-click="editSection(selected_node, 'connector', 'new')">Add new connector section</li>
- <li ng-click="editSection(selected_node, 'connector', 'artemis')">Add new connector for Artemis broker</li>
- <li ng-click="editSection(selected_node, 'connector', 'qpid')">Add new connector for Qpid broker</li>
- <!-- <li ng-repeat="connector in getSectionList(selected_node, 'connector')" ng-click="editSection(selected_node, 'connector', connector)">Edit/Delete {{connector}} connector section</li> -->
-
- <li class="context-separator"></li>
- <li ng-click="editSection(selected_node, 'listener', 'new')">Add new listener section</li>
- <li ng-if="!hasConsoleListener()" ng-click="addConsoleListener(selected_node)">Add listener for console</li>
- <li ng-if="hasConsoleListener(selected_node)" ng-click="delConsoleListener(selected_node)">Delete listener for console</li>
- <!-- <li ng-repeat="listener in getSectionList(selected_node, 'listener')" ng-click="editSection(selected_node, 'listener', listener)">Edit/Delete listener on port {{listener}} </li> -->
-
- <li class="context-separator"></li>
- <li ng-click="deleteNode(false)">Delete this router</li>
- <li ng-click="showConfig(selected_node)">Show generated config</li>
- </ul>
- </div>
- <div id="multiple_action_menu" class="contextMenu">
- <ul>
- <li ng-click="setRouterHost(true)">Set host for selected routers</li>
-
- <li class="context-separator"></li>
- <li ng-click="editSection(true, 'log', 'new')">Add log section for selected routers</li>
-
- <li class="context-separator"></li>
- <li ng-click="editSection(true, 'address', 'new')">Add address section for selected routers</li>
-
- <li class="context-separator"></li>
- <li ng-click="deleteNode(true)">Delete selected nodes</li>
- </ul>
- </div>
- <div id="client_context_menu" class="contextMenu">
- <ul>
- <li ng-click="deleteNode(false)">Delete</li>
- <li class="context-separator"></li>
- <li ng-click="editThisSection(selected_node)">Edit</li>
- </ul>
- </div>
-</div>
-
-
-<script type="text/ng-template" id="settings-template.html">
- <form novalidate name="editForm" ng-submit="setSettings()">
- <div class="modal-header">
- <h3 class="modal-title">Global settings</h3>
- </div>
- <div class="modal-body">
-
- <fieldset>
- <div ng-repeat="attribute in entity.attributes">
- <label class="form-label" for="{{attribute.name}}">{{attribute.humanName}}</label>
-<!-- we can't do <input type="{angular expression}"> because... jquery throws an exception because...??? -->
- <div ng-if="attribute.input == 'input'">
- <!-- ng-pattern="testPattern(attribute)" -->
- <input ng-if="attribute.type == 'number'" type="number" name="{{attribute.name}}" id="{{attribute.name}}" ng-model="attribute.value" ng-required="attribute.required" class="ui-widget-content ui-corner-all"/>
- <input ng-if="attribute.type == 'text'" type="text" name="{{attribute.name}}" id="{{attribute.name}}" ng-model="attribute.value" ng-required="attribute.required" class="ui-widget-content ui-corner-all"/>
- </div>
- <div ng-if="attribute.input == 'select'">
- <select id="{{attribute.name}}" ng-model="attribute.selected" ng-options="item for item in attribute.rawtype"></select>
- </div>
- <div ng-if="attribute.input == 'boolean'" class="boolean">
- <label><input name="{{attribute.name}}" type="radio" ng-model="attribute.value" ng-value="true"> True</label>
- <label><input name="{{attribute.name}}" type="radio" ng-model="attribute.value" ng-value="false"> False</label>
- </div>
- <div ng-if="attribute.input == 'file'">
- <input type="file" id="FileUpload" custom-on-change="uploadFile" webkitdirectory mozdirectory msdirectory odirectory directory multiple />
- </div>
- </div>
- </fieldset>
-
- </div>
- <div class="modal-footer">
- <button class="btn btn-primary" type="submit" ng-click="setSettings()" ng-disabled="editForm.$invalid" >OK</button>
- <button class="btn btn-warning" type="button" ng-click="cancel()">Cancel</button>
- </div>
- </form>
-</script>
-
-
-<!--
- This is the template for the node add/edit dialog
--->
-<script type="text/ng-template" id="node-config-template.html">
- <form novalidate name="editForm" ng-submit="save()">
- <div class="modal-header">
- <h3 class="modal-title">{{title}}</h3>
- </div>
- <div class="modal-body">
-
- <fieldset>
- <div ng-repeat="attribute in entities[0].attributes">
- <div class="form-input-container" tooltip-append-to-body="true" tooltip-placement="right" uib-tooltip-html="attributeDescription" ng-mouseenter="setDescription(attribute, $event)" tooltip-class="edit-tooltip">
- <label class="form-label" for="{{attribute.name}}">{{attribute.humanName}}</label>
- <div ng-if="attribute.input == 'input'">
- <input class="edit_input" ng-if="attribute.type == 'number'" type="number" name="{{attribute.name}}" id="{{attribute.name}}" ng-model="attribute.value" ng-required="isItRequired(attribute)" ng-disabled="isItDisabled(attribute)" class="ui-widget-content ui-corner-all"/>
- <input class="edit_input" ng-if="attribute.type == 'text'" type="text" name="{{attribute.name}}" id="{{attribute.name}}" ng-model="attribute.value" ng-required="isItRequired(attribute)" ng-disabled="isItDisabled(attribute)" class="ui-widget-content ui-corner-all"/>
- </div>
- <div ng-if="attribute.input == 'select'">
- <select class="edit_input" id="{{attribute.name}}" ng-model="attribute.selected" ng-required="isItRequired(attribute)" ng-disabled="isItDisabled(attribute)" ng-options="item for item in attribute.rawtype"></select>
- </div>
- <div ng-if="attribute.input == 'boolean'" class="boolean">
- <label><input type="radio" ng-model="attribute.value" value="true"> True</label>
- <label><input type="radio" ng-model="attribute.value" value="false"> False</label>
- </div>
- <div ng-if="attribute.input == 'checkbox'" class="boolean">
- <label><input id="attribute.name" type="checkbox" ng-required="isItRequired(attribute)" ng-disabled="isItDisabled(attribute)" ng-model="attribute.value"></label>
- </div>
- </div>
- </div>
- </fieldset>
- </div>
- <div class="modal-footer">
- <button class="btn btn-primary" type="submit" ng-disabled="editForm.$invalid" ng-click="save()">OK</button>
- <button ng-if="showDelete()" class="btn btn-secondary" type="button" ng-click="del()">Delete</button>
- <button class="btn btn-warning" type="button" ng-click="cancel()">Cancel</button>
- </div>
- </form>
-</script>
-
-<script type="text/ng-template" id="show-config-template.html">
- <form novalidate ng-submit="ok()">
- <div class="modal-header">
- <h3 class="modal-title">Current config file if saved</h3>
- </div>
- <div class="modal-body">
- <fieldset>
- <pre class="config-area">{{config}}</pre>
- </fieldset>
- </div>
- <div class="modal-footer">
- <button class="btn btn-primary" type="submit" ng-click="ok()">OK</button>
- </div>
- </form>
-</script>
-
-<script type="text/ng-template" id="new-config-template.html">
-
- <form novalidate name="editForm" ng-submit="setSettings()">
- <div class="modal-header">
- <h3 class="modal-title">Create new topology</h3>
- </div>
- <div class="modal-body">
-
- <label for="newTopo" class="entity-description">Enter a new topology directory name</label>
- <fieldset>
- <input type="text" name="newTopo" id="newTopo" ng-model="newTopology" ng-required="true" class="ui-widget-content ui-corner-all"/>
- </fieldset>
-
- </div>
- <div class="modal-footer">
- <button class="btn btn-primary" type="submit" ng-click="setSettings()">OK</button>
- <button class="btn btn-warning" type="button" ng-click="cancel()">Cancel</button>
- </div>
- </form>
-</script>
-
-<script type="text/ng-template" id="set-router-host.html">
- <form novalidate name="editForm" ng-submit="setSettings()">
- <div class="modal-header">
- <h3 class="modal-title">Set router host</h3>
- </div>
- <div class="modal-body">
- <div class="description">
- Set the host of all listeners on this router. Also ensure that all internal connectors to this router use this host.
- </div>
- <label for="host" class="entity-description">Enter a machine name or IP address</label>
- <fieldset>
- <input type="text" name="host" id="host" ng-model="host" ng-required="true" class="router-host ui-widget-content ui-corner-all"/>
- </fieldset>
-
- </div>
- <div class="modal-footer">
- <button class="btn btn-primary" type="submit" ng-click="setSettings()">OK</button>
- <button class="btn btn-warning" type="button" ng-click="cancel()">Cancel</button>
- </div>
- </form>
-</script>
-
-<script type="text/ng-template" id="deploy-template.html">
- <form novalidate>
- <div class="modal-header">
- <h3 class="modal-title">{{state}}</h3>
- </div>
- <div ng-hide="deploy_state == 'deploying'">
- <div class="modal-body">
- <div ng-repeat="host in hosts">
- <div class="host_color circle node" ng-class="host.color"></div>
- <div class="host_name">{{host.name}}</div>
- <button class="btn btn-basic host_pass" ng-click="show_pass(host)" ng-hide="showing_pass == host.name">Sudo Password</button>
- <div class="host_pass" ng-show="showing_pass == host.name"><input ng-keyup="$event.keyCode == 13 ? show_pass() : null" focus-when="showing_pass == host.name" ng-model="host.pass" type="password" /> <button class="btn btn-basic" ng-click="show_pass()">OK</button></div>
- <ul class="host_nodes">
- <li ng-repeat="node in host.nodes">{{node}}</li>
- </ul>
- </div>
- </div>
- <div class="modal-footer">
- <button class="btn btn-primary" type="button" ng-click="deploy()">Deploy</button>
- <button ng-class="close_button_class" class="btn" type="button" ng-click="cancel()">Cancel</button>
- </div>
- </div>
- <div ng-show="deploy_state == 'deploying'">
- <div class="modal-body">
- <pre id="deploy_output" class="tail">{{status}}</pre>
- <div ng-show="done()" id="message">Deployed.
- <div ng-show="hasConsole()">Browse to <a ng-href="{{address}}" target="_blank">here</a> to manage the router.</div>
- </div>
- </div>
- <div class="modal-footer">
- <button ng-class="close_button_class" class="btn" type="button" ng-click="cancel()">Close</button>
- </div>
- </div>
- </form>
-</script>
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/index.html
----------------------------------------------------------------------
diff --git a/console/config/index.html b/console/config/index.html
deleted file mode 100644
index dab41de..0000000
--- a/console/config/index.html
+++ /dev/null
@@ -1,91 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns:ng="http://angularjs.org">
-
-<head>
-
- <meta charset="utf-8"/>
- <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
- <title>Qpid Dispatch Config Processor</title>
-
- <link rel="shortcut icon" type="image/png" href="favicon-32x32.png" sizes="32x32" />
-
- <link href='node_modules/font-awsome/css/font-awesome.min.css' type="text/css">
- <link href="node_modules/jquery-ui-themes/themes/smoothness/jquery-ui.min.css" rel="stylesheet" type='text/css'>
- <link href="node_modules/patternfly/dist/css/patternfly.min.css" rel="stylesheet" type='text/css'>
- <link href="node_modules/patternfly/dist/css/patternfly-additions.min.css" rel="stylesheet" type='text/css'>
-
- <link rel="stylesheet" href="css/plugin.css" type="text/css"/>
- <link rel="stylesheet" href="css/dispatch.css" type="text/css"/>
- <link rel="stylesheet" href="css/site-base.css" type="text/css"/>
- <link rel="stylesheet" href="css/mock.css" type="text/css"/>
-
-</head>
-
-<body ng-app="QDR">
-
- <nav class="navbar navbar-default navbar-pf" role="navigation">
- <div class="navbar-header">
- <a class="navbar-brand" href="/">
- <span class="logo">Qpid Dispatch config file processor</span>
- </a>
- </div>
- </nav>
-
- <div class="container-fluid">
- <div class="row">
- <div id="main-container">
- <div ng-include src="'html/qdrTopology.html'"></div>
- </div>
- </div>
- </div>
-
-
-<!--[if lt IE 9]>
-<script src="node_modules/html5shiv/dist/html5shiv.min.js"></script>
-<![endif]-->
-
-<script src="node_modules/jquery/dist/jquery.min.js"></script>
-<script src="node_modules/jquery-ui-dist/jquery-ui.min.js"></script>
-
-<!-- Angular -->
-<script src="node_modules/angular/angular.min.js"></script>
-<script src="node_modules/angular-animate/angular-animate.min.js"></script>
-<script src="node_modules/angular-ui-bootstrap/dist/ui-bootstrap.js"></script>
-<script src="node_modules/angular-ui-bootstrap/dist/ui-bootstrap-tpls.js"></script>
-<script src="node_modules/angular-resource/angular-resource.min.js"></script>
-<script src="node_modules/angular-sanitize/angular-sanitize.min.js"></script>
-
-<script src='node_modules/d3/d3.min.js'></script>
-<script src="node_modules/notifyjs-browser/dist/notify.js"></script>
-
-<script type="text/javascript" src="js/dispatchPlugin.js"></script>
-<script type="text/javascript" src="js/qdrService.js"></script>
-<script type="text/javascript" src="js/qdrTopology.js"></script>
-<script type="text/javascript" src="js/qdrNewNode.js"></script>
-
-
-<script type="text/javascript">
- //angular.element(document.getElementsByTagName('head')).append(angular.element('<base href="' + window.location.pathname + '" />'));
-</script>
-
-</body>
-</html>
-
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/js/dispatchPlugin.js
----------------------------------------------------------------------
diff --git a/console/config/js/dispatchPlugin.js b/console/config/js/dispatchPlugin.js
deleted file mode 100644
index 55ddf20..0000000
--- a/console/config/js/dispatchPlugin.js
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-/**
- * @module QDR
- * @main QDR
- *
- * The main entry point for the QDR module
- *
- */
-var QDR = (function(QDR) {
-
- /**
- * @property pluginName
- * @type {string}
- *
- * The name of this plugin
- */
- QDR.pluginName = "QDR";
- QDR.pluginRoot = "";
-
- /**
- * @property log
- * @type {Logging.Logger}
- *
- * This plugin's logger instance
- */
- //HIO QDR.log = Logger.get(QDR.pluginName);
- /**
- * @property templatePath
- * @type {string}
- *
- * The top level path to this plugin's partials
- */
- QDR.srcBase = "";
- QDR.templatePath = QDR.srcBase + "html/";
- QDR.cssPath = QDR.srcBase + "css/";
- /**
- * @property SETTINGS_KEY
- * @type {string}
- *
- * The key used to fetch our settings from local storage
- */
- QDR.SETTINGS_KEY = 'QDRSettings';
- QDR.LAST_LOCATION = "QDRLastLocation";
-
- /**
- * @property module
- * @type {object}
- *
- * This plugin's angularjs module instance
- */
- QDR.module = angular.module(QDR.pluginName, ['ngAnimate', 'ngResource', 'ngSanitize', 'ui.bootstrap']);
-
- Core = {
- notification: function (severity, msg) {
- $.notify(msg, severity)
- }
- }
-
- QDR.module.config(function ($compileProvider) {
- $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|chrome-extension|file|blob):/);
- $compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|mailto|chrome-extension):/);
- })
-
- QDR.module.filter('to_trusted', ['$sce', function($sce){
- return function(text) {
- return $sce.trustAsHtml(text);
- };
- }]);
-
- QDR.module.filter('humanify', function (QDRService) {
- return function (input) {
- return QDRService.humanify(input);
- };
- });
-
- QDR.module.filter('Pascalcase', function () {
- return function (str) {
- if (!str)
- return "";
- return str.replace(/(\w)(\w*)/g,
- function(g0,g1,g2){return g1.toUpperCase() + g2.toLowerCase();});
- }
- })
-
- QDR.module.filter('safePlural', function () {
- return function (str) {
- var es = ['x', 'ch', 'ss', 'sh']
- for (var i=0; i<es.length; ++i) {
- if (str.endsWith(es[i]))
- return str + 'es'
- }
- if (str.endsWith('y'))
- return str.substr(0, str.length-2) + 'ies'
- if (str.endsWith('s'))
- return str;
- return str + 's'
- }
- })
-
- QDR.logger = function ($log) {
- var log = $log;
-
- this.debug = function (msg) { msg = "QDR: " + msg; log.debug(msg)};
- this.error = function (msg) {msg = "QDR: " + msg; log.error(msg)}
- this.info = function (msg) {msg = "QDR: " + msg; log.info(msg)}
- this.warn = function (msg) {msg = "QDR: " + msg; log.warn(msg)}
-
- return this;
- }
- // one-time initialization happens in the run function
- // of our module
- QDR.module.run( ["$log", "QDRService", function ($log, QDRService) {
- QDR.log = new QDR.logger($log);
- QDR.log.info("*************creating config editor************");
- QDRService.getSchema(function () {
- QDR.log.debug("got schema")
- })
- }]);
-
- QDR.module.config(['$qProvider', function ($qProvider) {
- $qProvider.errorOnUnhandledRejections(false);
- }]);
-
- return QDR;
-}(QDR || {}));
-
-var Folder = (function () {
- function Folder(title) {
- this.title = title;
- this.children = [];
- this.folder = true;
- }
- return Folder;
-})();
-var Leaf = (function () {
- function Leaf(title) {
- this.title = title;
- }
- return Leaf;
-})();
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/js/qdrNewNode.js
----------------------------------------------------------------------
diff --git a/console/config/js/qdrNewNode.js b/console/config/js/qdrNewNode.js
deleted file mode 100644
index d152388..0000000
--- a/console/config/js/qdrNewNode.js
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-/**
- * @module QDR
- */
-var QDR = (function(QDR) {
-
- QDR.module.controller("QDR.NodeDialogController", function($scope, $sce, $uibModalInstance, QDRService, node, entityType, context, entityKey, maxPort, hasLinks) {
- var newname = node.name
- $scope.context = context
- if (!angular.isDefined(context))
- $scope.context = 'new'
- var newContext = {"new":maxPort+1, "artemis":61616, "qpid":5672, 'log':'', 'sslProfile':''}
- $scope.title = ((context && context in newContext) ? "Add " : "Edit ") + entityType + " section"
- if (context === 'artemis')
- $scope.title += " to an Artemis broker"
- if (context === 'qpid')
- $scope.title += " to a Qpid broker"
- var schema = QDRService.schema;
- var myEntities = []
- myEntities.push(entityType)
- var readOnlyAttrs = { 'router': ['version', 'id', 'identity'],
- 'log': ['name', 'identity'],
- 'address': ['identity'],
- 'linkRoute': ['identity'],
- "sslProfile": ['identity'],
- "connector": ['identity']}
- // one of the following must be present
- var requiredAttrs = {'address': ['prefix', 'pattern']}
-
- var typeMap = {
- integer: 'number',
- string: 'text',
- path: 'text',
- boolean: 'boolean'
- };
- var separatedEntities = []; // additional entities required if a link is reversed
- var myPort = 0,
- myAddr = '0.0.0.0'; // port and address for new router
- $scope.entities = [];
-
- var getEdivAttr = function (ediv, key) {
- for (var i=0; i<ediv.attributes.length; i++) {
- if (ediv.attributes[i].name === key)
- return ediv.attributes[i]
- }
- }
-
- // construct an object that contains all the info needed for a single tab's fields
- var entity = function(actualName, tabName, humanName, ent, icon, link) {
- var index = 0;
- var info = {
- actualName: actualName,
- tabName: tabName,
- humanName: humanName,
- description: ent.description,
- icon: angular.isDefined(icon) ? icon : '',
- references: ent.references,
- link: link,
-
- attributes: $.map(ent.attributes, function(value, key) {
- // skip read-only fields
- if (readOnlyAttrs[tabName] && readOnlyAttrs[tabName].indexOf(key) >= 0)
- return null;
- // skip deprecated and statistics fields
- if (key == value.description.startsWith('Deprecated') || value.graph)
- return null;
- var val = value['default'];
- index++;
- return {
- name: key,
- humanName: QDRService.humanify(key),
- description: value.description,
- type: typeMap[value.type],
- rawtype: value.type,
- input: typeof value.type == 'string' ? value.type == 'boolean' ? 'boolean' : 'input' : 'select',
- selected: val ? val : undefined,
- 'default': value['default'],
- value: val,
- required: (value.required || key === entityKey || key === 'host')? true : false,
- unique: value.unique
- };
- })
- }
- return info;
- }
-
- // remove the annotation fields
- var stripAnnotations = function(entityName, ent, annotations) {
- if (ent.references) {
- var newEnt = {
- attributes: {}
- };
- ent.references.forEach(function(annoKey) {
- if (!annotations[annoKey])
- annotations[annoKey] = {};
- annotations[annoKey][entityName] = true; // create the key/consolidate duplicates
- var keys = Object.keys(schema.annotations[annoKey].attributes);
- for (var attrib in ent.attributes) {
- if (keys.indexOf(attrib) == -1) {
- newEnt.attributes[attrib] = ent.attributes[attrib];
- }
- }
- // add a field for the reference name
- newEnt.attributes[annoKey] = {
- type: 'string',
- description: 'Name of the ' + annoKey + ' section.',
- 'default': annoKey,
- required: true
- };
- })
- newEnt.references = ent.references;
- newEnt.description = ent.description;
- return newEnt;
- }
- return ent;
- }
-
- var annotations = {};
- myEntities.forEach(function(entityName) {
- var ent = schema.entityTypes[entityName];
- var hName = QDRService.humanify(entityName);
- if (entityName == 'listener')
- hName = "Listener for clients";
- var noAnnotations = stripAnnotations(entityName, ent, annotations);
- var ediv = entity(entityName, entityName, hName, noAnnotations, undefined);
-
- if (node[entityName+'s'] && context in node[entityName+'s']) {
- // fill form with existing data
- var o = node[entityName+'s'][context]
- ediv.attributes.forEach( function (attr) {
- if (attr['name'] in o) {
- attr['value'] = o[attr['name']]
- if (attr['type'] === 'number') {
- try {
- attr['value'] = parseInt(attr['value'])
- }
- catch (e) {
- attr['value'] = 0
- }
- }
-
- // if the form has a select dropdown, set the selected to the current value
- if (Array.isArray(attr['rawtype']))
- attr.selected = attr['value']
- }
- })
- }
-
- if (ediv.actualName == 'router') {
- ediv.attributes.forEach( function (attr) {
- if (attr['name'] in node) {
- attr['value'] = node[attr['name']]
- }
- })
- // if we have any new links (connectors), then the router's mode should be interior
- var roleAttr = getEdivAttr(ediv, 'mode')
- if (hasLinks && roleAttr) {
- roleAttr.value = roleAttr.selected = "interior";
- } else {
- roleAttr.value = roleAttr.selected = "standalone";
- }
- }
- if (ediv.actualName == 'listener' && context === 'new') {
- // find max port number that is used in all the listeners
- var port = getEdivAttr(ediv, 'port')
- if (port)
- port.value = ++maxPort
- var host = getEdivAttr(ediv, 'host')
- if (host && node.host)
- host.value = node.host
- }
- if (ediv.actualName == 'connector' && context in newContext) {
- // find max port number that is used in all the listeners
- var port = getEdivAttr(ediv, 'port')
- if (port) {
- port.value = newContext[context]
- }
- if (context === 'artemis' || context === 'qpid') {
- var role = getEdivAttr(ediv, 'role')
- if (role) {
- role.value = role.selected = 'route-container'
- }
- }
- context = 'new'
- }
- // special case for required log.module since it doesn't have a default
- if (ediv.actualName == 'log') {
- // initialize module to 'DEFAULT'
- var moduleAttr = getEdivAttr(ediv, 'module')
- if (moduleAttr)
- moduleAttr.value = moduleAttr.selected = "DEFAULT"
- // adding a new log section and we already have a section. select 1st unused module
- if (context === 'new' && node.logs) {
- var modules = ent.attributes.module.type
- var availableModules = modules.filter( function (module) {
- return !(module in node.logs)
- })
- if (availableModules.length > 0) {
- moduleAttr.value = moduleAttr.selected = availableModules[0]
- }
- } else if (node.logs && context in node.logs) {
- // fill form with existing data
- var log = node.logs[context]
- ediv.attributes.forEach( function (attr) {
- if (attr['name'] in log) {
- attr['value'] = log[attr['name']]
- if (attr['name'] == 'module')
- attr.selected = attr['value']
- }
- })
- }
- }
- // sort ediv.attributes on name
- var allNames = ediv.attributes.map( function (attr) {
- return attr['name']
- })
- allNames.sort()
-
- // move all required entities to the top
- for (var i=0; i<ediv.attributes.length; i++) {
- var attr = ediv.attributes[i]
- if (attr.required) {
- allNames.move(allNames.indexOf(attr.name), 0)
- }
- }
-
- // move entities key into first position
- for (var i=0, keys=entityKey.split('|'); i<keys.length; i++) {
- var keyIndex = allNames.findIndex(function (name) {
- return name === keys[i]
- })
- if (keyIndex > 0)
- allNames.move(keyIndex, 0)
- }
- // move any entities with sort: last to end
- for (var i=0; i<ediv.attributes.length; i++) {
- var attr = ediv.attributes[i]
- if (attr.sort && attr.sort === 'last') {
- allNames.move(allNames.indexOf(attr.name), allNames.length-1)
- }
- }
-
- // now order the entity attributes by allNames
- ediv.attributes.sort(function(attr1, attr2){
- return allNames.indexOf(attr1['name']) - allNames.indexOf(attr2['name'])
- });
- $scope.entities.push(ediv);
- })
-
- $scope.testPattern = function(attr) {
- if (attr.rawtype == 'path')
- return /^(\/)?([^/\0]+(\/)?)+$/;
- return /(.*?)/;
- }
-
- $scope.attributeDescription = '';
- $scope.attributeType = '';
- $scope.attributeRequired = '';
- $scope.attributeUnique = '';
- $scope.active = 'router'
-
- $scope.isItDisabled = function (attribute) {
- if (requiredAttrs[entityType] && requiredAttrs[entityType].indexOf(attribute.name) > -1) {
- return requiredAttrs[entityType].some( function (attr) {
- return (attr !== attribute.name) && (getEdivAttr($scope.entities[0], attr).value)
- })
- } else
- return false
- }
-
- $scope.isItRequired = function (attribute) {
- if (requiredAttrs[entityType] && requiredAttrs[entityType].indexOf(attribute.name) > -1) {
- var s = requiredAttrs[entityType].some( function (attr) {
- return (getEdivAttr($scope.entities[0], attr).value)
- })
- return !s
- } else
- return attribute.required
- }
- $scope.setActive = function(tabName) {
- $scope.active = tabName
- }
- $scope.isActive = function(tabName) {
- return $scope.active === tabName
- }
- $scope.setDescription = function(attr, e) {
- $scope.attributeDescription = $sce.trustAsHtml(attr.description +
- '<div class="attr-type">Type: ' + JSON.stringify(attr.rawtype, null, 1) + '</div>' +
- '<div class="attr-required">' + (attr.required ? "required" : '') + '</div>' +
- '<div class="attr-unique">' + (attr.unique ? "Must be unique" : '') + '</div>')
- }
- // handle the save button click
- // copy the dialog's values to the original node
- $scope.save = function() {
- $uibModalInstance.close({
- entities: $scope.entities,
- });
- }
- $scope.cancel = function() {
- $uibModalInstance.close()
- };
- $scope.del = function() {
- $uibModalInstance.close({del: true})
- }
- $scope.showDelete = function () {
- return !(context === 'new' || !context)
- }
-
- });
-
- return QDR;
-}(QDR || {}));
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/js/qdrService.js
----------------------------------------------------------------------
diff --git a/console/config/js/qdrService.js b/console/config/js/qdrService.js
deleted file mode 100644
index fc8f9eb..0000000
--- a/console/config/js/qdrService.js
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-*/
-/**
- * @module QDR
- */
-var QDR = (function(QDR) {
-
- // The QDR service handles the connection to
- // the server in the background
- QDR.module.factory("QDRService", ['$rootScope', '$http', '$timeout', '$resource', '$location', function($rootScope, $http, $timeout, $resource, $location) {
- var self = {
-
- connectActions: [],
- schema: undefined,
-
- addConnectAction: function(action) {
- if (angular.isFunction(action)) {
- self.connectActions.push(action);
- }
- },
- executeConnectActions: function() {
- self.connectActions.forEach(function(action) {
- try {
- action.apply();
- } catch (e) {
- // in case the page that registered the handler has been unloaded
- QDR.log.info(e.message)
- }
- });
- self.connectActions = [];
- },
- nameFromId: function(id) {
- return id.split('/')[3];
- },
-
- humanify: function(s) {
- if (!s || s.length === 0)
- return s;
- var t = s.charAt(0).toUpperCase() + s.substr(1).replace(/[A-Z]/g, ' $&');
- return t.replace(".", " ");
- },
- pretty: function(v) {
- var formatComma = d3.format(",");
- if (!isNaN(parseFloat(v)) && isFinite(v))
- return formatComma(v);
- return v;
- },
-
- // given an attribute name array, find the value at the same index in the values array
- valFor: function(aAr, vAr, key) {
- var idx = aAr.indexOf(key);
- if ((idx > -1) && (idx < vAr.length)) {
- return vAr[idx];
- }
- return null;
- },
-
- isArtemis: function(d) {
- return d.nodeType === 'route-container' && d.properties.product === 'apache-activemq-artemis';
- },
-
- isQpid: function(d) {
- return d.nodeType === 'route-container' && (d.properties && d.properties.product === 'qpid-cpp');
- },
-
- isAConsole: function(properties, connectionId, nodeType, key) {
- return self.isConsole({
- properties: properties,
- connectionId: connectionId,
- nodeType: nodeType,
- key: key
- })
- },
- isConsole: function(d) {
- // use connection properties if available
- return (d && d['properties'] && d['properties']['console_identifier'] === 'Dispatch console')
- },
-
- flatten: function(attributes, result) {
- var flat = {}
- attributes.forEach(function(attr, i) {
- if (result && result.length > i)
- flat[attr] = result[i]
- })
- return flat;
- },
- getSchema: function(callback) {
- self.sendMethod("GET-SCHEMA", {}, function (response) {
- for (var entityName in response.entityTypes) {
- var entity = response.entityTypes[entityName]
- if (entity.deprecated) {
- delete response.entityTypes[entityName]
- } else {
- for (var attributeName in entity.attributes) {
- var attribute = entity.attributes[attributeName]
- if (attribute.deprecated) {
- delete response.entityTypes[entityName].attributes[attributeName]
- }
- }
- }
- }
- self.schema = response
- callback()
- })
- },
-
- sendMethod: function(operation, props, callback) {
- setTimeout(function () {
- props['operation'] = operation
- $.post( "http://localhost:8000", JSON.stringify(props), function (response, status) {
- callback(response)
- }, "json" )
- }, 1)
- }
-
- }
- return self;
- }]);
-
- return QDR;
-
-}(QDR || {}));
-
-(function() {
- console.dump = function(o) {
- if (window.JSON && window.JSON.stringify)
- QDR.log.info(JSON.stringify(o, undefined, 2));
- else
- console.log(o);
- };
-})();
-
-if (!String.prototype.startsWith) {
- String.prototype.startsWith = function (searchString, position) {
- return this.substr(position || 0, searchString.length) === searchString
- }
-}
-
-if (!String.prototype.endsWith) {
- String.prototype.endsWith = function(searchString, position) {
- var subjectString = this.toString();
- if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) {
- position = subjectString.length;
- }
- position -= searchString.length;
- var lastIndex = subjectString.lastIndexOf(searchString, position);
- return lastIndex !== -1 && lastIndex === position;
- };
-}
-
-if (typeof Object.assign != 'function') {
- // Must be writable: true, enumerable: false, configurable: true
- Object.defineProperty(Object, "assign", {
- value: function assign(target, varArgs) { // .length of function is 2
- 'use strict';
- if (target == null) { // TypeError if undefined or null
- throw new TypeError('Cannot convert undefined or null to object');
- }
-
- var to = Object(target);
-
- for (var index = 1; index < arguments.length; index++) {
- var nextSource = arguments[index];
-
- if (nextSource != null) { // Skip over if undefined or null
- for (var nextKey in nextSource) {
- // Avoid bugs when hasOwnProperty is shadowed
- if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
- to[nextKey] = nextSource[nextKey];
- }
- }
- }
- }
- return to;
- },
- writable: true,
- configurable: true
- });
-}
-
-if (!String.prototype.repeat) {
- String.prototype.repeat = function(count) {
- 'use strict';
- if (this == null) {
- throw new TypeError('can\'t convert ' + this + ' to object');
- }
- var str = '' + this;
- count = +count;
- if (count != count) {
- count = 0;
- }
- if (count < 0) {
- throw new RangeError('repeat count must be non-negative');
- }
- if (count == Infinity) {
- throw new RangeError('repeat count must be less than infinity');
- }
- count = Math.floor(count);
- if (str.length == 0 || count == 0) {
- return '';
- }
- // Ensuring count is a 31-bit integer allows us to heavily optimize the
- // main part. But anyway, most current (August 2014) browsers can't handle
- // strings 1 << 28 chars or longer, so:
- if (str.length * count >= 1 << 28) {
- throw new RangeError('repeat count must not overflow maximum string size');
- }
- var rpt = '';
- for (var i = 0; i < count; i++) {
- rpt += str;
- }
- return rpt;
- }
-}
-
-if (!Array.prototype.move) {
- Array.prototype.move = function(from, to) {
- this.splice(to, 0, this.splice(from, 1)[0]);
- };
-}
-
-// https://tc39.github.io/ecma262/#sec-array.prototype.findIndex
-if (!Array.prototype.findIndex) {
- Object.defineProperty(Array.prototype, 'findIndex', {
- value: function(predicate) {
- // 1. Let O be ? ToObject(this value).
- if (this == null) {
- throw new TypeError('"this" is null or not defined');
- }
-
- var o = Object(this);
-
- // 2. Let len be ? ToLength(? Get(O, "length")).
- var len = o.length >>> 0;
-
- // 3. If IsCallable(predicate) is false, throw a TypeError exception.
- if (typeof predicate !== 'function') {
- throw new TypeError('predicate must be a function');
- }
-
- // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
- var thisArg = arguments[1];
-
- // 5. Let k be 0.
- var k = 0;
-
- // 6. Repeat, while k < len
- while (k < len) {
- // a. Let Pk be ! ToString(k).
- // b. Let kValue be ? Get(O, Pk).
- // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
- // d. If testResult is true, return k.
- var kValue = o[k];
- if (predicate.call(thisArg, kValue, k, o)) {
- return k;
- }
- // e. Increase k by 1.
- k++;
- }
-
- // 7. Return -1.
- return -1;
- }
- });
-}
-
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[5/5] qpid-dispatch git commit: DISPATCH-1001 Removing developer tool
Posted by ea...@apache.org.
DISPATCH-1001 Removing developer tool
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/4f42d5b3
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/4f42d5b3
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/4f42d5b3
Branch: refs/heads/master
Commit: 4f42d5b34fb945fdc9494014c3f5898d392e5f51
Parents: 5d5db89
Author: Ernest Allen <ea...@redhat.com>
Authored: Wed May 23 14:29:38 2018 -0400
Committer: Ernest Allen <ea...@redhat.com>
Committed: Wed May 23 14:29:38 2018 -0400
----------------------------------------------------------------------
console/config/README | 28 -
console/config/config.py | 456 --
console/config/css/brokers.ttf | Bin 2272 -> 0 bytes
console/config/css/dispatch.css | 738 ---
console/config/css/mock.css | 165 -
console/config/css/plugin.css | 986 ----
console/config/css/site-base.css | 4706 ------------------
console/config/deploy | 38 -
.../config/deployments/install_dispatch.yaml | 78 -
console/config/deployments/run_dispatch.yaml | 37 -
console/config/favicon-32x32.png | Bin 1055 -> 0 bytes
console/config/html/qdrTopology.html | 279 --
console/config/index.html | 91 -
console/config/js/dispatchPlugin.js | 157 -
console/config/js/qdrNewNode.js | 329 --
console/config/js/qdrService.js | 282 --
console/config/js/qdrTopology.js | 2034 --------
console/config/mock/__init__.py | 23 -
console/config/mock/schema.py | 54 -
console/config/mock/section.py | 111 -
console/config/package.json | 37 -
console/config/schema.json | 1814 -------
console/config/topologies/config-2/A.conf | 40 -
console/config/topologies/config-2/B.conf | 31 -
24 files changed, 12514 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/README
----------------------------------------------------------------------
diff --git a/console/config/README b/console/config/README
deleted file mode 100644
index bf495e8..0000000
--- a/console/config/README
+++ /dev/null
@@ -1,28 +0,0 @@
-Qpid Dispatch config file read/update/write utility
-=============
-
-A utility to read, update, write, and deploy dispatch router config files.
-
-Dependencies
-============
-
-- tested using python 2.7
-- npm to install the 3rd party javascript libraries
- http://blog.npmjs.org/post/85484771375/how-to-install-npm
-
-- ansible if you wish to deploy the routers
-http://docs.ansible.com/ansible/latest/intro_installation.html
-
-Running
-====================
-
-Install the 3rd party javascript libraries:
-- in the console/config/ directory run
- npm install
-This will create a node_modules/ directory and install the needed files
-
-- run ./config.py
-- in the address bar of a browser, enter localhost:8000
-
-
-
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/config.py
----------------------------------------------------------------------
diff --git a/console/config/config.py b/console/config/config.py
deleted file mode 100755
index f83057e..0000000
--- a/console/config/config.py
+++ /dev/null
@@ -1,456 +0,0 @@
-#!/usr/bin/env python
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-import argparse
-from pprint import pprint
-import os, sys, inspect
-import string
-import random
-from glob import glob
-from mock import *
-import SimpleHTTPServer
-import SocketServer
-import json
-import cStringIO
-import yaml
-import threading
-import subprocess
-from distutils.spawn import find_executable
-
-get_class = lambda x: globals()[x]
-sectionKeys = {"log": "module", "sslProfile": "name", "connector": "port", "listener": "port", "address": "prefix|pattern"}
-
-# modified from qpid-dispatch/python/qpid_dispatch_internal/management/config.py
-def _parse(lines):
- """Parse config file format into a section list"""
- begin = re.compile(r'([\w-]+)[ \t]*{') # WORD {
- end = re.compile(r'}') # }
- attr = re.compile(r'([\w-]+)[ \t]*:[ \t]*(.+)') # WORD1: VALUE
- pattern = re.compile(r'([\w-]+)[ \t]*:[ \t]*([\S]+).*')
-
- def sub(line):
- """Do substitutions to make line json-friendly"""
- line = line.strip()
- if line.startswith("#"):
- if line.startswith("#deploy_host:"):
- line = line[1:]
- else:
- return ""
- # 'pattern:' is a special snowflake. It allows '#' characters in
- # its value, so they cannot be treated as comment delimiters
- if line.split(':')[0].strip().lower() == "pattern":
- line = re.sub(pattern, r'"\1": "\2",', line)
- else:
- line = line.split('#')[0].strip()
- line = re.sub(begin, r'["\1", {', line)
- line = re.sub(end, r'}],', line)
- line = re.sub(attr, r'"\1": "\2",', line)
- return line
-
- js_text = "[%s]"%("\n".join([sub(l) for l in lines]))
- spare_comma = re.compile(r',\s*([]}])') # Strip spare commas
- js_text = re.sub(spare_comma, r'\1', js_text)
- # Convert dictionary keys to camelCase
- sections = json.loads(js_text)
- #Config.transform_sections(sections)
- return sections
-
-class DirectoryConfigs(object):
- def __init__(self, path='./'):
- self.path = path
- self.configs = {}
-
- files = glob(path + '*.conf')
- for file in files:
- with open(file) as f:
- self.configs[file] = _parse(f)
-
- def asSection(self, s):
- cname = s[0][0].upper() + s[0][1:] + "Section"
- try:
- c = get_class(cname)
- return c(**s[1])
- except KeyError, e:
- return None
-
-class Manager(object):
- def __init__(self, topology, verbose):
- self.topology = topology
- self.verbose = verbose
- self.topo_base = "topologies/"
- self.deploy_base = "deployments/"
- self.deploy_file = self.deploy_base + "deploy.txt"
- self.state = None
-
- def operation(self, op, request):
- m = op.replace("-", "_")
- try:
- method = getattr(self, m)
- except AttributeError:
- print op + " is not implemented yet"
- return None
- if self.verbose:
- print "Got request " + op
- return method(request)
-
- def ANSIBLE_INSTALLED(self, request):
- if self.verbose:
- print "Ansible is", "installed" if find_executable("ansible") else "not installed"
- return "installed" if find_executable("ansible") else ""
-
- # if the node has listeners, and one of them has an http:'true'
- def has_console(self, node):
- #n = False
- #return node.get('listeners') and any([n or h.get('http') for l, h in node.get('listeners').iteritems()])
-
- listeners = node.get('listeners')
- if listeners:
- for k, listener in listeners.iteritems():
- if listener.get('http'):
- return True
-
- return False
-
- def DEPLOY(self, request):
- nodes = request["nodes"]
- topology = request["topology"]
- inventory_file = self.deploy_base + "inventory.yml"
- ansible_become_pass = "ansible_become_pass"
-
- self.PUBLISH(request, deploy=True)
-
- inventory = {'deploy_routers':
- {'vars': {'topology': topology},
- 'hosts': {}
- }
- }
- hosts = inventory['deploy_routers']['hosts']
-
- for node in nodes:
- if node['cls'] == 'router':
- host = node['host']
- if not host in hosts:
- hosts[host] = {'nodes': [], 'create_console': False}
- # if any of the nodes for this host has a console, set create_console for this host to true
- hosts[host]['create_console'] = (hosts[host]['create_console'] or self.has_console(node))
- hosts[host]['nodes'].append(node['name'])
- # pass in the password for eash host if provided
- if request.get(ansible_become_pass + "_" + host):
- hosts[host][ansible_become_pass] = request.get(ansible_become_pass + "_" + host)
- # local hosts need to be marked as such
- if host in ('0.0.0.0', 'localhost', '127.0.0.1'):
- hosts[host]['ansible_connection'] = 'local'
-
- with open(inventory_file, 'w') as n:
- yaml.safe_dump(inventory, n, default_flow_style=False)
-
- # start ansible-playbook in separate thread so we don't have to wait and can still get a callback when done
- def popenCallback(callback, args):
- def popen(callback, args):
- # send all output to deploy.txt so we can send it to the console in DEPLOY_STATUS
- with open(self.deploy_file, 'w') as fout:
- proc = subprocess.Popen(args, stdout=fout, stderr=fout)
- proc.wait()
- callback(proc.returncode)
- return
- thread = threading.Thread(target=popen, args=(callback, args))
- thread.start()
-
- def ansible_done(returncode):
- os.remove(inventory_file)
- if self.verbose:
- print "-------------- DEPLOYMENT DONE with return code", returncode, "------------"
- if returncode:
- self.state = returncode
- else:
- self.state = "DONE"
-
- self.state = "DEPLOYING"
- popenCallback(ansible_done, ['ansible-playbook', self.deploy_base + 'install_dispatch.yaml', '-i', inventory_file])
-
- return "deployment started"
-
- def DEPLOY_STATUS(self, request):
- with open(self.deploy_file, 'r') as fin:
- content = fin.readlines()
-
- # remove leading blank line
- if len(content) > 1 and content[0] == '\n':
- content.pop(0)
-
- return [''.join(content), self.state]
-
- def GET_LOG(self, request):
- return []
-
- def GET_SCHEMA(self, request):
- with open("schema.json") as fp:
- data = json.load(fp)
- return data
-
- def LOAD(self, request):
- topology = request["topology"]
- nodes = []
- links = []
-
- dc = DirectoryConfigs('./' + self.topo_base + topology + '/')
- configs = dc.configs
-
- port_map = []
- for index, file in enumerate(configs):
- port_map.append({'connectors': [], 'listeners': []})
- node = {}
- for sect in configs[file]:
- # remove notes to self
- host = sect[1].pop('deploy_host', None)
- section = dc.asSection(sect)
- if section:
- if section.type == "router":
- node["index"] = index
- node["nodeType"] = unicode("inter-router")
- node["name"] = section.entries["id"]
- node["key"] = "amqp:/_topo/0/" + node["name"] + "/$management"
- if host:
- node['host'] = host
- nodes.append(node)
-
- elif section.type in sectionKeys:
- role = section.entries.get('role')
- if role == 'inter-router':
- # we are processing an inter-router listener or connector: so create a link
- port = section.entries.get('port', 'amqp')
- if section.type == 'listener':
- port_map[index]['listeners'].append(port)
- else:
- port_map[index]['connectors'].append(port)
- else:
- if section.type+'s' not in node:
- node[section.type+'s'] = {}
- key = sectionKeys[section.type]
- if '|' in key:
- # assumes at least one of the keys will have a value
- val = [section.entries.get(x) for x in key.split('|') if section.entries.get(x)][0]
- else:
- val = section.entries.get(key)
- node[section.type+'s'][val] = section.entries
-
- for source, ports_for_this_routers in enumerate(port_map):
- for listener_port in ports_for_this_routers['listeners']:
- for target, ports_for_other_routers in enumerate(port_map):
- if listener_port in ports_for_other_routers['connectors']:
- links.append({'source': source, 'target': target, 'dir': unicode("in")})
-
- return {"nodes": nodes, "links": links, "topology": topology}
-
- def GET_TOPOLOGY(self, request):
- if self.verbose:
- pprint (self.topology)
- return unicode(self.topology)
-
- def GET_TOPOLOGY_LIST(self, request):
- return [unicode(f) for f in os.listdir(self.topo_base) if os.path.isdir(self.topo_base + f)]
-
- def SWITCH(self, request):
- self.topology = request["topology"]
- tdir = './' + self.topo_base + self.topology + '/'
- if not os.path.exists(tdir):
- os.makedirs(tdir)
- return self.LOAD(request)
-
- def SHOW_CONFIG(self, request):
- nodeIndex = request['nodeIndex']
- return self.PUBLISH(request, nodeIndex)
-
- def _connect_(self, links, nodes, default_host, listen_port):
- for link in links:
- s = nodes[link['source']]
- t = nodes[link['target']]
- # keep track of names so we can print them above the sections
- if 'listen_from' not in s:
- s['listen_from'] = []
- if 'conn_to' not in t:
- t['conn_to'] = []
- if 'conns' not in t:
- t['conns'] = []
-
- # make sure source node has a listener
- lport = listen_port
- lhost = s.get('host', default_host)
- s['listen_from'].append(t['name'])
- if 'listener' not in s:
- s['listener'] = listen_port
- listen_port += 1
- else:
- lport = s['listener']
-
- t['conns'].append({"port": lport, "host": lhost})
- t['conn_to'].append(s['name'])
-
- def PUBLISH(self, request, nodeIndex=None, deploy=False):
- nodes = request["nodes"]
- links = request["links"]
- topology = request["topology"]
- settings = request["settings"]
- http_port = settings.get('http_port', 5675)
- listen_port = settings.get('internal_port', 2000)
- default_host = settings.get('default_host', '0.0.0.0')
-
- if nodeIndex and nodeIndex >= len(nodes):
- return "Node index out of range"
-
- if self.verbose:
- if nodeIndex is not None:
- print("Creating config for " + topology + " node " + nodes[nodeIndex]['name'])
- elif deploy:
- print("DEPLOYing to " + topology)
- else:
- print("PUBLISHing to " + topology)
-
- if nodeIndex is None:
- # remove all .conf files from the output dir. they will be recreated below possibly under new names
- for f in glob(self.topo_base + topology + "/*.conf"):
- if self.verbose:
- print "Removing", f
- os.remove(f)
-
- # establish connections and listeners for each node based on links
- self._connect_(links, nodes, default_host, listen_port)
-
- # now process all the routers
- for node in nodes:
- if node['nodeType'] == 'inter-router':
- if self.verbose:
- print "------------- processing node", node["name"], "---------------"
-
- nname = node["name"]
- if nodeIndex is not None:
- config_fp = cStringIO.StringIO()
- else:
- config_fp = open(self.topo_base + topology + "/" + nname + ".conf", "w+")
-
- # add a router section in the config file
- r = RouterSection(**node)
- if not node.get('conns') and not node.get('listener'):
- r.setEntry('mode', 'standalone')
- else:
- r.setEntry('mode', 'interior')
- r.setEntry('id', node['name'])
- if nodeIndex is None:
- r.setEntry('deploy_host', node.get('host', ''))
- config_fp.write(str(r) + "\n")
-
- # write other sections
- for sectionKey in sectionKeys:
- if sectionKey+'s' in node:
- if self.verbose:
- print "found", sectionKey+'s'
- for k in node[sectionKey+'s']:
- if self.verbose:
- print "processing", k
- o = node[sectionKey+'s'][k]
- cname = sectionKey[0].upper() + sectionKey[1:] + "Section"
- if self.verbose:
- print "class name is", cname
- c = get_class(cname)
- if sectionKey == "listener" and o['port'] != 'amqp' and int(o['port']) == http_port:
- config_fp.write("\n# Listener for a console\n")
- if deploy:
- o['httpRoot'] = '/usr/local/share/qpid-dispatch/stand-alone'
- if node.get('host') == o.get('host'):
- o['host'] = '0.0.0.0'
- if self.verbose:
- print "attributes", o, "is written as", str(c(**o))
- config_fp.write(str(c(**o)) + "\n")
-
- if 'listener' in node:
- # always listen on localhost
- lhost = "0.0.0.0"
- listenerSection = ListenerSection(node['listener'], **{'host': lhost, 'role': 'inter-router'})
- if 'listen_from' in node and len(node['listen_from']) > 0:
- config_fp.write("\n# listener for connectors from " + ', '.join(node['listen_from']) + "\n")
- config_fp.write(str(listenerSection) + "\n")
-
- if 'conns' in node:
- for idx, conns in enumerate(node['conns']):
- conn_port = conns['port']
- conn_host = conns['host']
- if node.get('host') == conn_host:
- conn_host = "0.0.0.0"
- connectorSection = ConnectorSection(conn_port, **{'host': conn_host, 'role': 'inter-router'})
- if 'conn_to' in node and len(node['conn_to']) > idx:
- config_fp.write("\n# connect to " + node['conn_to'][idx] + "\n")
- config_fp.write(str(connectorSection) + "\n")
-
- # return requested config file as string
- if node.get('index', -1) == nodeIndex:
- val = config_fp.getvalue()
- config_fp.close()
- return val
-
- config_fp.close()
-
- return "published"
-
-class HttpHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
- # use GET requests to serve the web pages
- def do_GET(self):
- SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self);
-
- # use PORT requests to send commands
- def do_POST(self):
- content_len = int(self.headers.getheader('content-length', 0))
- if content_len > 0:
- body = self.rfile.read(content_len)
- data = json.loads(body)
- response = self.server.manager.operation(data['operation'], data)
- if response is not None:
- self.send_response(200)
- self.send_header('Content-Type', 'application/json')
- self.end_headers()
-
- self.wfile.write(json.dumps(response));
- self.wfile.close();
- else:
- return SimpleHTTPServer.SimpleHTTPRequestHandler.do_POST(self)
-
- # only log if verbose was requested
- def log_request(self, code='-', size='-'):
- if self.server.verbose:
- self.log_message('"%s" %s %s', self.requestline, str(code), str(size))
-
-class ConfigTCPServer(SocketServer.TCPServer):
- def __init__(self, port, manager, verbose):
- SocketServer.TCPServer.__init__(self, ("", port), HttpHandler)
- self.manager = manager
- self.verbose = verbose
-
-Schema.init()
-parser = argparse.ArgumentParser(description='Read/Write Qpid Dispatch Router config files.')
-parser.add_argument('-p', "--port", type=int, default=8000, help='port to listen for requests from browser')
-parser.add_argument('-v', "--verbose", action='store_true', help='verbose output')
-parser.add_argument("-t", "--topology", default="config-2", help="which topology to load (default: %(default)s)")
-args = parser.parse_args()
-
-try:
- httpd = ConfigTCPServer(args.port, Manager(args.topology, args.verbose), args.verbose)
- print "serving at port", args.port
- httpd.serve_forever()
-except KeyboardInterrupt:
- pass
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/css/brokers.ttf
----------------------------------------------------------------------
diff --git a/console/config/css/brokers.ttf b/console/config/css/brokers.ttf
deleted file mode 100644
index ae83968..0000000
Binary files a/console/config/css/brokers.ttf and /dev/null differ
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/css/dispatch.css
----------------------------------------------------------------------
diff --git a/console/config/css/dispatch.css b/console/config/css/dispatch.css
deleted file mode 100644
index f21eecc..0000000
--- a/console/config/css/dispatch.css
+++ /dev/null
@@ -1,738 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-svg {
- background-color: transparent;
- cursor: default;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- -o-user-select: none;
- user-select: none;
-}
-
-svg:not(.active):not(.ctrl) {
- cursor: crosshair;
-}
-#end-arrow-selected, #start-arrow-selected {
- stroke: #33F;
- fill: #33F;
-}
-path.link.selected {
- stroke-dasharray: 10,2;
- stroke: #33F !important;
-}
-
-path.link {
- fill: #000;
- stroke: #000;
- stroke-width: 4px;
- cursor: default;
-}
-
-svg:not(.active):not(.ctrl) path.link {
- cursor: pointer;
-}
-
-path.link.temp {
- opacity: 0.3;
-}
-path.link.temp.over {
- opacity: 0.8;
- stroke-dasharray: 10,2;
-}
-path.link.small {
- stroke-width: 2.5;
- stroke: darkgray;
-}
-path.link.highlighted {
- stroke: #6F6 !important;
-}
-marker#start-arrow-highlighted,
-marker#end-arrow-highlighted {
- fill: #6F6;
-}
-marker#start-arrow-small,
-marker#end-arrow-small {
- fill: darkgray;
-}
-
-path.link.dragline {
- pointer-events: none;
-}
-
-path.link.hidden {
- stroke-width: 0;
-}
-
-circle.node {
- stroke-width: 1.5px;
- cursor: pointer;
- stroke: darkgray;
-}
-
-circle.node.reflexive {
- stroke: #F00 !important;
- stroke-width: 2.5px;
-}
-circle.node.selected {
- stroke: #6F6 !important;
- stroke-width: 2px;
-}
-circle.node.highlighted {
- stroke: #6F6;
-}
-circle.node.inter-router {
- fill: #EAEAEA;
-}
-circle.node.normal {
- fill: #FFF;
- stroke: #FFF;
- fill-opacity: 0;
- stroke-width: 0;
-}
-circle.node.on-demand {
- fill: #C0FFC0;
-}
-circle.node.on-demand.artemis {
- fill: #FCC;
- /*opacity: 0.2; */
-}
-
-circle.node.fixed {
- stroke-dasharray: 10,2;
-}
-circle.node.temp {
- stroke: #f80;
- fill: #f0f0ff;
-}
-
-text {
- font: 12px sans-serif;
- pointer-events: none;
- /*font-family: monospace;*/
-
-}
-
-.tooltipsy
-{
- padding: 10px;
-/* max-width: 320px;*/
- color: #303030;
- background-color: #fcfcfe;
- border: 1px solid #deca7e;
- border-radius: 5px;
-}
-
-.tiptable {
-
-}
-.tiptable tr {
- border-bottom: 1px solid #ccc;
-}
-
-.tiptable tr:last-child {
- border-bottom: 0px;
-}
-
-.tiptable tr:nth-child(even) {
- background: #fcfcfe;
-}
-.tiptable tr:nth-child(odd) {
- background: #FFF
-}
-
-text.id {
- text-anchor: middle;
- font-weight: bold;
-}
-
-text.id.log, text.id.address {
- text-anchor: middle;
- font-weight: normal;
-}
-
-text.label {
- text-anchor: start;
- font-weight: bold;
-}
-
-.row-fluid.tertiary {
- position: relative;
- left: 20px;
-}
-
-.row-fluid.tertiary.left {
- float: left;
-}
-
-.row-fluid.tertiary.panel {
- width: 410px;
- /*height: 100%; */
-}
-
-div#topologyForm .ngViewport, div#topologyForm .gridStyle {
- height: auto !important;
- min-height: initial !important;
- overflow: initial;
-}
-
-div#multiple_details, div#link_details {
- height: 300px;
- width: 700px;
- display: none;
- padding: 0.5em;
- border: 1px solid;
- position: absolute;
- background-color: white;
- max-height: 330px !important;
- overflow: hidden;
-}
-div#multiple_details div.ngRow.selected {
- background-color: #c9dde1 !important;
-}
-
-div.grid-values {
- text-align: right;
-}
-
-div.grid-values.ngCellText span {
- padding-right: 4px;
-}
-
-.panel-adjacent {
- margin-left: 430px;
-}
-
-#topologyForm.selected {
- border: 1px solid blue;
-}
-#topologyForm {
- border-right: 1px solid lightgray;
- border-bottom: 1px solid lightgray;
- /*border: 1px solid white;*/
- padding: 2px;
- /* position: relative; */
- /* top: -8px; */
-}
-div.qdr-topology.pane.left .ngViewport {
- /* border: 1px solid lightgray; */
-}
-
-#topologyForm > div {
- width:396px;
-}
-
-/* globe */
-.land {
- fill: #999;
- stroke-opacity: 1;
-}
-
-.graticule {
- fill: none;
- stroke: black;
- stroke-width:.5;
- opacity:.1;
-}
-
-.labels {
- font: 18px sans-serif;
- fill: black;
- opacity: .85;
- text-anchor: middle;
-}
-
-.noclicks { pointer-events:none; }
-
-.point { opacity:.6; }
-
-.arcs {
- opacity:.7;
- stroke: darkgreen;
- stroke-width: 3;
-}
-.flyers {
- stroke-width:1;
- opacity: 0;
- stroke: darkred;
-}
-.arc, .flyer {
- stroke-linejoin: round;
- fill:none;
-}
-.arc { }
-.arc:hover {
- stroke: darkred;
-}
-.flyer { }
-.flyer:hover {
- stroke: darkgreen;
-}
-.arc.inter-router {
- stroke: darkblue;
-}
-
-#addNodeForm {
- padding: 1em;
-}
-
-
-li.currentStep {
- font-weight: bold;
-}
-
-.qdrTopology div.panel {
- position: absolute;
-}
-/*
-.ui-dialog-titlebar {
- border: 0;
- background: transparent;
-}
-*/
-
-/*
-.ui-tabs.ui-tabs-vertical {
- padding: 0;
- width: 48em;
-}
-.ui-tabs.ui-tabs-vertical .ui-widget-header {
- border: none;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav {
- float: left;
- width: 10em;
- background: #CCC;
- border-radius: 4px 0 0 4px;
- border-right: 1px solid gray;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li {
- clear: left;
- width: 100%;
- margin: 0.1em 0;
- border: 1px solid gray;
- border-width: 1px 0 1px 1px;
- border-radius: 4px 0 0 4px;
- overflow: hidden;
- position: relative;
- right: -2px;
- z-index: 2;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li a {
- display: block;
- width: 100%;
- padding: 0.1em 1em;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li a:hover {
- cursor: pointer;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li.ui-tabs-active {
- margin-bottom: 0.2em;
- padding-bottom: 0;
- border-right: 1px solid white;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li:last-child {
- margin-bottom: 10px;
-}
-.ui-tabs.ui-tabs-vertical .ui-tabs-panel {
- float: left;
- width: 34em;
- border-left: 1px solid gray;
- border-radius: 0;
- position: relative;
- left: -1px;
-}
-
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected {
- right: -3px !important;
-}
-
-.ui-tabs li i.ui-icon {
- display: inline-block;
-}
-*/
-.ui-tabs .ui-tabs-panel {
- /* padding-top: 0 !important; */
-}
-
-.ui-widget-content fieldset {
- float: left;
- padding: 0 1em 0 0;
-}
-
-.entity-description {
- color: #960;
- font-size: 90%;
-}
-
-.attr-description {
- padding-top: 1.5em;
- float: right;
- width: 27em;
-}
-.attr-annotations {
- padding-top: 2.5em;
- clear: both;
-}
-.attr-annotations > span {
- padding-top: 0.5em;
- border-top: 1px dashed darkgray;
- display: block;
-}
-
-.attr-type {
- color: #330;
- font-size: 85%;
-}
-.attr-required {
- color: red;
- font-size: 85%;
-}
-.attr-unique {
- color: green;
- font-size: 85%;
-}
-
-#tabs.nodeEntities {
- border: 0;
-}
-
-#tabs ul.nodeTabs {
- background: #fff;
-}
-
-#tabs #Container {
- border-left: 1px solid #aaa;
-}
-
-#tabs.ui-tabs .ui-tabs-nav li {
- border-bottom: 1px solid #aaa !important;
-}
-
-.entity-fields {
- /* height: 400px; */
- overflow-y: scroll;
- overflow-x: hidden;
-}
-
-div.boolean label:first-child {
- float: left;
- margin-right: 1em;
-}
-.entity-fields label {
- font-weight: 600;
- margin-top: 0.5em;
- display: inline;
-}
-
-.aggregate {
- text-align: right;
-}
-
-.aggregate i {
- float: right;
- margin: 3px 3px 3px 8px;
-}
-
-.aggregate .hastip {
- padding: 5px;
-}
-
-.subTip .tipsy-inner {
- background-color: white;
- color: black;
- font-size: 1.3em;
- border: 1px solid black;
-}
-
-.subTip .tipsy-arrow-n { border-bottom-color: black; }
-.subTip .tipsy-arrow-s { border-top-color: black; }
-.subTip .tipsy-arrow-e { border-left-color: black; }
-.subTip .tipsy-arrow-w { border-right-color: black; }
-
-
-.contextMenu {
- display:none;
- position:absolute;
- left:30px;
- top:-30px;
- z-index:999;
- /* width:300px; */
-}
-.contextMenu ul {
- width:300px;
- margin:0;
- padding-left:0;
- list-style:none;
- background:#fff;
- color:#333;
- font-weight: 600;
- /* -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px; */
- -moz-box-shadow:5px 5px 5px #ddd; -webkit-box-shadow:5px 5px 5px #999; box-shadow:5px 5px 5px #ddd;
- border: 1px solid #aaa;
-}
-.contextMenu ul li {
- padding:5px 10px;
- /* border-bottom: solid 1px #ccc; */
-}
-.contextMenu ul li:hover {
- background:#4a90d9; color:#fff;
-}
-.contextMenu ul li:last-child {
- border:none;
-}
-
-.na {
- display: none;
-}
-.contextMenu ul li.new {
- display: block;
-}
-.contextMenu ul li.adding, .contextMenu ul li.adding + li {
- display: block;
-}
-.contextMenu ul li.force-display {
- display: block;
-}
-.contextMenu ul li.context-separator {
- background-color: lightgray;
- height: 1px;
- padding: 0;
-}
-
-.ui-tabs.ui-tabs-vertical .ui-tabs-nav li.separated {
- margin-top: 1em;
-}
-
-#crosssection {
- display: none;
- position: absolute;
- top: 200px;
- left: 600px;
-}
-
-.node circle {
-/* fill: rgb(31, 119, 180);
- fill-opacity: .25; */
- fill: #cfe2f3;
- fill-opacity: .98;
- stroke: black;
- stroke-width: 3px;
-}
-
-circle.subcircle {
- stroke-width: 1px;
- /* stroke-dasharray: 2; */
- fill-opacity: 0;
- stroke: darkgray;
-}
-
-.leaf circle {
- fill: #6fa8dc;
- fill-opacity: 0.95;
- stroke-width: 3px;
-}
-
-.leaf circle[title] {
- font-family: monospace;
-
-}
-
-#svg_legend {
- position: absolute;
- top: 110px;
- right: 0;
- border: 1px solid #ccc;
- border-radius: 5px;
- background-color: #fcfcfc;
- margin-right: 1.3em;
- padding: 1em;
-}
-
-#svg_legend svg {
- height: 235px;
- width: 180px;
-}
-
-#multiple_details div.gridStyle {
-/* height: 50em; */
- min-height: 70px !important;
- height: auto !important;
-}
-
-#multiple_details .ngViewport {
- height: auto !important;
-}
-
-#multiple_details .gridCellButton button, #link_details .gridCellButton button {
- margin: .25em .4em;
- font-size: 12px;
- height: 2em;
- padding-top: .1em;
-}
-
-#linkFilter {
- display: none;
- padding: 0.5em;
- border: 1px solid grey;
- background-color: #F0F0F0;
- position: absolute;
- z-index: 100;
- right: 1em;
-}
-div.formLine label, div.formLine input {
- display: inline-block;
- padding: 0 8px;
-}
-
-span.filter-icon {
- padding-left: 1em;
-}
-
-button.filter-close {
- width: 15px;
- height: 20px;
- padding: 0;
- position: absolute;
- right: 4px;
- top: 4px;
-}
-
-div.filter-title h6 {
- margin: 0 0 0.5em 0;
-}
-
-.links button.btn-filter {
- padding: 0 1em 0 0;
- margin-left: 1em;
- font-size: 1em;
-}
-
-button.btn-filter {
- float: right;
-}
-span.dynatree-expanded button.btn-filter,
-a.dynatree-title:hover button.btn-filter {
- visibility: visible;
-}
-
-div.hdash-button a {
- color: white;
-}
-
-.linkDirIn {
- color: red;
- background-color: #f3f3f3;
-}
-
-.linkDirOut {
- color: blue;
- background-color: white;
-}
-
-div.topoGrid .ui-grid-viewport {
- overflow: hidden !important;
-}
-
-@-moz-document url-prefix() {
- /*.btn {padding: 2px 12px 8px !important;} */
- #overview-controller .btn {padding: 4px 12px !important;}
- #overview-controller .btn.filter-close {padding: 0 !important;}
-}
-
-.ui-fancytree.fancytree-container {
- font-size: 14px;
-}
-
-.grid-title {
- background-color: #FAFAFA;
- background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
- background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
- background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
- background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#F2F2F2', GradientType=0);
- border-bottom: 1px solid #d4d4d4;
- text-shadow: 0 1px 0 #FFFFFF;
- border-top-left-radius: 5px;
- border-top-right-radius: 5px;
- margin: 0 0 10px 0;
- padding-bottom: 4px;
-}
-
-.expand-collapse {
- float: right;
- margin-right: 0.5em;
-}
-
-.pane-viewport {
- top: 24px !important;
-}
-.dynatree-node.loading {
- position: initial;
-}
-
-.hideLeft {
- position: absolute;
- right: 0.5em;
- top: 1em;
- border: 0;
-}
-
-.showLeft {
- position: absolute;
- top: 1em;
- left: 0.5em;
- border: 0;
-}
-
-.newChart {
- float: right;
-}
-
-select.unique, input.unique {
- border: 2px solid blue;
-}
-select.required, input.required {
- border: 2px solid black;
-}
-
-.required-indicator {
- padding-left: 0.5em;
- font-size: 0.85em;
- vertical-align: super;
-}
-
-.required-indicator::before {
- content: '(required)'
-}
-
-.unique-indicator {
- padding-left: 0.5em;
- font-size: 0.85em;
- vertical-align: super;
-}
-
-.unique-indicator::before {
- content: '(must be unique if supplied)'
-}
-
-.unique-indicator
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/css/mock.css
----------------------------------------------------------------------
diff --git a/console/config/css/mock.css b/console/config/css/mock.css
deleted file mode 100644
index 3faa3f5..0000000
--- a/console/config/css/mock.css
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License
-*/
-
-#buttonBar {
- padding: 1em;
- border-bottom: 1px solid lightgrey;
- color: #f5f5f5;
-}
-
-.navbar-primary {
- font-size: 14px;
- background-image: linear-gradient(to bottom,#1d1d1d 0,#030303 100%);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1d1d1d', endColorstr='#ff030303', GradientType=0);
-}
-
-#buttonBar select {
- position: relative;
- top: 2px;
- margin-left: 0.25em;
- margin-right: 0.5em;
- color: black;
-}
-
-path.more {
- stroke-width: 1;
- stroke: black;
-}
-
-.edit_input {
- width: 20em !important;
-}
-
-.pull-right {
- float: right;
- margin-left: 0.25em;
-}
-
-.selected-node {
- margin: 0 5em;
-}
-
-#action_menu {
- position: absolute;
-}
-
-span.btn-icon {
- position: relative;
- top: -2px;
- padding-left: 2px;
- font-family: PatternFlyIcons-webfont;
-}
-
-label.form-label {
- font-weight: 800;
- margin-top: 1em;
- margin-bottom: 0;
-}
-
-span.logo {
- letter-spacing: 4px;
-}
-
-.navbar-brand {
- padding: 1px !important;
-}
-
-.config-area {
- max-height: 35em;
-}
-
-.btn .caret {
- font-weight: 800;
- padding-right: 2px;
-}
-.btn .down.caret {
- top: -2px;
-}
-
-.btn .plus.caret:before {
- content:"\f067";
-}
-
-.btn .down.caret:before {
- content:"\f0dd";
-}
-
-.tooltip.edit-tooltip .tooltip-inner {
- min-width: 25em;
- color: #880000;
- background-color: #fcfcfc;
- box-shadow: 0 6px 12px rgba(0,0,0,.175);
- border: 1px solid #333333;
-}
-.tooltip.edit-tooltip .tooltip-arrow {
- /* display: none; */
- color: $ffff68;
-}
-
-
-.form-input-container {
- display: inline-block;
- width: 20em;
-}
-
-div.boolean label {
- margin-bottom: 0;
-}
-
-.alert {
- max-width: 20em;
-}
-
-input.router-host {
- width: 45em;
-}
-
-pre.tail {
- max-height: 15em;
- min-height: 15em;
- overflow-y: scroll;
-}
-
-circle.node {
- opacity: 0.5;
-}
-circle.node.inter-router.highlighted {
- opacity: 1;
-}
-circle.node {
- stroke-width: 0;
-}
-
-.host_color, .host_name {
- display: inline-block;
-}
-
-.host_color {
- width: 1em;
- height: 1em;
- border: 0;
-}
-.host_name {
- font-weight: bold;
-}
-
-.host_pass {
- float: right;
-}
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/css/plugin.css
----------------------------------------------------------------------
diff --git a/console/config/css/plugin.css b/console/config/css/plugin.css
deleted file mode 100644
index a21af15..0000000
--- a/console/config/css/plugin.css
+++ /dev/null
@@ -1,986 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-main-display > .span8 {
- height: 100%;
- position: relative;
-}
-
-ul.qdrListNodes > li > span {
- padding: 6px 20px; 6px; 6px;
- display: block;
-}
-
-.qdrList .gridStyle {
- width: 20em;
- margin-right: 0;
- float: left;
-}
-
-
-.qdrList div.gridDetails {
- width: auto;
-}
-
-div.gridDetails {
- margin-left: 1em;
-}
-
-.selectedItems {
- /* margin-left: 21em; */
-}
-
-.qdrListPane {
- top: 110px;
-}
-
-.qdrListActions {
- width: auto;
- margin-left: 1em;
-}
-
-div.listAttrName {
- padding-top: 5px;
-}
-
-div.listAttrName i.icon-bar-chart {
- float: right;
- margin: 3px 5px;
-}
-
-div.listAttrName i.icon-bar-chart.active, div.hastip i.icon-bar-chart.active, li.haschart i {
- background-color: #AAFFAA;
-}
-
-div#main div ul.nav li a:not(.btn) {
- background: initial !important;
-}
-
-div#main div ul.nav li.active a {
- background-color: #f0f0ff !important;
-}
-
-div#main.qdr {
- margin-top: 56px !important;
-}
-
-div.charts-header {
- font-size: 1.2em;
- color: #666666;
- margin: 1em 0;
-}
-
-.selectedNode, .selectedAction, .selectedEntity {
- font-weight: 600;
- color: #606066;
-}
-
-.okButton {
- text-align: center;
- margin: 1em;
-}
-
-span.showChartsLink {
- border: 1px solid blue;
- padding: 1px 2px;
-}
-
-div.listGraphs p {
- margin: 1em 0 2em 2em;
- text-align: center;
-}
-
-div.centered {
- text-align: center;
- margin: 4em;
-}
-
-.modal-body.centered {
- margin: 0;
-}
-
-/* dialog */
-div.aChart {
- height: 200px;
- width: 400px;
- margin: 1em;
-}
-
-/* dashboard */
-div.aChart.hDash {
- /* width: 21em; */
- /* height: 17em; */
- width: 100%;
- height: 87%;
- margin: 0;
- padding: 0;
-
-}
-div.chartContainer {
- float: left;
- width: 100%;
- height: 100%;
- overflow: hidden;
-}
-
-/* the x and y axis lines */
-.d3Chart g.axis path.domain {
- stroke-width: 1;
- stroke: black;
-}
-
-/* the line surrounding the area chart */
-div.d3Chart path {
-/* stroke: black; */
- stroke-width: 0;
-/* opacity: 0.5; */
-}
-
-/* the line above the area chart */
-/* the color gets overridden */
-div.d3Chart path.line {
- stroke: steelblue;
- stroke-width: 1.5;
- fill: none;
- opacity: 1;
-}
-
-.mo-rect {
- fill: #ffffdd;
- stroke: #f0f0f0;
- stroke-width: 1;
-}
-
-.mo-guide {
- fill: none;
- stroke: #d0d0d0;
- stroke-width: 2;
- stroke-dasharray: 3,3;
-}
-
-div.d3Chart .title {
- text-decoration: underline;
-}
-
-
-.axis line, .axis path {
- fill: none;
- shape-rendering: crispEdges;
- stroke-width: 1;
- stroke: #000000;
-}
-
-.axis line {
- stroke: #C0C0C0;
- stroke-dasharray: 1,1;
- opacity: 0.5;
-}
-
-.y.axis text, .x.axis text, .focus text, div.d3Chart .title {
- font-size: 12px;
-}
-
-.y.axis path {
- stroke: #000;
- }
-
-.overlay {
- fill: none;
- pointer-events: all;
- }
-
-.focus circle {
- fill: none;
- stroke: steelblue;
- }
-.focus .fo-table {
- /* box-shadow: 2px 2px 3px #EEE; */
-}
-
-div.d3Chart {
- padding: 1em 0;
- border: 1px solid #C0C0C0;
-}
-div.d3Chart.hDash {
- border: 0px;
-}
-
-div.d3Chart .axis path {
- display: inherit;
-}
-.c3-circle {
- display: none;
-}
-
-.fo-table {
- border: 1px solid darkgray;
- background-color: white;
- font-size: .85em;
-}
-
-.fo-table td {
- padding: 4px;
- border-left: 1px solid darkgray;
-}
-.fo-table tr.detail td {
- padding: 1px 4px;
-}
-.fo-title {
- color: white;
- background-color: darkgray;
-}
-
-.fo-table-legend {
- width: 8px;
- height: 8px;
- border: 1px solid black;
- margin: 0 4px;
- display: inline-block;
-}
-
-svg .legend {
- dominant-baseline: central;
-}
-
-div.chartContainer div.aChart {
- margin-top: 0.5em;
-}
-
-#list-controller .tree-header {
- position: absolute;
- height: auto;
-}
-
-#list-controller select {
- height: 25px;
- float: left;
- padding: 0;
-}
-
-
-div#main.qdr div ul.nav li.active a {
- background-color: #e0e0ff !important;
- color: #000000;
-}
-
-div#main.qdr .selected, .box.selected {
- color: #000000;
- text-shadow: none;
-}
-
-/* the selected node on the list page */
-div.qdrList li.active, ul.qdrListNodes li.active {
- background-color: #e0e0ff;
-}
-
-div.qdr-attributes span.dynatree-selected a {
- background-color: #e0e0ff;
-}
-div.qdr-attributes.pane, div.qdr-topology.pane {
- position: absolute;
- margin-left: 10px;
-}
-div.qdr-overview.pane {
- position: absolute;
-}
-div.qdr-topology.pane.left {
- width: auto;
- /*border-right: 1px solid lightgray; */
-}
-
-/* the selected row in the name table */
-div#main.qdr div.qdrList div.selected {
- background-color: #e0e0ff !important;
-}
-
-#dialogChart, #dialogEditChart {
- height: 200px;
-}
-
-.chartOptions .modal-body {
- overflow-y: initial;
-}
-
-div.qdrCharts p.chartLabels button {
- float: right;
-}
-
-div.qdrCharts p.chartLabels {
- padding-right: 1em;;
- }
-
-p.dialogHeader {
- text-align: center;
-}
-
-p.dialogHeader input {
- margin-top: 10px;
- width: 480px;
-}
-
-.ui-slider-tick {
- position: absolute;
- background-color: #666;
- width: 2px;
- height: 8px;
- top: 12px;
- z-index: -1;
-}
-
-label.rateGroup {
- float: left;
-}
-
-div.chartOptions div.dlg-slider {
- float: left;
- margin-left: 2em;
- width: 28em;
- font-size: 14px;
-}
-
-div.chartOptions div.duration {
- width: 35em !important;
-}
-
-div.chartOptions .slider {
- margin-top: 1em;
- margin-bottom: 1em;
-}
-
-input[type="radio"] {
- margin-top: 0 !important;
-}
-
-div.chartOptions legend {
- font-size: 1.2em;
- margin-bottom: 10px;
-}
-
-div.chartOptions span.minicolors-swatch {
- width: 14px;
- height: 14px;
-}
-
-.minicolors-input {
- width: 4em;
- padding: 0 0 0 24px !important;
-}
-
-div.colorPicker div.colorText {
- display: inline-block;
- width: 10em;
-}
-div.colorPicker div:nth-of-type(1), /* first span under div.colorPicker */
- div.minicolors{
- float:left;
- margin-right: 0.5em;
-}
-
-div.chartOptions p.sep {
- height: 1em;
-}
-
-ul.nav-tabs {
- border-bottom: 1px solid #ddd !important;
-}
-
-.chartOptions ul.nav-tabs {
- margin-bottom: 0px !important;
-}
-
-div.tabbable div.tab-content {
- overflow: visible;
-}
-
-div.tabbable ul.nav-tabs > .active > a {
- background-color: #f8f8f8;
- border: 1px solid #ddd;
- border-bottom-color: transparent;
-}
-
-
-div.tabbable .tab-pane {
- background-color: #f8f8f8;
- padding: 12px;
- border-right: 1px solid #ddd;
- border-left: 1px solid #ddd;
- border-bottom: 1px solid #ddd;
-}
-div.dlg-large div.tabbable .tab-pane {
- margin-left: 11em;
-}
-
-div.tabbable ul.nav-tabs {
- margin-bottom: 0;
-}
-
-ul.qdrTopoModes {
- position: relative;
- top: -10px;
-}
-.overview.section {
- /* width: 35em; */
-}
-.overview.section .ngGrid {
- height: 12em !important;
- min-height: 12em !important;
-}
-
-.overview.routers.section .ngGrid {
- height: 16em !important;
- min-height: 16em !important;
-}
-.overview.routers.section {
- /*width: 15em; */
- }
-
-.grid-align-value {
- text-align: right;
-}
-
-.grid-align-value .ngCellText {
- padding-right: 10px;
-}
-
-.overview .ngRow:hover {
- background:#e0e0ff;
-}
-
-.overview-cell .ngCell:hover {
- background:#e0e0ff;
-}
-.overview-cell .ngCell.col0:hover, .overview-cell .ngCell.col1:hover {
- background: initial;
-}
-
-
-.qdr-overview.pane.left, .qdr-attributes.pane.left {
- top: 104px;
-}
-.qdr-topology.pane.left {
- top: 104px;
-}
-.qdr-overview.pane.left, .qdr-attributes.pane.left, .qdr-topology.pane.left {
- left: 10px;
-}
-
-.treeContainer {
- width: 100%;
- float: left;
-}
-
-.pane-content {
- overflow: auto;
-}
-
-#entityNames {
- width: 20em;
- float: left;
-}
-
-.treeDetails {
- margin-left: 260px;
-}
-
-.gridStyle:not(.noHighlight) .ui-grid-row:hover .ui-grid-cell-contents {
- background-color: #e0e0ff;
-}
-
-.ngCellText {
- padding: 4px 0 0 4px;
-}
-
-.overview {
- border-bottom: 1px solid #d4d4d4;
-}
-
-.ui-grid-row.ui-grid-row-selected > [ui-grid-row] > .ui-grid-cell {
- background-color: #e0e0ff;
-}
-
-.tab-content .tab-pane {
- background-color: #f8f8f8;
- padding: 12px;
- border-right: 1px solid #ddd;
- border-left: 1px solid #ddd;
- border-bottom: 1px solid #ddd;
-}
-
-div.chartOptions ul.nav-tabs > .active > a {
- background-color: #f8f8f8;
- border: 1px solid #ddd;
- border-bottom-color: transparent;
-}
-
-div.chartOptions label:nth-of-type(2) {
- margin-left: 1em;
-}
-div.chartOptions label {
- font-weight: normal;
- display: inline-block;
-}
-
-/*
-.form-horizontal .control-label {
- float: left;
- width: 160px;
- padding-top: 5px;
- text-align: right;
-}
-
-.form-horizontal .controls {
- margin-left: 180px;
-}
-
-.form-horizontal input, {
- display: inline-block;
- margin-bottom: 0;
- vertical-align: middle;
-}
-
-input[type="text"], input[type="number"], input[type="password"] {
- background-color: #ffffff;
- border: 1px solid #cccccc;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
- -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
- -o-transition: border linear 0.2s, box-shadow linear 0.2s;
- transition: border linear 0.2s, box-shadow linear 0.2s;
-}
-
-input[type="text"], input[type="number"], input[type="password"] {
- display: inline-block;
- width: 200px;
- padding: 4px 6px;
- margin-bottom: 10px;
- font-size: 14px;
- line-height: 20px;
- color: #555555;
- vertical-align: middle;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-
-.login input[type="checkbox"] {
- margin-top: 0.75em;
-}
-*/
-
-#dispatch-login-container {
- /* width: 18.5em; */
- margin-top: 2em;
-}
-/*
-div.login.container {
- width: 550px;
-}
-*/
-
-
-#overtree .fancytree-container {
- border: 0px;
-}
-
-#overtree span.fancytree-alert-icon.ui-icon-refresh {
- background-position: -64px -80px;
-}
-#overtree span.fancytree-alert-icon.ui-icon-transfer-e-w {
- background-position: -112px -80px;
-}
-
-#alerts {
- position: fixed;
- right: 0;
- top: 0;
- z-index: 100;
-}
-
-.alert-enter,
-.alert-leave,
-.alert-move {
- -webkit-transition: 1s linear all;
- -moz-transition: 1s linear all;
- -o-transition: 1s linear all;
- transition: 1s linear all;
- position:relative;
-}
-
-.alert-enter {
- left:-10px;
- opacity:0;
-}
-.alert-enter.alert-enter-active {
- left:0;
- opacity:1;
-}
-
-.alert-leave {
- left:0;
- opacity:1;
-}
-.alert-leave.alert-leave-active {
- left:-10px;
- opacity:0;
-}
-
-.alert-move {
- opacity:0.5;
-}
-.alert-move.alert-move-active {
- opacity:1;
-}
-
-.overview .table-striped tr:hover td {
- background-color: #e0e0ff !important;
-}
-
-#entityNames div.ngViewport {
- overflow-x: hidden;
-}
-
-.connect-column.connect-form {
- width: 20em;
-}
-
-.chartLabels button a {
- text-decoration: none;
-}
-
-.fancytree-ico-c.router .fancytree-icon {
-
-}
-
-.tabs-left .nav-tabs {
- float: left;
-}
-.tabs-left .nav-tabs > li {
-/* float: initial; */
-}
-
-div.modal.dlg-large {
- width: 53em;
-}
-
-button.hdash-button a {
- text-decoration: none;
- color: #fff;
-}
-
-div.widget-body > div {
- height: 100%;
-}
-
-div.qdrCharts {
- height: 100%;
-}
-
-ul.dispatch-view {
- margin-bottom: 0 !important;
-}
-
-.qdr-overview.pane.left span:not(.dynatree-has-children) .dynatree-icon:before,
-.qdr-attributes.pane.left span:not(.dynatree-has-children) .dynatree-icon:before {
- color: green;
-}
-
-span:not(.dynatree-has-children).address .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.address .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f0ac";
-}
-span:not(.dynatree-has-children).address.mobile .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.address.mobile .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f109";
-}
-span:not(.dynatree-has-children).address.internal.mobile .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.address.internal.mobile .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f0ac";
-}
-span:not(.dynatree-has-children).address.router .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.address.router .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f047";
-}
-
-span.address-link .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f0ac";
-}
-
-span:not(.dynatree-has-children).connection.external .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f109";
-}
-span:not(.dynatree-has-children).connection.normal .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f08e";
-}
-span:not(.dynatree-has-children).connection.external.quiesced .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f14c";
- color: red;
-}
-span:not(.dynatree-has-children).connection.inter-router .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f07e";
-}
-span:not(.dynatree-has-children).connection.router-control .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f013";
-}
-span:not(.dynatree-has-children).no-data .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f05e";
- color: red !important;
-}
-span:not(.dynatree-has-children).loading .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f254";
-}
-span:not(.dynatree-has-children).connector .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f126";
-}
-span:not(.dynatree-has-children).container .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f16c";
-}
-span:not(.dynatree-has-children).log .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f0f6";
-}
-span:not(.dynatree-has-children).router\.node .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f013";
-}
-span:not(.dynatree-has-children).link.inter-router .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.link.inter-router .dynatree-icon:before{
- font-family: FontAwesome;
- content: "\f07e";
-}
-span:not(.dynatree-has-children).link.router-control .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.link.router-control .dynatree-icon:before{
- font-family: FontAwesome;
- content: "\f013";
-}
-span:not(.dynatree-has-children).link.endpoint .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.link.endpoint .dynatree-icon:before{
- font-family: FontAwesome;
- content: "\f109";
-}
-span:not(.dynatree-has-children).link.console .dynatree-icon:before,
-span:not(.dynatree-has-children).router\.link.console .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f108";
-}
-span:not(.dynatree-has-children).listener .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f025";
-}
-span:not(.dynatree-has-children).connection .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f07e";
-}
-span:not(.dynatree-has-children).connection.console .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f108";
-}
-span:not(.dynatree-has-children).waypoint .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f0ec";
-}
-span:not(.dynatree-has-children).router .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f047";
-}
-span:not(.dynatree-has-children).fixedAddress .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f015";
-}
-span:not(.dynatree-has-children).linkRoutePattern .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f039";
-}
-span:not(.dynatree-has-children).allocator .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f170";
-}
-
-.ngCellText {
-/* color: #333333; */
-}
-
-.changed {
- color: #339933;
-}
-
-div.dispatch-router div.help {
- width: auto;
- padding: 1em;
- background-color: lavender;
- border-radius: 6px;
- margin-top: 1em;
- text-align: center;
-}
-
-div.operations tr:nth-child(even) {
- background: #f3f3f3;
-}
-div.operations tr:nth-child(odd), div.operations tr:last-child {
- background: #fff;
-}
-
-div.operations tr input {
- margin: 0;
- padding: 3px 6px;
-}
-div.operations table {
- width: 100%;
-}
-div.operations th {
- width: 50%;
- border-bottom: 1px solid #cccccc;
- text-align: left;
-}
-div.operations td:nth-child(odd), div.operations th:nth-child(odd) {
- border-right: 1px solid #cccccc;
-}
-div.operations td:nth-child(odd) {
- padding-left: 0;
-}
-div.operations td:nth-child(even), div.operations th:nth-child(even) {
- padding-left: 5px;
-}
-div.operations th {
- padding: 5px;
-}
-div.operations .tab-pane.active {
- padding: 12px 12px 12px 0;
-}
-div.operations label {
- padding-top: 4px;
- margin-bottom: 4px;
-}
-.qdrListActions .ngGrid {
- /*min-height: 40em;
- height: 100%; */
-}
-div.qdrListActions .ngViewport {
- height: initial !important;
-}
-
-div.operations .boolean {
- padding-bottom: 0;
-}
-
-table.log-entry {
- margin-bottom: 1em;
- border-top: 1px solid black;
-}
-
-table.log-entry pre {
- background-color: #f5f5f5;
- color: inherit;
- margin: 0;
-}
-
-circle.node.normal.console {
- fill: lightcyan;
-}
-circle.node.artemis {
- fill: lightgreen;
-}
-circle.node.route-container {
- fill: orange;
-}
-
-text.console, text.on-demand, text.normal {
- font-family: FontAwesome;
- font-weight: normal;
- font-size: 16px;
-}
-
-@font-face {
- font-family:"Brokers";
- src: url("brokers.ttf") /* TTF file for CSS3 browsers */
-}
-
-text.artemis {
- font-family: Brokers;
- font-size: 20px;
- font-weight: bold;
-}
-
-text.qpid-cpp {
- font-family: Brokers;
- font-size: 18px;
- font-weight: bold;
-}
-
-i.red {
- color: red;
-}
-
-.qdrListActions div.delete {
- width: 20em;
- margin: auto;
- border: 1px solid #eaeaea;
- height: 5em;
- padding: 4em;
- background-color: #fcfcfc;
-}
-
-.btn:focus {
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
-}
-
-select:focus, input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus {
- outline:3px solid rgba(82, 168, 236, 0.6);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-
-#dispatch-login-container .ng-invalid-range {
- border-color: #e9322d !important;
-}
-
-div#durationSlider, div#rateSlider {
- margin-top: 1em;
-}
-
-.list-grid {
- padding-left: 10px;
-}
-
-.ngViewport.ng-scope {
- height: auto !important;
-}
-
-div#list-controller {
- padding-left: 300px;
-}
-
-.listening-on {
- background-color: #CCFFCC;
-}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[4/5] qpid-dispatch git commit: DISPATCH-1001 Removing developer tool
Posted by ea...@apache.org.
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/css/site-base.css
----------------------------------------------------------------------
diff --git a/console/config/css/site-base.css b/console/config/css/site-base.css
deleted file mode 100644
index b1fa89b..0000000
--- a/console/config/css/site-base.css
+++ /dev/null
@@ -1,4706 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-* {
- outline: none;
-}
-
-* {
- font-family: 'Open Sans', sans-serif;
-}
-
-a:focus {
- outline: none;
-}
-.navbar .brand {
- font-size: 18px;
-}
-
-.brand > img {
- height: 11px;
- width: auto;
-}
-
-.property-name {
- white-space: nowrap;
-}
-
-small table tbody tr td.property-name {
- font-weight: bold;
- text-align: right;
-}
-
-#log-panel {
- position: fixed;
- top: -5px;
- left: 30px;
- right: 30px;
- bottom: 50%;
- z-index: 10000;
- background: inherit;
- transition: bottom 1s ease-in-out;
-}
-
-#log-panel > div {
- position: relative;
- width: 100%;
- height: 100%;
-}
-
-#log-panel #log-panel-statements {
- margin-left: 0;
- margin-bottom: 0;
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 20px;
- overflow-y: auto;
-}
-
-#log-panel-statements li {
- margin-left: 3px;
- margin-right: 3px;
- transition: background .25s ease-in-out;
-}
-
-#log-panel-statements li pre {
- border-radius: 0;
- font-size: 11px;
-}
-
-#log-panel-statements li:hover {
- background: #111111;
-}
-
-#log-panel-statements li.DEBUG {
- color: dodgerblue;
-}
-
-#log-panel-statements li.INFO {
- color: white;
-}
-
-#log-panel-statements li.WARN {
- color: yellow;
-}
-
-#log-panel-statements li.ERROR {
- color: red;
-}
-
-#log-panel #close {
- text-align: center;
- position: absolute;
- height: 20px;
- bottom: 0;
- left: 0;
- right: 0;
- box-shadow: 0 1px 13px rgba(0, 0, 0, 0.1) inset;
- opacity: 1;
-}
-
-#log-panel #copy {
- position: absolute;
- right: 23px;
- bottom: 26px;
- background: inherit;
- transition: opacity 1s ease-in-out;
- opacity: 0.4;
- cursor: pointer;
-}
-
-#log-panel #copy:hover {
- opacity: 1;
-}
-
-div.log-stack-trace p {
- line-height: 14px;
- margin-bottom: 2px;
-}
-
-#canvas {
- display: inline-block;
-}
-.fill {
- min-height: 100%;
- height: 100%;
-}
-/* sub tab tweaks */
-body div div ul.nav {
- margin-bottom: 5px;
- border-bottom: none;
-}
-
-#tree-ctrl {
- position: relative;
- top: -3px;
-}
-
-#tree-ctrl > li > a {
- display: block;
- padding-left: 5px;
- padding-right: 5px;
- /* padding: 5px; */
-}
-
-ul.dynatree-container {
- background: inherit;
-}
-ul.dynatree-container li {
- background: inherit;
-}
-/* Chart stuff */
-#charts {
- display: block;
- overflow: hidden;
- margin: 5px auto;
- position: relative;
- padding-bottom: 35px;
-}
-.group {
- margin-bottom: 1em;
-}
-.axis {
- font: 10px sans-serif;
- pointer-events: none;
- z-index: 2;
-}
-.axis.text {
- -webkit-transition: fill-opacity 250ms linear;
-}
-.axis path {
- display: none;
-}
-.axis line {
- stroke: #000;
- shape-rendering: crispEdges;
-}
-.axis.top {
- position: relative;
- top: 0;
- padding: 0;
-}
-.axis.bottom {
- position: absolute;
- bottom: 0px;
- padding: 0;
-}
-.horizon {
- overflow: hidden;
- position: relative;
-}
-.horizon:last-child {
- border-bottom: none;
-}
-.horizon + .horizon {
- border-top: none;
-}
-.horizon canvas {
- display: block;
-}
-.horizon .title,
-.horizon .value {
- bottom: 0;
- line-height: 30px;
- margin: 0 6px;
- position: absolute;
- white-space: nowrap;
-}
-.horizon .title {
- left: 0;
-}
-.horizon .value {
- right: 0;
-}
-.line {
- opacity: .2;
- z-index: 2;
-}
-
-td {
- padding-right: 20px;
-}
-
-.expandable {
- padding: 3px;
-}
-
-.expandable > .title {
- cursor: pointer;
-}
-
-i.expandable-indicator {
- font-family: FontAwesome;
- font-weight: normal;
- font-style: normal;
- display: inline-block;
- text-decoration: inherit;
-}
-
-.expandable-body form fieldset legend {
- font-size: inherit;
- margin-bottom: 0px;
-}
-
-.expandable.opened i.expandable-indicator:before {
- font-family: FontAwesome;
- content: "\f078" !important;
-}
-
-.expandable.closed i.expandable-indicator:before {
- font-family: FontAwesome;
- content: "\f054";
-}
-
-.expandable.opened i.expandable-indicator.folder:before {
- font-family: FontAwesome;
- content: "\F07C" !important;
-}
-
-.expandable.closed i.expandable-indicator.folder:before {
- font-family: FontAwesome;
- content: "\F07B";
-}
-
-.expandable.opened .expandable-body {
- display: inline-block;
- margin-bottom: 3px;
-}
-
-.expandable.closed .expandable-body {
- display: none;
-}
-
-span.dynatree-icon {
- position: relative;
- top: -2px;
- font-size: 17px;
-}
-
-span:not(.dynatree-has-children) .dynatree-icon:before {
- font-family: FontAwesome;
- content: "\f013";
-}
-
-ul.inline,
-ol.inline {
- margin-left: 0;
- list-style: none;
-}
-
-ul.inline > li,
-ol.inline > li {
- display: inline-block;
- padding-right: 2px;
- padding-left: 2px;
-}
-
-.tab {
- display: block;
- margin-left: 1em;
-}
-
-.red {
- color: red !important;
-}
-
-.orange {
- color: orange !important;
-}
-
-.yellow {
- color: yellow !important;
-}
-
-.green {
- color: green !important;
-}
-
-.background-green {
- color: white;
- background-color: #51a351;
-}
-
-.background-light-green {
- color: white;
- background-color: #5ab15a;
-}
-
-.blue {
- color: dodgerblue !important;
-}
-
-.background-blue {
- color: white;
- background-color: #006dcc;
-}
-
-.icon1point5x {
- font-size: 1.5em;
-}
-
-.centered,
-.align-center {
- margin-left: auto !important;
- margin-right: auto !important;
- text-align: center;
-}
-
-.align-right {
- text-align: right;
-}
-
-.align-left {
- text-align: left;
-}
-
-.inline {
- display: inline;
-}
-
-.inline-block,
-.list-row-select,
-.list-row-contents,
-.list-row-contents > .ngCellText {
- display: inline-block;
-}
-
-.list-row {
- height: 30px;
- white-space: nowrap;
-}
-
-.list-row .ngCellText {
- padding: 0;
- vertical-align: middle;
-}
-
-.list-row-select,
-.list-row-contents {
- height: 100%;
- vertical-align: middle;
-}
-
-.list-row-select > input {
- vertical-align: middle;
-}
-
-.no-bottom-margin {
- margin-bottom: 0 !important;
-}
-
-.no-bottom-margin .control-group {
- margin-bottom: 4px;
-}
-
-.bottom-margin {
- margin-bottom: 20px;
-}
-
-li.attr-column {
- width: 1em;
-}
-
-.editor-autoresize .CodeMirror {
- height: auto;
-}
-
-.well.editor-autoresize {
- padding: 0px;
-}
-
-.well.editor-autoresize .CodeMirror {
- margin-bottom: 0px;
- border: none;
-}
-
-.editor-autoresize .CodeMirror .CodeMirror-scroll {
- overflow-y: hidden;
- overflow-x: auto;
-}
-
-.gridster ul#widgets {
- list-style-type: none;
-}
-
-.gridster ul#widgets .gs_w {
- padding: 0px;
- overflow: hidden;
- position: relative;
-}
-
-.gridster ul#widgets .preview-holder {
- transition-property: opacity;
- transition-duration: 500ms;
- padding: 1px;
-}
-
-.widget-area {
- position: relative;
- height: 100%;
- width: 100%;
-}
-
-.widget-title {
- margin: 0;
- padding-left: 5px;
- padding-right: 5px;
- z-index: 6000;
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
-}
-
-.widget-title:hover {
- cursor: move;
-}
-
-.widget-title > .row-fluid > .pull-right > i {
- cursor: pointer;
- opacity: .25;
-}
-
-.widget-title > .row-fluid > .pull-right > i:hover {
- transition: opacity 0.25s ease-in-out;
- -moz-transition: opacity 0.25s ease-in-out;
- -webkit-transition: opacity 0.25s ease-in-out;
- opacity: 1;
-}
-
-.widget-body {
- position: absolute;
- top: 20px;
- bottom: 0;
- left: 0;
- right: 0;
-}
-
-.height-controls > a {
- float: left;
- display: block;
- opacity: .1;
- text-decoration: none;
-}
-
-.width-controls > a {
- float: left;
- display: block;
- opacity: .1;
- text-decoration: none;
-}
-
-.width-controls > a:hover {
- opacity: .9;
- text-decoration: none;
-}
-
-.height-controls > a:hover {
- opacity: .9;
- text-decoration: none;
-}
-
-.width-controls {
- font-size: 32px;
- z-index: 50;
- position: absolute;
- width: 1.5em;
- height: 3em;
- display: block;
- right: 5px;
- top: 43%;
-}
-
-.height-controls {
- font-size: 32px;
- z-index: 50;
- position: absolute;
- display: block;
- width: 3em;
- height: 1.5em;
- left: 41%;
- bottom: 5px;
-}
-
-editable-property {
- position: relative;
-}
-
-.ep.editing {
- position: absolute;
- top: -10px;
- padding: 0;
- z-index: 10000;
- border: 1px solid #cecdcd;
- white-space: nowrap;
-}
-
-/*
-.widget-title > div > div .ep[ng-show=editing] {
- top: -1px;
-}
-
-table .ep.editing {
- top: 12px;
-}
- */
-.ep.editing > form > fieldset > i {
- position: relative;
- top: 2px;
-}
-
-.ep > i {
- cursor: pointer;
- opacity: .25;
- transition: opacity 0.25s ease-in-out;
- -moz-transition: opacity 0.25s ease-in-out;
- -webkit-transition: opacity 0.25s ease-in-out;
-}
-
-.ep > form > fieldset > input {
- border: 0;
-}
-
-.ep > i:hover {
- opacity: 1;
-}
-
-.ep form fieldset i {
- cursor: pointer;
- padding-left: 5px;
-}
-
-.ep form.no-bottom-margin {
- margin: 0;
-}
-
-.ngTotalSelectContainer {
- margin: 0px;
-}
-
-.ngTopPanel {
- background: inherit;
-}
-
-.ngGrid {
- background: inherit;
-}
-
-.ngViewport {
- margin-left: 0px;
- margin-right: 0px;
-}
-
-#widgets li div div div div form fieldset div input {
- display: none;
-}
-#widgets li div div div div div#attributesGrid div div div div.ngHeaderCell {
- border: none;
-}
-#widgets li div div div div div#attributesGrid div div div div.ngCell {
- border: none;
-}
-#widgets li div div div div div#attributesGrid div.ngTopPanel {
- border: none;
-}
-#widgets li div div div div div#attributesGrid div.ngTopPanel div.ngGroupPanel {
- border: none;
-}
-#widgets li div div div div div#attributesGrid div.ngFooterPanel {
- border: none;
- display: none;
-}
-.ngFooterPanel {
- border-top: none;
-}
-.ngRow .ngCell:last-child {
- border-right: none;
-}
-.ngRow:last-child {
- border-bottom: none;
-}
-.ngFooterTotalItems span:first-child {
- margin-right: .5em;
-}
-
-.ACTIVE:before {
- font-family: FontAwesome;
- content: "\f087";
- font-style: normal;
- color: #777777;
-}
-
-.RESOLVED:before {
- font-family: FontAwesome;
- content: "\f0ad";
- font-style: normal;
-}
-
-.STARTING:before {
- font-family: FontAwesome;
- content: "\f021";
- font-style: normal;
-}
-
-.STARTING {
- -moz-animation: spin 2s infinite linear;
- -o-animation: spin 2s infinite linear;
- -webkit-animation: spin 2s infinite linear;
- animation: spin 2s infinite linear;
-}
-
-.STOPPING:before {
- font-family: FontAwesome;
- content: "\f021";
- font-style: normal;
-}
-
-.STOPPING {
- -moz-animation: spin 2s infinite linear;
- -o-animation: spin 2s infinite linear;
- -webkit-animation: spin 2s infinite linear;
- animation: spin 2s infinite linear;
-}
-
-.UNINSTALLED:before {
- font-family: FontAwesome;
- content: "\f014";
- font-style: normal;
-}
-
-.INSTALLED:before {
- font-family: FontAwesome;
- content: "\f06b";
- font-style: normal;
-}
-
-.table-bordered {
- border: none;
- border-radius: 0px;
-}
-
-.table-bordered thead:first-child tr:first-child th:first-child,
-.table-bordered tbody:first-child tr:first-child td:first-child {
- border-radius: 0px;
- border-left: none;
-}
-
-.table-bordered th,
-.table-bordered td {
- border-left: none;
- border-top: none;
-}
-
-.table-bordered th:last-child,
-.table-bordered td:last-child {
- border-left: none;
- border-top: none;
- border-right: none;
-}
-
-table.table thead .sorting {
- background: inherit;
-}
-
-table.table thead .sorting_asc:after {
- background: url('../img/datatable/sort_asc.png') no-repeat top center;
-}
-
-table.table thead .sorting_desc:after {
- background: url('../img/datatable/sort_desc.png') no-repeat top center;
-}
-
-.dataTables_filter label {
- margin-bottom: 0px;
-}
-
-.dataTables_filter label input {
- padding-right: 14px;
- padding-right: 4px \9;
- padding-left: 14px;
- padding-left: 4px \9;
- margin-bottom: 0;
-}
-
-.nav {
- margin-bottom: 10px;
-}
-
-.navbar-fixed-top {
- margin-bottom: 0px;
-}
-
-#main > div > ul.nav,
-ng-include > .nav.nav-tabs {
- margin-bottom: 10px;
- min-width: 120px;
-}
-
-#main > div > ul.nav > li,
-ng-include > .nav.nav-tabs > li {
- margin-top: 3px;
- margin-bottom: 3px;
-}
-
-.navbar .btn-navbar span:after {
- font-family: FontAwesome;
- content: "\f0de";
- margin-left: 7px;
-}
-
-.navbar .btn-navbar.collapsed span:after {
- font-family: FontAwesome;
- content: "\f0dd";
- margin-left: 7px;
-}
-
-#main > div > ul.nav,
-ng-include > .nav.nav-tabs {
- padding-left: 3px;
- padding-right: 3px;
-}
-
-.nav-tabs > li > a,
-.nav-pills > li > a {
- margin-right: 0px;
-}
-
-div#main div ul.nav li a,
-div#main div ul.nav li span {
- padding-bottom: 2px;
- padding-top: 2px;
-}
-div#main div ul.nav li a:not(.btn), div#main div ul.nav li span.a:not(.btn) {
- border: 1px;
- border-radius: 2px;
- background: inherit;
- color: #777777;
- text-shadow: 0 1px 0 #FFFFFF;
-}
-
-div#main div ul.nav li a:hover {
- padding-bottom: 2px;
- padding-top: 2px;
-}
-
-#main div div div section .tabbable .nav.nav-tabs {
- margin-top: 0px;
- margin-bottom: 10px;
- min-width: 120px;
-}
-
-#main > div > div > div > .nav.nav-tabs:not(.connected),
-.span12 > .nav.nav-tabs:not(.connected) {
- margin-top: 5px;
-}
-
-.span12 > .nav.nav-tabs:not(.connected),
-.span12 > .nav.nav-tabs > li {
- margin: 3px;
-}
-
-.logbar {
- z-index: 40;
- position: fixed;
- width: 87%;
- top: 70px;
- left: 5%;
- padding-left: 20px;
- padding-right: 20px;
-}
-
-.logbar-container {
- margin-top: 10px;
- margin-bottom: 5px;
-}
-
-.logbar-container .control-group {
- margin-bottom: 5px;
-}
-
-.log-main {
- margin-top: 55px;
-}
-
-.log-filter {
- margin-right: 30px;
-}
-
-.ui-resizeable-handle {
- display: none;
-}
-
-.ui-resizable-se {
- height: 10px;
- width: 10px;
- margin-right: 5px;
- margin-bottom: 5px;
- font-size: 32px;
- z-index: 50;
- position: absolute;
- display: block;
- right: 0px;
- bottom: 0px;
- cursor: se-resize;
-}
-
-.no-log {
- margin-top: 55px;
-}
-
-.control i {
- cursor: pointer;
-}
-
-td.details {
- padding: 0px;
- border: none;
- margin: 0px;
- height: 0px;
-}
-
-.innerDetails {
- padding: 5px;
- white-space: normal;
- display: none;
-}
-
-table.dataTable {
- table-layout: fixed;
-}
-
-table.dataTable tbody tr td {
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
-}
-
-.wiki.logbar-container {
- margin-top: 5px;
- margin-bottom: 5px;
-}
-
-.wiki.logbar-container > .nav.nav-tabs {
- margin-top: 0px;
- margin-bottom: 0px;
-}
-
-.wiki.logbar-container .pull-right {
- margin-top: 1px;
-}
-
-.wiki-fixed {
- margin-top: 45px;
-}
-
-.wiki-fixed .pane {
- top: 120px;
-}
-
-.help-sidebar li {
- padding-left: 2px;
- padding-right: 2px;
-}
-
-.help-sidebar li a {
- padding-left: 3px;
- padding-right: 3px;
-}
-
-.help-sidebar li:first-child {
- margin-top: 0px !important;
- padding-top: 20px;
-}
-
-.help-display p {
- text-align: justify;
-}
-
-.help-display h5 {
- margin-top: 2em;
-}
-
-.help-display h6 {
- margin-top: 2em;
-}
-
-.form-data {
- display: inline-block;
- margin: 5px;
-}
-
-input[type="checkbox"].hawtio-checkbox {
- margin-top: 10px;
-}
-
-.bundle-list {
- width: 100%;
-}
-
-.bundle-item {
- position: relative;
- display: inline-block;
- width: 300px;
- margin-bottom: 1px;
-}
-
-.bundle-item-details table {
- min-height: 0;
-}
-
-.bundle-item-details {
- height: 0;
- display: inline-block;
- z-index: 15;
-}
-
-.bundle-item > a {
- display: block;
- z-index: 5;
-}
-
-.bundle-item > a:hover {
- text-decoration: none;
-}
-
-.bundle-item a span {
- display: block;
- padding: 8px;
- font-weight: normal;
- z-index: 6;
- text-overflow: ellipsis;
- overflow: hidden;
-}
-
-.bundle-item a span.badge {
- margin-left: 7px;
-}
-
-.bundle-item a span.badge::before {
- padding: 0px;
- float: left;
- position: relative;
- top: 4px;
- left: -8px;
- display: block;
- content: ' ';
- height: 6px;
- width: 6px;
- z-index: 10;
-}
-
-.bundle-item a.toggle-action {
- position: absolute;
- display: block;
- width: 16px;
- height: 16px;
- margin: 0;
- padding: 0;
- right: 12px;
- top: 6px;
- opacity: 0.2;
- transition: all 500ms ease-in-out;
- font-size: 18px;
-}
-
-.bundle-item a.toggle-action .icon-power-off {
- color: orange;
-}
-
-.bundle-item a.toggle-action .icon-play-circle {
- color: green;
-}
-
-.bundle-item a.toggle-action:hover {
- opacity: 1;
- text-decoration: none;
-}
-
-.bundle-list {
- margin-bottom: 2em;
-}
-
-div.hawtio-form-tabs div.tab-content {
- padding-top: 15px;
- padding: 10px;
-}
-
-.hawtio-form fieldset legend {
- margin-bottom: 0;
- border-bottom: none;
- font-size: 15px;
-}
-
-.spacer {
- display: inline-block;
- margin-bottom: 10px;
-}
-
-div.hawtio-form-tabs ul.nav-tabs {
- margin-bottom: 0px !important;
-}
-
-div.hawtio-form-tabs ul.nav-tabs li {
- margin-bottom: -1px !important;
-}
-
-div.hawtio-form-tabs ul.nav-tabs li.active:first-child {
- margin-left: 0px;
-}
-
-div.hawtio-form-tabs ul.nav-tabs li.active {
- margin-right: 1px;
- margin-left: 2px;
- box-shadow: 0 -10px 10px -10px rgba(0, 0, 0, 0.1) !important;
-}
-
-div.hawtio-form-tabs ul.nav-tabs li.active a {
- font-weight: bold;
-}
-
-.popover-inner .popover-title {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.popover {
- width: auto;
-}
-
-li.stacktrace {
- line-height: 10px;
-}
-
-.control-button {
- width: 14px;
-}
-
-.ngViewport:focus {
- outline: none;
-}
-
-.wikiGridStyle {
- height: 350px;
-}
-
-/** Animations */
-.wave-enter-setup,
-.wave-leave-setup {
- transition: all cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s;
-}
-
-.wave-enter-setup {
- position: absolute;
- left: -100%;
-}
-
-.wave-enter-start {
- left: 0;
-}
-
-.wave-leave-setup {
- position: absolute;
- left: 0;
-}
-
-.wave-leave-start {
- left: 100%;
-}
-
-/* slideout directive stuff */
-.slideout {
- position: fixed;
- z-index: 3000;
- width: 75%;
-}
-
-.slideout > .slideout-title {
- min-height: 22px;
- font-size: 20px;
- padding: 15px;
-}
-
-.slideout > .slideout-content {
- position: relative;
- min-height: 93%;
- max-height: 93%;
- overflow: auto;
- -webkit-transform: translateZ(0);
-}
-
-.slideout-title span {
- width: 97%;
- display: inline-block;
- text-align: left;
-}
-
-.slideout.left > .slideout-content {
- left: 0;
- top: 0;
- margin-right: 2px;
- margin-left: 0px;
-}
-
-.slideout.right > .slideout-content {
- left: 2px;
- top: 0;
- margin-left: 2px;
- margin-right: 0px;
-}
-
-.slideout > .slideout-content > .slideout-body {
- margin: 5px;
- height: 100%;
-}
-
-.slideout.right {
- left: 100%;
-}
-
-.slideout.left {
- left: -75%;
-}
-
-.slideout .slideout-title a {
- display: inline-block;
-}
-
-.slideout .slideout-title a:hover {
- text-decoration: none;
-}
-
-.slideout.right .slideout-title a {
- margin-left: 5px;
- float: left;
-}
-
-.out {
- transition: left 1s, right 1s ease-in-out;
-}
-
-.slideout.left .slideout-title a {
- margin-right: 5px;
- float: right;
-}
-
-.slideout.right.out {
- left: 25%;
-}
-
-.slideout.left.out {
- left: 0%;
-}
-
-.column-filter {
- width: 94%;
- margin-bottom: 10px !important;
-}
-
-.color-picker {
- display: inline-block;
- position: relative;
- margin: 0px;
- line-height: 0px;
-}
-
-.color-picker .wrapper {
- display: inline-block;
- padding: 2px;
- line-height: 0;
-}
-
-.selected-color {
- width: 1em;
- height: 1em;
- padding: 4px;
- transition: all cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s;
- display: inline-block;
- cursor: pointer;
-}
-
-.color-picker-popout {
- transition: opacity 0.25s ease-in-out;
- position: absolute;
- top: 0px;
- overflow: hidden;
- padding: 0px;
- line-height: 0;
- margin: 0px;
- width: 0px;
- opacity: 0;
-}
-
-.popout-open {
- padding: 1px;
- width: auto;
- opacity: 1;
-}
-
-.color-picker div table tr td div {
- width: 1em;
- height: 1em;
- padding: 3px;
- transition: all cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s;
-}
-
-.color-picker div table tr td {
- padding-right: 5px;
-}
-
-.color-picker div table tr td:last-child {
- padding-right: 0px;
-}
-
-.modal-body div form fieldset div.spacer {
- display: inherit;
- margin-bottom: inherit;
-}
-
-.mouse-pointer {
- cursor: pointer;
-}
-
-.clickable {
- cursor: pointer;
- opacity: 0.6;
- transition: opacity .5s;
- text-decoration: none;
-}
-
-.clickable,
-.clickable:before {
- width: 16px;
- height: 16px;
- line-height: 16px;
-}
-
-.clickable.no-fade {
- transition: none;
- opacity: 1;
-}
-
-.clickable:hover {
- opacity: 1;
- text-decoration: none;
-}
-
-.hawtio-pager {
- overflow: auto;
- display: inline-block;
-}
-
-.hawtio-pager label {
- min-height: 100%;
- vertical-align: middle;
- margin-right: 5px;
- display: inline-block;
-}
-
-.fabric-view {
- position: relative;
- min-width: 928px;
-}
-
-.columns {
- position: absolute;
- bottom: 0;
- top: 0;
- left: 0;
- right: 0;
- padding-left: 300px;
- padding-right: 304px;
- padding-bottom: 0px;
- padding-top: 0px;
-}
-
-.column {
- float: left;
- position: relative;
- margin-top: 0px;
- margin-bottom: 0;
- height: 100%;
- overflow-x: hidden;
- overflow-y: auto;
-}
-
-.columns #center {
- width: 100%;
- padding: 0 5px;
- margin-right: 8px;
-}
-
-.columns #left {
- width: 280px;
- padding: 0 5px;
- margin-left: -100%;
- right: 315px;
-}
-
-.columns #right {
- width: 270px;
- padding: 0 5px;
- margin-right: -330px;
-}
-
-.canvas {
- height: 91%;
-}
-
-.container-section {
- height: 90%;
- overflow-x: hidden;
- overflow-y: auto;
-}
-
-.profile-section {
- overflow-x: hidden;
- overflow-y: auto;
-}
-
-.box.ui-draggable-dragging {
- width: 274px;
- transition: none;
-}
-
-.box.selected .box-right i {
- text-shadow: none;
-}
-
-.contained {
- display: inline-block;
- overflow: hidden;
- text-overflow: ellipsis;
- position: relative;
- white-space: nowrap;
-}
-
-h2 > .contained {
- top: 5px;
-}
-
-h4 > .contained {
- top: 4px;
-}
-
-.dropdown-toggle > .contained,
-.breadcrumb-link > .contained {
- top: 2px;
- line-height: 15px;
-}
-
-/* these widths are totally arbitrary */
-.c-narrow {
- max-width: 5em;
-}
-
-.c-medium {
- max-width: 10em;
-}
-
-.c-wide {
- max-width: 15em;
-}
-
-.c-wide2 {
- max-width: 20em;
-}
-
-.c-wide3 {
- max-width: 25em;
- min-width: 10em;
-}
-
-.c-max {
- width: 100%;
-}
-
-.fabric-page-header > .profile-summary-wide {
- margin-left: 10px;
- line-height: 22px;
-}
-
-.profile-selector-name > .contained {
- top: 8px;
-}
-
-.box {
- cursor: pointer;
- height: 50px;
- overflow: hidden;
- padding: 0;
- margin: 0;
- position: relative;
- text-overflow: ellipsis;
- transition: all 0.2s ease 0s;
- white-space: nowrap;
- line-height: 22px;
- vertical-align: middle;
-}
-
-.box > .box-left,
-.box > .box-right,
-.box > .box-middle {
- display: inline-block;
- position: absolute;
- vertical-align: middle;
- top: 0;
- bottom: 0;
- padding-top: 10px;
-}
-
-.box > .box-left {
- left: 11px;
-}
-
-.box > .box-right {
- right: 11px;
-}
-
-.box > .box-middle {
- right: 60px;
-}
-
-.box > .box-left > div,
-.box > .box-right > div,
-.box > .box-middle > div {
-
-}
-
-.box > .box-left > div > div,
-.box > .box-right > div > div,
-.box > .box-middle > div > div {
- vertical-align: middle;
- display: inline-block;
- margin-left: 4px;
- margin-right: 4px;
-}
-
-
-.box > .box-left > div > div .contained,
-.box > .box-left > div > div > span,
-.box > .box-right > div > div .contained,
-.box > .box-middle > div > div .contained {
- vertical-align: middle;
-}
-
-
-.box > .box-left > .profile-select {
- display: inline-block;
- top: 9px;
- max-width: 210px;
- width: 210px;
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
-}
-
-.box input[type='checkbox'] {
- margin-top: 5px;
- display: inline;
-}
-
-.box .active-profile a.invisible {
- visibility: none;
-}
-
-.box .active-profile div {
- display: inline;
-}
-
-.box .active-profile {
- position: absolute;
- display: inline-block;
- top: 10px;
- left: 12px;
- right: 0px;
-}
-
-.box .active-profile [class^='icon-circle'] {
- top: 0;
-}
-
-.box-middle ul.inline li {
- opacity: 0.5;
- transition: opacity 0.5s;
-}
-
-.box-middle ul.inline li:hover{
- opacity: 1;
-}
-
-.section-header {
- padding: 5px 7px;
-}
-
-.selection-controls {
- display: inline-block;
-}
-
-.section-title {
- margin-left: 10px;
- display: inline-block;
-}
-
-.section-controls {
- display: inline-block;
- float: right;
-}
-
-#center .section-header .section-controls {
- position: relative;
- top: 7px;
- left: -2px;
-}
-
-.page-padded .section-header .section-controls {
- position: relative;
- top: 6px;
- left: -3px;
-}
-
-.page-padded .section-header .selection-controls {
- position: relative;
- top: 1px;
-}
-
-.section-controls > a,
-.section-controls > span > span > span > span > span > .hawtio-dropdown {
- margin-left: 12px;
- margin-right: 12px;
- cursor: pointer;
-}
-
-.section-controls > a:hover,
-.section-controls > span:hover {
- text-decoration: none;
-}
-
-.section-controls > a.nav-danger {
- color: IndianRed !important;
-}
-
-.section-controls > a.nav-danger:hover {
- text-shadow: rgba(205, 92, 92, 0.6) 0 0 20px !important;
-}
-
-.page-padded .section-header .section-filter {
- margin-top: 0px;
-}
-
-.section-filter {
- position: relative;
- display: inline-block;
- margin-left: 12px;
-}
-
-.active-profile-filter > .section-filter {
- margin-top: 5px;
-}
-
-#center > .section-header > .section-filter {
- margin-top: 0px;
-}
-
-#right > .section-header > .section-filter {
- margin-left: 8px;
-}
-
-#right > .canvas {
- height: 80%;
-}
-
-.section-filter .icon-remove {
- position: absolute;
- top: 7px;
- right: 9px;
-}
-
-.features-toolbar {
- position: relative;
- margin-bottom: 0.5em;
-}
-
-.version-section > .canvas > div > .box {
- line-height: inherit;
-}
-
-.version-section select {
- width: 100%;
- margin-top: 5px;
- margin-bottom: 5px;
-}
-
-span.remove {
- float: right;
-}
-
-span.deleting {
- text-decoration: line-through;
-}
-
-td.deleting {
- background-color: IndianRed !important;
-}
-
-td.adding {
- background-color: Aquamarine !important;
-}
-
-.no-match-filter {
- display: none;
-}
-
-.file-upload div form fieldset .input-prepend .btn {
- float: left;
-}
-
-@-moz-document url-prefix() {
- /* hack to get the add button to line up correctly in FF */
- .input-prepend .btn {
- padding-top: 5px;
- padding-bottom: 5px;
- }
-}
-
-.input-prepend .progress {
- position: relative;
- left: 1px;
- top: 0px;
- min-height: 30px;
- width: 160px;
-}
-
-.login-wrapper {
- position: absolute;
- left: 0;
- top: 350px;
- padding-top: 2px;
- padding-bottom: 2px;
- padding-left: 0;
- padding-right: 0;
- line-height: 0;
- width: 100%;
-}
-
-.login-wrapper form {
- margin-bottom: 0px;
- padding-top: 67px;
- padding-bottom: 7px;
- padding-right: 40px;
- padding-left: 40px;
-}
-
-.login-wrapper form fieldset {
- width: 413px;
-}
-
-.login-form form fieldset .control-group {
- margin-bottom: 15px;
- margin-left: 5px;
-}
-
-.login-form form fieldset .control-group button[type='submit'] {
- float: right;
-}
-
-.login-logo {
- display: block;
- position: absolute;
- letter-spacing: 5px;
- padding: 10px;
- font-size: 20px;
- left: 233px;
- top: 9px;
-}
-
-.login-logo > img {
- height: 30px;
-}
-
-/** highlight required fields which have no focus */
-input.ng-invalid,
-textarea.ng-invalid,
-select.ng-invalid {
- border-color: #e5e971;
- -webkit-box-shadow: 0 0 6px #eff898;
- -moz-box-shadow: 0 0 6px #eff898;
- box-shadow: 0 0 6px #eff898;
-}
-
-/** Use bigger and darker border on checkboxes as its hard to see since they already have a shadow */
-input[type="checkbox"].ng-invalid {
- -webkit-box-shadow: 0 0 12px #e5e971;
- -moz-box-shadow: 0 0 12px #e5e971;
- box-shadow: 0 0 12px #e5e971;
-}
-
-.container-profile-settings {
- min-width: 360px;
-}
-
-.container-settings {
- min-width: 360px;
-}
-
-.bold {
- font-weight: bold;
-}
-
-.container-settings dd .ep {
- display: inline-block;
- top: -5px;
-}
-
-.deployment-pane h3 {
- margin-top: 0px;
-}
-
-.deployment-pane ul li i {
- display: inline-block;
- white-space: nowrap;
-}
-
-.deployment-pane ul li {
- white-space: nowrap;
- padding: 7px;
-}
-
-.deployment-pane ul li editable-property {
- display: inline-block;
-}
-
-.deployment-pane ul li .ep {
- display: inline-block;
-}
-
-.container-settings dd input[type=radio] {
- display: inline-block;
-}
-
-.fabric-page-header .span4 h1,
-.fabric-page-header .span4 h2 {
- line-height: inherit;
-}
-
-.fabric-page-header h2.inline-block {
- margin-top: 0;
- margin-bottom: 0;
-}
-
-.create-container-body {
- margin-top: 10px;
-}
-
-.log-stack-trace > dd {
- margin-left: 0;
-}
-
-.log-message > dd > div {
- margin-top: 10px;
-}
-
-.log-stack-trace > dd > ul {
- margin-top: 10px;
-}
-
-.log-stack-trace > dd > ul > li {
- line-height: 12px;
-}
-
-.log-stack-trace > dd > ul > li > div.stack-line > a {
- font-weight: bold;
-}
-
-pre.stack-line {
- padding: 0;
- margin: 0;
- line-height: 14px;
-}
-
-div.stack-line {
- white-space: pre-wrap;
- word-break: break-all;
- word-wrap: break-word;
- line-height: 14px;
-}
-
-#container-create-form {
- margin-bottom: 14px;
-}
-
-#container-create-form .control-group {
- margin-bottom: 0px;
-}
-
-h1.ajaxError {
- font-size: 16px;
-}
-
-h2.ajaxError {
- font-size: 14px;
-}
-
-h3.ajaxError,
-h4.ajaxError {
- font-size: 12px;
-}
-
-.directive-example {
- padding: 10px;
- margin: 10px;
-}
-
-div#main div ul.nav li a.nav-primary.active {
- color: rgba(255, 255, 255, 0.75);
-}
-
-div#main div ul.nav li a.nav-primary {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #006dcc;
- background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
- background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
- background-image: -o-linear-gradient(top, #0088cc, #0044cc);
- background-image: linear-gradient(to bottom, #0088cc, #0044cc);
- background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
- border-color: #0044cc #0044cc #002a80;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- *background-color: #0044cc;
- /* Darken IE7 buttons by default so they stand out more given they won't have borders */
-
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-
-div#main div ul.nav li a.nav-primary:hover,
-div#main div ul.nav li a.nav-primary:active,
-div#main div ul.nav li a.nav-primary.active,
-div#main div ul.nav li a.nav-primary.disabled,
-div#main div ul.nav li a.nav-primary[disabled] {
- color: #ffffff;
- background-color: #0044cc;
- *background-color: #003bb3;
-}
-
-div#main div ul.nav li a.nav-primary:active,
-div#main div ul.nav li a.nav-primary.active {
- background-color: #003399 \9;
-}
-
-.nav.nav-tabs li a[disabled] {
- cursor: not-allowed;
- opacity: 0.3;
-}
-
-.dropdown.perspective-selector .caret:before {
- top: -7px;
-}
-
-.caret {
- border: none;
- width: 9px;
-}
-
-div#main div ul.nav li a.nav-primary .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
-}
-
-.main-nav-upper .container:before {
- display: none;
-}
-
-.main-nav-upper .container:after {
- display: none;
-}
-
-.main-nav-upper .container {
- width: auto;
- line-height: 23px;
- vertical-align: auto;
-}
-
-.main-nav-upper .icon-desktop:before {
- position:relative;
- top: 1px;
-}
-
-.main-nav-lower .container:before {
- display: none;
-}
-
-.main-nav-lower .container:after {
- display: none;
-}
-
-.main-nav-lower .container {
- width: 100%;
-}
-
-.overflow > .dropdown-toggle:not(.open) + .dropdown-menu {
- border: none;
-}
-
-.main-nav-lower .container ul.nav {
- width: 100%;
-}
-
-.navbar-inner {
- height: auto;
- min-height: 0;
-}
-
-.main-nav-upper {
- height: 28px;
- min-height: 28px;
- font-size: 11px;
-}
-
-.main-nav-upper .brand {
- font-size: 13px;
- margin-left: 0px;
- padding: 0px;
- font-weight: normal;
- margin-left: 20px;
-}
-
-.main-nav-upper .nav li a {
- padding-top: 2px;
- padding-bottom: 5px;
-}
-
-#main-nav {
- max-height: 70px;
- background-color: #F0f0f0;
- font-size: 20px;
-}
-
-dd.file-list {
- margin-left: 0;
-}
-
-.file-list-toolbar .nav .caption {
- font-weight: bold;
- padding-top: 5px;
- padding-bottom: 5px;
- padding-left: 0 !important;
-}
-
-.file-icon {
- padding: 0;
- margin: 0;
- display: inline-block;
- width: 16px;
- height: 16px;
- margin-right: 6px;
-}
-
-.file-icon i {
- width: 16px;
- height: 16px;
- font-size: 17px;
- position: relative;
- left: 2px;
- top: 2px;
-}
-
-.file-icon img {
- width: 16px;
- height: 16px;
-}
-
-.page-padded {
- padding-left: 20px;
- padding-right: 20px;
-}
-
-.fabric-page-header .span4 h2 i {
- margin-right: 13px;
-}
-
-.controller-section-widget {
- padding: 3px;
-}
-
-.container-dashboard-controls {
- position: relative;
- z-index: 10;
-}
-
-.container-dashboard-controls .pull-right .btn {
- opacity: 0.5;
- transition: opacity 1s;
-}
-
-.container-dashboard-controls .pull-right .btn:hover {
- opacity: 0.9;
-}
-
-.container-dashboard-status-table {
- position: relative;
- top: -34px;
- display: table;
- max-width: 278px;
- z-index: 9;
-}
-
-.container-status-dashboard {
- text-align: center;
- display: table-cell;
- min-width: 144px;
-}
-
-.container-status-dashboard i {
- position: relative;
- left: 0px;
- font-size: 133px;
-}
-
-.status-icon {
- display: inline-block;
- text-decoration: none;
- color: inherit;
-}
-
-.status-icon:hover {
- text-decoration: none;
-}
-
-.dashboard-service-list {
- display: table-cell;
- min-width: 139px;
- vertical-align: middle;
-}
-
-.container-dashboard-profile-controls {
- width: 100%;
- text-align: center;
- margin-bottom: 5px;
-}
-
-.no-list {
- list-style-type: none;
-}
-
-.profile-selector-item {
- display: table;
-}
-
-.profile-selector-checkbox {
- display: table-cell;
- padding-right: 5px;
-}
-
-.profile-selector-name {
- display: table-cell;
- position: relative;
- width: 100%;
-}
-
-.profile-info {
- position: absolute;
- right: 3px;
-}
-
-.profile-list ul {
- margin-left: 0;
- margin-bottom: 0;
-}
-
-.profile-list ul li .expandable .expandable-body {
- margin-left: 16px;
-}
-
-/** fabric active profiles */
-.active-profile-titles {
- position: relative;
- display: inline-block;
- width: 100%;
- height: 40px;
-}
-
-.active-profile-list .expandable {
- padding: 0;
-}
-
-.active-profile-titles.section-header {
- padding: 0;
-}
-
-.active-profile-titles div:not(.active-profile-filter) {
- display: inline-block;
- font-weight: bold;
- top: 10px;
-}
-
-.active-profile-row {
- position: relative;
- display: inline-block;
- width: 100%;
- line-height: 22px;
- height: 22px;
-}
-
-.active-profile-row div {
- display: inline-block;
-}
-
-.active-profile-list .expandable .expandable-body {
- width: 100%;
-}
-
-.active-profile-list .expandable .expandable-body ul li .box {
- background: inherit;
-}
-
-.active-profile-list .expandable .expandable-body ul li .child-container {
- margin-left: 0;
-}
-
-.active-profile-expander {
- position: absolute;
- left: 0;
-}
-
-.active-profile-requirements {
- position: absolute;
- right: 75px;
-}
-
-.active-profile-requirements-title {
- position: absolute;
- right: 75px;
-}
-
-.active-profile-create {
- position: absolute;
- right: 210px;
-}
-
-.active-profile-count {
- position: absolute;
- right: 0px;
-}
-
-.active-profile-count-title {
- padding: 5px;
- text-align: right;
- font-weight: bold;
-}
-
-.active-profile-titles .section-controls {
- position: absolute;
- top: 10px !important;
- right: 10px;
-}
-
-.active-profile-titles .section-controls a {
- font-weight: normal;
-}
-
-
-.active-profile-name {
- position: absolute;
- left: 35px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- right: 95px;
-}
-
-.active-profile-icon {
- position: absolute;
- top: 1px;
- left: 15px;
- color: green !important;
-}
-
-.active-profile-icon i {
- font-size: 17px;
-}
-
-.active-profile-filter {
- position: absolute;
- left: 0px;
- top: -10px;
-}
-
-.active-profile-main {
- min-width: 754px;
-}
-
-.active-profile-count a .icon-plus {
- position: relative;
- top: 1px;
-}
-
-.active-profile-count a:hover {
- text-decoration: none;
-}
-
-/** fabric brokers page */
-.mq-titles {
- position: relative;
- display: inline-block;
- width: 100%;
- height: 40px;
-}
-
-.mq-titles.section-header {
- padding: 0;
-}
-
-.mq-titles .section-controls {
- position: absolute;
- top: 9px !important;
- right: 0px;
-}
-
-.mq-titles .section-controls a {
- font-weight: normal;
-}
-
-.mq-profile-icon {
- color: green !important;
-}
-
-.mq-profile-list, .mq-broker-list, .mq-container-list {
- margin-left: 15px;
-}
-
-i.mq-master {
- color: orange;
-}
-
-.mq-broker-rectangle, .mq-container-rectangle {
- position: relative;
-
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
-
- margin-left: 5px;
- margin-right: 5px;
- margin-bottom: 5px;
- margin-top: 5px;
-
- border-left-width: 10px;
- border-right-width: 10px;
- border-top-width: 10px;
-
- *zoom: 1;
- padding: 4px 12px;
- margin-bottom: 0;
- font-size: 14px;
- line-height: 20px;
- *line-height: 20px;
- text-align: center;
- vertical-align: middle;
- cursor: pointer;
-}
-
-.mq-page {
- position: relative;
-}
-
-.mq-page .hero-unit {
- position: absolute;
- top: 53px;
- left: 10px;
- right: 10px;
-}
-
-.mq-groups {
- position: absolute;
- top: 42px;
- left: 19px;
- right: 10px;
-}
-
-.mq-group-rectangle:first-child {
- margin-top: 10px;
-}
-
-.mq-group-rectangle {
- position: relative;
- margin-left: 0;
- margin-right: 10px;
- margin-bottom: 10px;
- margin-top: 0;
-}
-
-.mq-group-rectangle-label .mq-group-name {
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- position: absolute;
- top: 61px;
- left: 4px;
- right: 0;
-}
-
-.mq-group-rectangle-label a {
- position: absolute;
- top: 5px;
- right: 5px;
-}
-
-.mq-group-rectangle-label {
- position: relative;
- top: 7px;
- display: inline-block;
- min-width: 150px;
- max-width: 150px;
- min-height: 150px;
-}
-
-.mq-profiles {
- position: absolute;
- min-height: 185px;
- left: 150px;
- right: 0;
- display: inline-block;
- overflow-x: auto;
-}
-
-.mq-profiles .mq-profile-canvas {
- overflow: auto;
-}
-
-.mq-profile-rectangle {
- display: inline-block;
- height: 150px;
- margin: 0;
- margin-top: 5px;
- margin-left: 10px;
- padding-left: 4px;
- padding-right: 4px;
- padding-top: 4px;
-}
-
-.mq-profile-rectangle-label {
- position: relative;
- top: 2px;
-}
-
-.mq-profile-name {
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- margin-right: 48px;
- max-width: 300px;
- display: block;
-}
-
-.mq-profile-rectangle-label .mq-profile-create-broker {
- position: absolute;
- top: 0;
- right: 0;
-}
-
-.mq-profile-canvas {
- display: inline-block;
-}
-
-.mq-broker-area {
- position: relative;
- top: 11px;
- text-align: center;
- margin-left: auto;
- margin-right: auto;
-}
-
-.mq-container-rectangle {
- margin-top: 2px;
- width: 20px;
-}
-
-.mq-container-row {
- display: block;
- margin-top: 8px;
- margin-left: auto;
- margin-right: auto;
-}
-
-.mq-broker-rectangle {
- height: 88px;
-}
-
-.mq-group-rectangle-label, .mq-profile-rectangle-label, .mq-broker-rectangle-label, .mq-container-rectangle-label {
- white-space:nowrap;
-}
-
-/** dashboard */
-.dashboard-link-row {
- width: 100%;
- position: relative;
-}
-
-a.dashboard-link {
- line-height: 15px;
- font-weight: normal;
-}
-
-a.dashboard-link:hover {
- text-decoration: none;
-}
-
-.dashboard-link {
- position: absolute;
- top: 15px;
- right: 76px;
- z-index: 500;
-}
-
-.container-list-main {
- min-width: 592px;
-}
-
-.widget-title > .row-fluid {
- position: relative;
-}
-
-.widget-title > .row-fluid > .pull-left {
- position: absolute;
- right: 16px;
- left: 0;
-}
-
-.widget-title > .row-fluid > .pull-left > .ep > div {
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
-}
-
-.container-detail-profiles {
- position: relative;
- margin-top: 2px;
-}
-
-.container-detail-profile-buttons {
- position: absolute;
- right: 0;
- z-index: 50;
-}
-
-#dialog-body div .profile-list {
- max-height: 327px;
- overflow-y: auto;
-}
-
-@media (max-width: 979px) {
- .navbar-fixed-top .navbar-inner, .navbar-fixed-bottom .navbar-inner {
- padding: 0;
- }
-
- .navbar-fixed-top, .navbar-fixed-bottom {
- position: fixed;
- }
-
-}
-
-.header-list li {
- vertical-align: top;
- height: 30px;
-}
-
-.header-list li div {
- height: 30px;
-}
-
-.provision-list {
- margin-left: 0px;
-}
-
-.provision-list ul {
- margin-left: 0px;
-}
-
-.provision-list ul li {
- list-style-type: none;
- padding: 7px;
-}
-
-ul.zebra-list {
- margin-left: 0;
-}
-
-.zebra-list li {
- padding: 7px;
-}
-
-ul.zebra-list > li {
- list-style-type: none;
-}
-
-ol.zebra-list {
- counter-reset:li;
- margin-left: 0;
- padding-left: 0;
-}
-
-ol.zebra-list > li {
- position: relative;
- list-style-type: none;
-}
-
-ol.zebra-list > li:before {
- content: counter(li);
- counter-increment: li;
- padding: 7px;
- font-weight: bold;
-}
-
-.pointer {
- cursor: pointer;
-}
-
-.container-profile-settings span.folder-title {
- font-weight: bold;
-}
-li.profile-selector-folder span.folder-title:hover, li.profile div.profile-selector-name>span>span:hover {
- color: #005580;
-}
-.widget-body div div .wiki-fixed {
- margin: 3px;
-}
-
-
-.loading {
- position: relative;
- top: 140px;
-}
-.loading p {
- margin-top: 20px;
- font-weight: bold;
- font-size: 20px;
-}
-
-.add-link {
- position: absolute;
- right: 20px;
- top: 130px;
- width: 22px;
- height: 19px;
- text-align: center;
-}
-
-.log-table > li {
- position: relative;
- list-style-type: none;
- min-height: 32px;
- max-width: 100%;
- padding: 0;
-}
-
-.log-table .table-head div div {
- font-weight: bold;
- text-align: center !important;
- direction: ltr !important;
-}
-
-.log-table .table-head div div:nth-child(4) {
- font-weight: bold;
- left: 247px;
- width: 326px;
- text-align: center !important;
- direction: ltr !important;
-}
-
-.log-table > li > div > div {
- position: absolute;
- display: inline-block;
- white-space: nowrap;
- text-overflow: ellipsis;
- font-size: 12px;
- min-height: 28px;
- overflow-x: hidden;
- padding: 3px;
- padding-top: 6px;
- width: auto;
-}
-
-.log-table {
- margin: 0;
-}
-
-.log-table > .table-row {
- cursor: pointer;
-}
-
-.log-table > .table-row.selected:before {
- z-index: 39;
- position: absolute;
- top: 6px;
- font-family: FontAwesome;
- content: "\f054";
- font-size: 20px;
- color: green;
-}
-
-.log-table > li > div > div:nth-child(1):not(.stack-line) {
- left: 0;
- width: 11px;
- z-index: 5;
-}
-
-.log-table > li > div > div:nth-child(2) {
- left: 18px;
- width: 180px;
- z-index: 5;
-}
-
-.log-table > li > div > div:nth-child(3) {
- left: 190px;
- width: 60px;
- z-index: 5;
- text-align: center;
-}
-
-.log-table > li > div > div:nth-child(4) {
- padding-right: 5px;
- text-align: right;
- direction: rtl;
- z-index: 3;
- left: 0;
- width: 573px;
-}
-
-.log-table > li > div > div:nth-child(5) {
- left: 580px;
- right: 0;
- padding-left: 5px;
-}
-
-.log-table > li > div > div:nth-child(6) {
- position: static;
- margin-top: 43px;
- white-space: normal;
- display: block;
-}
-
-.log-info-panel {
- z-index: 60;
- position: fixed;
- right: 7em;
- top: 150px;
- bottom: 5em;
- padding: 0;
- overflow: hidden;
- min-height: 500px;
- min-width: 800px;
-}
-
-@media(max-width: 1085px) {
- .log-info-panel {
- left: 5px;
- right: 5px;
- max-width: inherit;
- min-width: 500px;
- }
-}
-
-.log-info-panel >.log-info-panel-frame {
- position: relative;
- height: 100%;
- width: 100%;
- margin: 10px;
-}
-
-.log-info-panel > .log-info-panel-frame > .log-info-panel-header {
- position: absolute;
- top: 0;
- height: 80px;
- left: 5px;
- right: 50px;
- white-space: nowrap;
-}
-
-.log-info-panel-header > span {
- margin-left: 7px;
- position: relative;
- top: 2px;
- overflow: hidden;
-}
-
-.log-info-panel-frame > .log-info-panel-body {
- position: absolute;
- overflow: auto;
- left: 5px;
- right: 27px;
- top: 80px;
- bottom: 15px;
- padding-top: 10px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-.log-info-panel-body > .row-fluid {
- margin-bottom: 10px;
-}
-
-.log-info-panel > .log-info-panel-frame > .log-info-panel-body > .row-fluid > span {
- margin-right: 7px;
- white-space: nowrap;
-}
-
-.log-table-dashboard {
- position: absolute;
- bottom: 0;
- left: 0;
- right: 0;
-}
-
-.ex-node-container {
- position: relative;
- width: 100%;
- height: 696px;
-}
-
-.ex-node {
- position: absolute;
- width: 150px;
- height: 90px;
- text-align: center;
- padding-top: 60px;
-}
-
-.dozer-mapping-node {
- display: block;
- margin-top: 10px;
- margin-bottom: 10px;
- padding: 20px;
-}
-
-.dozer-mappings li {
- list-style-type: none;
-}
-
-.dozer-mappings ul {
- margin-left: 50px;
-}
-
-.dozer-mappings span {
- width: 500px;
-}
-
-.wiki-file-list-up:hover {
- text-decoration: none;
-
-}
-
-.fabric-page-header.features {
- margin-top: 10px;
-}
-
-.fabric-page-header > * {
- line-height: 38px;
-}
-
-.profile-selector-name a:hover {
- text-decoration: none;
-}
-
-.file-name:hover {
- text-decoration: none;
-}
-
-i.expandable-indicator.folder {
- font-size: 17px;
-}
-
-.switches li {
- width: 215px;
-}
-
-.switch-light.switch-ios {
- width: 100px;
-}
-
-.switch-container {
- position: static;
- padding-top: 5px;
- width: 215px;
- height: 45px;
-}
-
-[class^="dynatree-folder icon-"], [class*=" dynatree-folder icon-"] {
-
-}
-
-[class^="dynatree-folder icon-"]:before, [class*=" dynatree-folder icon-"]:before {
- font-size: 17px;
- margin-left: 18px;
-}
-
-
-[class^="dynatree-folder icon-"], [class*=" dynatree-folder icon-"] .dynatree-connector {
- display: none;
-}
-
-[class^="dynatree-folder icon-"], [class*=" dynatree-folder icon-"] .dynatree-icon {
- display: none;
-}
-
-.main-nav-lower .container ul .dropdown.overflow {
- margin-right: 25px;
-}
-
-.dropdown-menu.right {
- left: auto;
- right: 0;
-}
-
-.dropdown-menu.right:before {
- left:auto !important;
- right: 9px;
-}
-
-.dropdown-menu.right:after {
- left:auto !important;
- right: 10px;
-}
-
-@media(max-width: 1134px) {
- .profile-details > [class^="span"] {
- width: 100%;
- float: inherit;
- display: block;
- margin-left: 2px;
- margin-right: 2px;
- }
-}
-
-/* Start 800x600 Optimzations */
-@media(max-width: 849px) {
-
- .page-padded {
- padding-left: 5px;
- padding-right: 5px;
- }
-
- .wiki-fixed {
- margin-left: 0 !important;
- margin-right: 0 !important;
- }
-
- .wiki-fixed .row-fluid .span9 {
- margin-left: 9px;
- }
-
- .container-details > [class*=" offset"] {
- display: none;
- }
-
- .container-details > .span4.offset1 {
- width: 100%;
- float: inherit;
- display: block;
- margin-left: 2px;
- margin-right: 2px;
- }
-
- .container-details > .span5.offset1 {
- width: 100%;
- float: inherit;
- display: block;
- margin-left: 2px;
- margin-right: 2px;
- }
-
- .create-container-body > [class^="span"] {
- width: 100%;
- float: inherit;
- display: block;
- margin-left: 2px;
- margin-right: 2px;
- }
-
- .create-container-body > [class^="span"]:first-child {
- margin-bottom: 15px;
- }
-
- .features-toolbar .pull-left {
- margin-bottom: 10px;
- }
-
- .edit-feature-lists > [class^="span"] {
- width: 49%;
- float: inherit;
- display: inline-block;
- margin-left: 0;
- margin-right: 0;
- }
-
-}
-/* End 800x600 optimizations */
-
-/*
- * jquery.tocify.css 1.8.0
- * Author: @gregfranko
- */
-/* The Table of Contents container element */
-.tocify {
- /* top works for the wiki, may need customization
- elsewhere */
- top: 120px;
- width: 232px;
- padding-left: 1em;
- padding-right: 1em;
- overflow-y: auto;
- overflow-x: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- position: fixed;
- bottom: 5px;
- z-index: 20;
-}
-
-.tocify h2,
-.tocify h3 {
- white-space: normal;
-}
-
-.toc-container {
- position: relative;
- width: 100%;
-}
-
-.toc-content {
- position: absolute;
- left: 290px;
- right: 0;
-}
-
-.tocify ul {
- margin-left: 0px;
-}
-
-.tocify li {
- list-style-type: none;
- display: block;
-}
-
-.tocify li a {
- display: block;
- padding: 3px;
- transition: background,border .25s ease-in-out;
-}
-
-.tocify li a:hover {
- text-decoration: none;
-}
-
-.tocify li a.active {
- font-weight: bolder;
-}
-
-/* Makes the font smaller for all subheader elements. */
-.tocify-subheader li {
- font-size: 12px;
-}
-
-/* Further indents second level subheader elements. */
-.tocify-subheader .tocify-subheader {
- text-indent: 30px;
-}
-
-/* Further indents third level subheader elements. You can continue this pattern if you have more nested elements. */
-.tocify-subheader .tocify-subheader .tocify-subheader {
- text-indent: 40px;
-}
-
-@media(max-width: 700px) {
- .tocify {
- position: static;
- width: auto;
- margin-bottom: 1em;
- }
-
- .toc-content {
- position: static;
- left: auto;
- }
-}
-
-fs-donut svg g text.value {
- font-size: 40px;
-}
-
-fs-donut svg g text.units {
- font-size: 20px;
-}
-
-.health-displays {
- width: 100%;
-}
-
-.panel {
- position: fixed;
-}
-
-.panel.bottom {
- bottom: 0;
-}
-
-.deploy {
- right: 0;
-}
-
-.profile-list-item:after {
- content: ", ";
-}
-
-.profile-list-item:last-child:after {
- content: " ";
-}
-
-.health-displays .health-display,
-.column-box,
-.column-box-variable,
-.column-box-square,
-.column-box-half-screen {
- position: relative;
- display: inline-block;
- width: 300px;
- height: 300px;
- margin-left: 0;
- margin-right: 0;
- margin-bottom: 10px;
- overflow: hidden;
- vertical-align: top;
-}
-
-.column-box {
- height: auto;
- min-height: 175px;
- width: 500px;
-}
-
-.wiki-icon-view {
- min-height: 200px;
-}
-
-.wiki-icon-view .column-box {
- min-height: 0;
- margin-bottom: 25px;
-}
-
-.column-box-half-screen {
- width: 50%;
- min-width: auto;
- height: auto;
-}
-
-.column-box-square {
- height: 32px;
- width: 32px;
- line-height: 28px;
- vertical-align: middle;
- text-align: center;
-}
-
-.column-box-variable {
- height: auto;
- min-height: 175px;
- width: auto;
- min-width: 175px;
- max-width: 500px;
-}
-
-.column-box-variable > h3 {
- margin-bottom: 0;
-}
-
-.column-box .file-icon > * {
- width: 100%;
- height: auto;
-}
-
-.location-box {
- margin: 12px;
-}
-
-.column-box-square > i {
- font-size: 24px;
- height: 24px;
- vertical-align: middle;
-}
-
-.container-groups .column-box {
- height: 125px;
- width: auto;
-}
-
-.container-header-version,
-.container-header-version + hr {
- margin-bottom: 0;
-}
-
-.container-header-version + hr {
- margin-top: 0;
-}
-
-.container-groups .container-group-header {
- border-bottom: none;
-}
-
-.column-row {
- float: left;
-}
-
-.column-box-selected .column-box-header {
- font-size: 150%;
- font-weight: bold;
-}
-
-.column-box-icons > .span1 {
- text-align: center;
- vertical-align: middle;
- width: 32px;
-}
-
-.column-box-icons i,
-.column-box-icons img {
- font-size: 32px;
- width: 32px;
-}
-
-.ok-container > i {
- font-size: 32px;
- color: #a4a4a4;
-}
-
-.column-box > div {
- position: relative;
- height: 100%;
- margin: 10px;
-}
-
-.column-box h3 {
- text-overflow: ellipsis;
- line-height: normal;
- margin-bottom: 0;
-}
-
-.bottom-anchored {
- position: absolute;
- bottom: 0;
- margin-top: -3em;
-}
-
-.label-list > li > .badge {
- margin-top: 3px;
- margin-bottom: 3px;
-}
-
-.label-list > .inline-block > .badge {
- margin-left: 3px;
- margin-right: 3px;
-}
-
-.health-details {
- top: 0;
- bottom: 0;
- z-index: 40;
-}
-
-.health-status {
- padding: 0;
- position: absolute;
- bottom: 0;
- overflow: hidden;
- left: 0;
- right: 0;
- z-index: 20;
-}
-
-.health-message-wrap {
- margin: 0;
- padding: 0;
- width: 100%;
- height: 100%;
-}
-
-.health-message {
- display: block;
- margin: 10px;
-}
-
-.health-details-toggle {
- position: absolute;
- display: inline-block;
- width: 16px;
- height: 16px;
- right: 2px;
- top: 0px;
-}
-
-.health-details-wrap {
- width: 300px;
- height: 300px;
- overflow-y: auto;
- overflow-x: hidden;
-}
-
-.health-details-wrap a {
- color: #d4d4d4;
-}
-
-.health-details-wrap dl {
- margin-top: 5px;
- margin-bottom: 2px;
- margin-left: 0;
-}
-
-.health-details-wrap table {
- max-width: 300px;
-}
-
-.health-details-wrap table tr td {
- vertical-align: middle;
-}
-
-.health-details-wrap table tr td:first-child {
- font-weight: bold;
- text-align: right;
- padding-right: 5px;
-}
-
-.health-details-wrap table tr td:last-child {
- padding-left: 5px;
- overflow-x: hidden;
- text-overflow: ellipsis;
-}
-
-.health-display-title {
- padding-top: 18px;
- font-size: 30px;
- width: 100%;
- height: 40px;
- margin-top: 10px;
- margin-bottom: 10px;
- font-weight: bold;
- text-align: center;
-}
-
-.health-display-title.ok {
- background-color: lightgreen;
-}
-
-.health-display-title.warning {
- background-color: darkorange;
-}
-
-.health-displays .health-display .health-chart {
- width: 300px;
- height: 300px;
-}
-
-.create-column {
- vertical-align: top;
- display: inline-block;
- width: 445px;
- margin-bottom: 10px;
-}
-
-#create-form {
- max-width: 422px;
-}
-
-/* hack to work around strange tabset behavior */
-tabset > .tabbable > ul {
-/* display: none; */
-}
-/* end hack */
-
-tabset > .tabbable > .tab-content > .nav.nav-tabs > li {
- cursor: pointer;
-}
-
-tabset > .tabbable > .tab-content > .nav.nav-tabs > li.active {
- cursor: pointer;
-}
-
-tabset > .tabbable > .tab-content > .nav.nav-tabs > li.disabled {
- opacity: 0.3;
-}
-
-.toast.toast-warning * {
- color: black;
-}
-
-.hawtio-toc .panel-title {
- padding: 0;
- margin-top: 20px;
- margin-bottom: 20px;
-}
-
-.hawtio-toc .panel-title a {
- display: block;
- text-align: center;
- padding: 10px;
-}
-
-._jsPlumb_endpoint {
- z-index: 25;
-}
-
-.panes {
- position: relative;
- display: block;
- min-height: 100%;
-}
-
-.panes > .left-pane {
- position: absolute;
- left: 0;
- right: 285px;
- height: 100%;
-}
-
-.panes > .right-pane {
- position: absolute;
- right: 0;
- width: 275px;
- height: 100%;
-}
-
-.camel-viewport {
- overflow: auto;
- height: 100%;
-}
-
-.camel-canvas-endpoint svg circle {
- fill: #346789;
-}
-
-.camel-props {
- position: relative;
- height: 100%;
-}
-
-.camel-props > .button-bar {
- left: 0;
- right: 0;
- display: block;
- position: absolute;
-}
-
-.button-bar > .centered > form {
- margin-bottom: 10px;
-}
-
-.camel-props > .prop-viewport {
- overflow-y: auto;
- overflow-x: visible;
- position: absolute;
- bottom: 0;
- top: 80px;
- width: 100%;
-}
-
-.camel-props form > fieldset > legend {
- font-size: medium;
- font-weight: bold;
- margin: 0;
- line-height: 12px;
- padding: 3px;
-}
-
-.endpoint-control > label {
- font-size: medium;
- font-weight: bold;
- margin: 0;
- line-height: 12px;
- padding: 3px;
-}
-
-.endpoint-props > p {
- font-size: medium;
- font-weight: bold;
- margin: 0;
- margin-bottom: 25px;
- line-height: 12px;
- padding: 3px;
-}
-
-.endpoint-control > .controls {
- margin-top: 15px;
-}
-
-.camel-props form fieldset .control-label {
- float: none;
- width: auto;
- text-align: left;
-}
-
-.camel-props form fieldset .controls {
- margin-left: auto;
-}
-
-.camel-props form fieldset .controls .input-xxlarge {
- width: auto;
- margin-left: auto;
- margin-right: auto;
-}
-
-.camel-props form fieldset div[hawtio-form-array] > div > div > div > .controls.pull-right {
- float: none;
-}
-
-.welcome {
- margin-left: 5em;
- margin-right: 5em;
-}
-
-input.ng-invalid-pattern {
- border-color: #e9322d;
- -webkit-box-shadow: 0 0 6px #f8b9b7;
- -moz-box-shadow: 0 0 6px #f8b9b7;
- box-shadow: 0 0 6px #f8b9b7;
-}
-
-input.ng-invalid-pattern:focus {
- border-color: #e9322d;
- -webkit-box-shadow: 0 0 6px #f8b9b7;
- -moz-box-shadow: 0 0 6px #f8b9b7;
- box-shadow: 0 0 6px #f8b9b7;
-}
-
-.threads.logbar > .logbar-container {
- margin-top: 2px;
- margin-bottom: 5px;
-}
-
-.state-panel > ul > li:not(:first-child) > span {
- margin-left: 15px;
-}
-
-.state-panel > ul > li.active {
- font-weight: bold;
-}
-
-.runnable {
- color: green;
-}
-
-.timed-waiting {
- color: orange;
-}
-
-.waiting,
-.darkgray {
- color: darkgray;
-}
-
-.blocked {
- color: red;
-}
-
-strong.new,
-.lightgreen {
- color: lightgreen;
-}
-
-.terminated,
-.darkred {
- color: darkred;
-}
-
-.thread-state-indicator {
- width: 100%;
- height: 100%;
- padding-top: 5px;
-}
-
-.monitor-indicator {
- font-size: 10px;
- padding: 4px;
- margin: 5px;
-}
-
-.monitor-indicator.button {
- cursor: pointer;
-}
-
-.monitor-indicator.true {
- background: #1cd11d;
- box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5), 0px 0px 4px 1px rgba(34, 203, 1, 0.49);
-}
-
-.monitor-indicator.false {
- background: #737373;
- box-shadow: inset 0px 1px 0px 0px rgba(250, 250, 250, 0.5);
-}
-
-.table-header {
- color: black;
- position: relative;
-}
-
-.table-header > .indicator:after {
- font-family: 'FontAwesome';
- position: absolute;
- right: 5px;
-}
-
-.table-header.asc > .indicator:after {
- content: "\f077";
-}
-
-.table-header.desc > .indicator:after {
- content: "\f078";
-}
-
-.camel-tree > ul.nav {
- margin-bottom: 3px !important;
-}
-
-.camel-tree > .section-filter {
- margin: 0 0 8px;
- display: block;
-}
-
-.table > thead > tr > th {
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-
-th > .indicator:before {
- display: inline-block;
- content: "\00a0";
- margin-left: 12px;
-}
-
-.simple-table-checkbox,
-.simple-table-checkbox > input {
- vertical-align: middle;
- margin: 0;
- width: 16px;
- line-height: 16px;
- max-width: 16px;
-}
-
-
-.table td,
-.table th {
- vertical-align: middle;
-}
-
-.ngCellText .icon-replication-controller {
- width: 32px;
-}
-
-.repository-browser-toolbar > .btn {
- margin-bottom: 10px;
-}
-
-.bundle-list-toolbar {
- vertical-align: top;
-}
-
-.bundle-list-toolbar > .pull-left > *,
-.bundle-list-toolbar > .pull-right > * {
- display: inline-block;
-}
-
-.bundle-list-toolbar > div > input,
-.bundle-list-toolbar > div > div > input {
- margin-bottom: 10px;
-}
-
-.bundle-list-toolbar > div > label,
-.bundle-list-toolbar > div > strong {
- position: relative;
- top: -3px;
-}
-
-.bundle-list-toolbar > div > .input-append {
- position: relative;
- left: 3px;
- top: -9px;
-}
-
-.connect-column {
- display: inline-block;
- vertical-align: top;
- width: 34em;
-}
-
-.icon-spacer:before {
- content: '\00a0';
- width: 11px;
-}
-
-.dropdown-menu {
- padding-top: 0;
- padding-bottom: 0;
- margin-top: 0;
- top: 100%;
- left: 0;
- right: 0;
- border-radius: 0;
-}
-
-.main-nav-upper .dropdown-menu {
- border-top: none;
- margin-top: -1;
- border-radius: 0;
-}
-
-.main-nav-lower .dropdown-menu {
- border-top: none;
-}
-
-.dropdown-menu > li > a {
- cursor: pointer;
- padding-left: 15px;
- padding-right: 15px;
-}
-
-.dropdown.perspective-selector > .dropdown-menu {
- min-width: 160px;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-
-.dropdown.perspective-selector .dropdown-menu > div {
- display: block;
-}
-
-.dropdown.perspective-selector .dropdown-menu > div > p,
-.hawtio-dropdown p {
- font-size: smaller;
- padding-left: 3px;
- padding-right: 3px;
- margin-bottom: 0;
-}
-
-.nav .hawtio-dropdown {
- margin-top: 2px;
-}
-
-.dropdown.perspective-selector .dropdown-menu > div > ul {
- margin-top: 0;
-}
-
-.dropdown.perspective-selector .dropdown-menu > div > ul > li.clear-recent > a {
- padding: 3px 5px;
-}
-
-.dropdown-menu > li:hover > a {
- text-shadow:0px 0px 1px white;
-}
-
-.dropdown-menu:before {
- display: none !important;
-}
-
-.dropdown-menu:after {
- display: none !important;
-}
-
-.nav.nav-tabs li .hawtio-dropdown .dropdown-menu {
- margin-top: 4px;
- border-top: none;
-}
-
-span.hawtio-dropdown {
- position: relative;
- display: block;
- cursor: pointer;
-}
-
-span.hawtio-dropdown .dropdown-menu {
- width: auto;
-}
-
-.btn .hawtio-dropdown > .caret {
- width: 7px;
-}
-
-.btn .hawtio-dropdown > .dropdown-menu {
- left: -10px;
- margin-top: 5px;
- text-align: left;
-}
-
-.submenu-caret {
- display: inline-block;
- width: 0;
- height: 0;
-}
-
-.submenu-caret:before {
- font-family: 'FontAwesome';
- border: 0;
- content: "\f054";
- font-size: 11px;
- display: block;
-}
-
-.hawtio-dropdown > ul > li {
- padding: 3px;
- padding-left: 5px;
-}
-
-.hawtio-dropdown > ul > li > .menu-item {
- position: relative;
- display: block;
-}
-
-.hawtio-dropdown > .submenu-caret:before,
-.hawtio-dropdown > ul > li > .menu-item > .submenu-caret:before {
- position: absolute;
- top: 0;
- right: -2px;
-}
-
-.dropdown-menu .sub-menu {
- position: absolute;
- left: 195px;
- top: -8px;
-}
-
-.hawtio-breadcrumb > li {
- display: inline-block;
-}
-
-.dropdown-menu .dropdown .caret {
- display: none;
-}
-
-.hawtio-breadcrumb .caret {
- border: 0;
- width: 17px;
- margin-right: 2px;
- margin-left: 0;
-}
-
-.hawtio-breadcrumb .caret:before {
- font-family: 'FontAwesome';
- content: "\F105";
- font-size: 40px;
- top: -9px;
-}
-/*
-.modal {
- z-index: 5000;
- width: 660px;
- margin: -250px 0 0 -320px;
-}
-.modal-backdrop {
- z-index: 4090;
-}
-*/
-.scrollable-section {
- overflow-x: hidden;
- overflow-y: auto;
- max-height: 260px;
-}
-
-.component {
- opacity: 0.8;
- filter: alpha(opacity = 80);
-}
-
-.window,
-.node > rect {
- stroke-width: 2px;
- stroke: #346789;
- fill: url(#rect-gradient);
- border: 2px solid #346789;
- z-index: 20;
- position: absolute;
- font-size: 0.8em;
- filter: alpha(opacity = 80);
- cursor: move;
-
- box-shadow: 2px 2px 19px #e0e0e0;
- -o-box-shadow: 2px 2px 19px #e0e0e0;
- -webkit-box-shadow: 2px 2px 19px #e0e0e0;
- -moz-box-shadow: 2px 2px 19px #e0e0e0;
- -moz-border-radius: 4px;
- border-radius: 4px;
- background-color: lightgrey;
- fill: lightgrey;
-}
-
-.window,
-.node.selected > rect {
- stroke-width: 2px;
- stroke-dasharray: 10,5;
- stroke: red;
-}
-
-.window-inner {
- position: relative;
- border-radius: 2px;
-}
-
-.window-inner {
- padding: 6px;
-}
-
-.window-inner.from,
-.node > .from {
- background-color: lightsteelblue;
- fill: lightsteelblue;
-}
-
-.window-inner.choice,
-.node > .choice {
- background-color: lightblue;
- fill: lightblue;
-}
-
-.window-inner.when,
-.node > .when {
- background-color: lightgreen;
- fill: lightgreen;
-}
-
-.window-inner.otherwise,
-.node > .otherwise {
- background-color: lightgreen;
- fill: lightgreen;
-}
-
-.window-inner.to,
-.node > .to {
- background-color: lightsteelblue;
- fill: lightsteelblue;
-}
-
-.window-inner.log,
-.node > .log {
- background-color: lightcyan;
- fill: lightcyan;
-}
-
-.window-inner.setBody,
-.node > .setBody {
- background-color: #d3d3d3;
- fill: #d3d3d3;
-}
-
-.window-inner.onException,
-.node > .onException {
- background-color: lightpink;
- fill: lightpink;
-}
-
-.window-inner.delay,
-.node > .delay {
- background-color: lightgrey;
- fill: lightgrey;
-}
-
-.window-inner.bean,
-.node > .bean {
- background-color: mediumaquamarine;
- fill: mediumaquamarine;
-}
-
-.window-inner > * {
- vertical-align: middle;
-}
-
-.window-inner > span {
- max-width: 15em;
- display: inline-block;
- white-space: nowrap;
- text-overflow: ellipsis;
- overflow: hidden;
-}
-
-.window:hover {
- border-color: #5d94a6;
- background-color: #ffffa0;
-}
-
-.window:hover > .window-inner {
- background: inherit;
-}
-
-.window.selected {
- background-color: #f0f0a0;
-}
-
-.window.selected > .window-inner {
- background: inherit;
-}
-
-img.nodeIcon {
- width: 24px !important;
- height: 24px !important;
- cursor: crosshair;
- margin-right: 10px;
-}
-
-img.nodeIcon:hover {
- opacity: 0.6;
- box-shadow: 2px 2px 19px #a0a0a0;
- background-color: #a0a0a0;
-}
-
-.l1 {
- font-size: 13px;
-}
-
-._jsPlumb_connector {
- z-index: 4;
-}
-
-._jsPlumb_overlay {
- z-index: 6;
-}
-
-.hl {
- border: 3px solid red;
-}
-
-.strong {
- font-weight: bold;
-}
-
-.discovery > li {
- position: relative;
-}
-
-.discovery > li > div {
- vertical-align: middle;
-}
-
-.discovery > li > div:first-child {
- margin-right: 10px;
-}
-
-.discovery > li > div:last-child,
-.discovery > li > .lock {
- position: absolute;
- width: 32px;
- height: 32px;
- margin: auto;
- top: 0;
- bottom: 0;
- right: 10px;
-}
-
-.discovery > li > .lock {
- right: 42px;
-}
-
-.discovery > li > div:last-child > div.connect-button {
- width: 32px;
- height: 32px;
-}
-
-.discovery > li > div:last-child > div > i,
-.discovery > li > .lock > i {
- font-size: 32px;
- cursor: pointer;
-}
-
-.discovery > li > .lock > i {
- cursor: inherit;
-}
-
-.discovery > li > div:first-child > img {
- vertical-align: middle;
- width: 64px;
- max-height: 64px;
-}
-
-.auth-form {
- white-space: nowrap;
-}
-
-.auth-form > form > input {
- margin-bottom: 0;
-}
-
-.slideout-body .btn-group,
-.btn-group[hawtio-pager] {
- line-height: normal;
-}
-
-@media print {
- #main-nav,
- #log-panel {
- display: none !important;
- height: 0 !important;
- }
-
- .wiki-grid {
- display: none;
- }
-
- .wiki-fixed {
- margin-top: 0 !important;
- }
-
- .wiki-fixed > .row-fluid > .span3 {
- display: none;
- }
-
- .wiki-fixed > .row-fluid > .span9 {
- width: 100%;
- }
-
- .instance-name {
- display: none !important;
- }
-
- .logbar-container > .nav {
- display: none !important;
- height: 0 !important;
- }
-
-}
-
-.prefs {
- height: 100%;
- margin: 0;
-}
-
-.prefs > div {
- height: 100%;
- margin: 0;
-}
-
-.slideout-body .prefs {
- overflow: hidden;
- margin: 0;
-}
-
-.slideout-body .prefs .tabbable {
- position: relative;
- height: 100%;
- margin: 0;
-}
-
-.pref-slideout > div > div > div {
- height: 100%;
- margin: 0;
-}
-
-.pref-slideout .slideout-body {
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0px;
- right: 0;
- overflow: none !important;
- margin: 0 !important;
-}
-
-.slideout-body .prefs .nav.nav-tabs {
- top: 5px;
- bottom: 5px;
- left: 0;
- width: 130px;
- position: absolute;
- margin: 0;
- overflow-y: auto;
-}
-
-.slideout-body .prefs .nav.nav-tabs:after,
-.slideout-body .prefs .nav.nav-tabs:before {
- display: none;
-}
-
-.slideout-body .prefs .nav.nav-tabs li {
- display: block;
- float: none;
-}
-
-.slideout-body .prefs .tab-content {
- position: absolute;
- overflow: auto;
- top: 5px;
- left: 140px;
- right: 15px;
- bottom: 5px;
- margin: 0;
-}
-
-.help-header .without-text,
-.about-header .without-text {
- position: relative;
- top: -4px;
- vertical-align: middle;
- height: 48px;
-}
-
-.help-header .with-text,
-.about-header .with-text {
- position: relative;
- top: -4px;
- vertical-align: middle;
- height: 48px;
-}
-
-.service-list > li {
- list-style-type: none;
- display: inline-block;
- margin-left: 3px;
- margin-right: 3px;
- vertical-align: middle;
-}
-
-.container-type {
- width: 16px;
-}
-
-.container-status > i:before,
-.container-type i:before,
-.container-type img {
- vertical-align: middle;
- font-size: 16px;
- height: 16px;
- width: auto;
- line-height: 16px;
-}
-
-.container-type img.girthy {
- height: auto;
- width: 16px;
-}
-
-.app-logo {
- width: 64px;
- margin-right: 10px;
-}
-
-.app-logo img,
-.app-logo i {
- vertical-align: middle;
- font-size: 64px;
- height: 64px;
- width: auto;
- line-height: 64px;
-}
-
-.app-logo img.girthy {
- height: auto;
- width: 64px;
-}
-
-.service-list i:before,
-.service-list img {
- height: 16px;
- width: auto;
- font-size: 16px;
- vertical-align: middle;
-}
-
-.service-list img.girthy {
- height: auto;
- width: 16px;
-}
-
-.perspective-selector img {
- width: auto;
- height: 16px;
- vertical-align: top;
-}
-
-.operation-row {
- position: relative;
- height: 30px;
- vertical-align: middle;
-}
-
-.operation-row.can-invoke {
- cursor: pointer;
-}
-
-.operation-row.cant-invoke {
- cursor: not-allowed;
-}
-
-.operation-row > * {
- display: inline-block;
- height: 100%;
- line-height: 30px;
-}
-
-.operation-actions {
- position: absolute;
- right: 6px;
- top: 4px;
-}
-
-.help-block:empty {
- margin-top: 10px;
-}
-
-ul.dynatree-container {
- overflow: visible;
-}
-
-.pane {
- position: absolute;
- bottom: 0;
- top: 70px;
- height: auto;
- width: 300px;
-}
-
-.pane > .pane-wrapper {
- position: relative;
- height: 100%;
- width: 100%;
- overflow: hidden;
-}
-
-.pane-viewport {
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- overflow: auto;
- margin-right: 10px;
-}
-
-.pane-content {
- width: auto;
- height: auto;
-}
-
-.pane-bar {
- position: absolute;
- top: 0;
- right: 0;
- width: 5px;
- cursor: ew-resize;
- height: 100%;
-}
-
-.pane-content {
- float: none;
- position: static;
-}
-
-.pane.left {
- /*left: 0; */
- z-index: 39;
-}
-
-.pane.left .pane-viewport {
- margin-left: 10px;
- right: 5px;
- margin-right: 0;
-}
-
-.pane.left .pane-bar {
- right: 0;
-}
-
-.pane.right {
- right: 0;
-}
-
-.pane.right .pane-viewport {
- margin-left: 10px;
- margin-right: 5px;
- right: 5px;
-}
-
-.pane.right .pane-bar {
- left: 0;
-}
-
-.pane-header-wrapper {
- margin-left: 10px;
- margin-right: 10px;
-}
-
-.tree-header {
- position: relative;
- height: 26px;
-}
-
-.fabric-app-view-header {
- height: auto;
-}
-
-.fabric-app-view-header > * {
- line-height: 12px;
-}
-
-.fabric-app-view-header .alert {
- margin-bottom: 0;
-}
-
-.fabric-app-view-header .row-fluid:last-child {
- padding-bottom: 8px;
-}
-
-.tree-header > .left,
-.tree-header > .right {
- position: absolute;
- top: 3px;
- bottom: 6px;
- vertical-align: middle;
- line-height: 10px;
-}
-
-.tree-header > .left {
- left: 0;
-}
-
-.tree-header > .right {
- right: 10px;
-}
-
-.camel.tree-header {
- height: 42px;
-}
-
-.camel.tree-header > .left {
- right: 94px;
-}
-
-.camel.tree-header > .left,
-.camel.tree-header > .right {
- top: 6px;
- line-height: 30px;
-}
-
-
-.camel.tree-header > .left > .section-filter {
- width: 100%;
-}
-
-.camel.tree-header > .left > .section-filter > .search-query {
- width: 100%;
- margin-bottom: 10px;
-}
-
-.camel.tree-header > .left > .section-filter > .icon-remove {
- right: -16px;
-}
-
-.attributes-wrapper {
- width: 100%;
- overflow: auto;
-}
-
-.separator {
- padding-top: 4px;
- display: inline-block;
-}
-
-.grid-block,
-.health-display {
- border: 1px solid #00f;
-}
-
-.widget-title {
- border-bottom: 1px solid #00f;
-}
-
-.container-group-header {
- vertical-align: middle;
- line-height: 18px;
- font-weight: bold;
- padding: 4px;
- margin-top: 10px;
-}
-
-.search-query.has-text {
- background: #55ddff;
- color: #333333;
-}
-
-.dataTables_filter input {
- border-radius: 15px
-}
-
-.config-admin-form .form-horizontal .control-label {
- width: 260px;
-}
-.config-admin-form .form-horizontal .controls {
- margin-left: 280px;
-}
-
-.new-config-name-form {
- margin-top: 30px;
-}
-
-.td-fixed-width-150 {
- white-space: normal;
- width: 150px;
-}
-
-.pod-label {
- margin-right: 1em;
-}
-
-td > ul {
- margin-bottom: 0px;
-}
-
-td > .zebra-list > li {
- padding: 2px;
-}
-
-ul.nav select {
- margin-bottom: 0px;
- height: 25px;
-}
-
-/* ENTESB-2249: fixing bootstrap forms with tooltips */
-.form-horizontal input + div + .help-block,
-.form-horizontal select + div + .help-block,
-.form-horizontal textarea + div + .help-block {
- margin-top: 10px;
-}
-
-div#main div ul.nav {
- border-radius: 0 0 4px 4px;
- border: 1px solid #d4d4d4;
- border-top: 1px transparent;
- background-color: #FAFAFA;
- background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
- background-repeat: repeat-x;
- box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
-}
-
-ul.dynatree-container {
- background: inherit;
-}
-ul.dynatree-container li {
- background: inherit;
-}
-
-i.expandable-indicator {
- color: #666;
-}
-
-span.dynatree-expander {
- color: #728271;
-}
-
-span.dynatree-icon {
- color: #EECA7C;
-}
-span:not(.dynatree-has-children) .dynatree-icon:before {
- color: gray;
-}
-
-span.dynatree-empty,
-span.dynatree-vline,
-span.dynatree-connector,
-span.dynatree-expander,
-span.dynatree-icon,
-span.dynatree-checkbox,
-span.dynatree-radio,
-span.dynatree-drag-helper-img,
-#dynatree-drop-marker
-{
- font-family: FontAwesome;
- font-weight: normal;
- font-style: normal;
- display: inline-block;
- text-decoration: inherit;
- background-image: none;
- vertical-align: middle;
-}
-
-.dynatree-checkbox {
- color: #888888
-}
-
-/* Dynatree checkbox */
-span.dynatree-checkbox:before
-{
- margin-top: 1px;
- background-position: 0 0;
- cursor: pointer;
- content: "";
-}
-
-span.dynatree-checkbox:before:hover
-{
- background-position: 0 0;
- content: "";
-}
-
-.dynatree-selected span.dynatree-checkbox:before
-{
- margin-top: 1px;
- background-position: 0 0;
- cursor: pointer;
- content: "\f00c";
-}
-
-.dynatree-selected span.dynatree-checkbox:before:hover
-{
- background-position: 0 0;
- content: "\f00c";
-}
-
-
-.dynatree-expander {
- color: #888888
-}
-
-/* Dynatree expander */
-span.dynatree-expander:before
-{
- margin-top: 1px;
- background-position: 0 0;
- cursor: pointer;
- content: "\f054";
-}
-
-span.dynatree-expander:before:hover
-{
- background-position: 0 0;
- content: "\f054";
-}
-
-.dynatree-exp-e span.dynatree-expander:before, /* Expanded, not delayed, not last sibling */
-.dynatree-exp-ed span.dynatree-expander:before, /* Expanded, delayed, not last sibling */
-.dynatree-exp-el span.dynatree-expander:before, /* Expanded, not delayed, last sibling */
-.dynatree-exp-edl span.dynatree-expander:before /* Expanded, delayed, last sibling */
-{
- background-position: 0 0;
- content: "\f078";
-}
-.dynatree-exp-e span.dynatree-expander:before:hover, /* Expanded, not delayed, not last sibling */
-.dynatree-exp-ed span.dynatree-expander:before:hover, /* Expanded, delayed, not last sibling */
-.dynatree-exp-el span.dynatree-expander:before:hover, /* Expanded, not delayed, last sibling */
-.dynatree-exp-edl span.dynatree-expander:before:hover /* Expanded, delayed, last sibling */
-{
- background-position: 0 0;
- content: "\f0da";
-}
-
-/* closed folder */
-.dynatree-ico-cf span.dynatree-icon:before {
- background-position: 0 0;
- content: "\f07b";
-}
-
-/* open folder */
-.dynatree-ico-ef span.dynatree-icon:before {
- background-position: 0 0;
- content: "\f07c";
-}
-
-span.dynatree-icon:before {
- background-position: 0px 0px;
- font-family: FontAwesome;
- content: "\f013";
-}
-
-span.dynatree-folder a {
- font-weight: normal;
-}
-
-div.treeContainer ul.dynatree-container {
- border: 0px;
-}
-
-.pane>.pane-wrapper {
- position: relative;
- height: 100%;
- width: 100%;
- overflow: hidden;
-}
-
-.pane.left .pane-viewport {
- margin-left: 10px;
- right: 5px;
- margin-right: 0;
-}
-
-.pane-viewport {
- border-top: 1px solid #d4d4d4;
-}
-.pane-viewport {
- position: absolute;
- top: 24px;
- bottom: 0;
- left: 0;
- overflow: auto;
- margin-right: 10px;
-}
-
-.pane-content {
- float: none;
- position: static;
-}
-.pane-content {
- width: auto;
- height: auto;
-}
-
-.pane.left .pane-bar {
- border-right: 1px solid #d4d4d4;
-}
-.pane.left .pane-bar, .pane.right {
- right: 0;
-}
-.pane-bar {
- background: white;
-}
-.pane-bar {
- position: absolute;
- top: 0;
- right: 0;
- width: 5px;
- cursor: ew-resize;
- height: 100%;
-}
-
-div#overview-controller, div#list-controller {
- padding-left: 300px;
-}
-
-.ngViewport.ng-scope{
- height: auto !important;
- width: auto !important;
- overflow-y: hidden;
-}
-
-.ngTopPanel.ng-scope, .ngHeaderContainer{
- width: auto !important;
-}
-
-.qdr-overview.pane.left, .qdr-attributes.pane.left, .qdr-topology.pane.left {
- top: 70px;
-}
-
-div.chartContainer {
- width: auto;
-}
-
-div.chartOptions div.duration {
- width: 30em !important;
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/deploy
----------------------------------------------------------------------
diff --git a/console/config/deploy b/console/config/deploy
deleted file mode 100755
index f09ab38..0000000
--- a/console/config/deploy
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/bin/bash
-
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License
-#
-
-if [ -n "$1" ]
-then
- search_dir=$1
-else
- echo "deploy: Start routers for all of the config files in a given directory"
- echo "Usage:"
- echo "deploy directory"
- echo " where directory contains the router config files"
- exit 1
-fi
-
-for file in "${search_dir}/"*.conf
-do
- echo "starting $file"
- qdrouterd -c `pwd`/$file -d
- sleep 1
-done
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/deployments/install_dispatch.yaml
----------------------------------------------------------------------
diff --git a/console/config/deployments/install_dispatch.yaml b/console/config/deployments/install_dispatch.yaml
deleted file mode 100644
index 92d18fa..0000000
--- a/console/config/deployments/install_dispatch.yaml
+++ /dev/null
@@ -1,78 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License
-#
-
----
--
- hosts: deploy_routers
- become: true
-
- tasks:
- - name: install Dispatch Router
- block:
- - name: install Dispatch Router
- dnf: pkg={{item}} state=installed
- with_items:
- - qpid-dispatch-router
- - qpid-dispatch-tools
-
- - name: handle console
- block:
- - name: prepare to install console
- file:
- path: /usr/local/share/qpid-dispatch
- state: directory
-
- - name: archive the console
- local_action:
- module: archive
- dest: standalone.zip
- path: "{{playbook_dir}}/../../stand-alone"
- format: zip
-
- - unarchive:
- src: standalone.zip
- dest: /usr/local/share/qpid-dispatch
-
- when: create_console
-
- - name: create directories
- file:
- path: '{{ item }}'
- state: directory
- with_items:
- - /var/log/qdrouterd
- - /usr/local/etc/qpid-dispatch
-
- when: ansible_os_family == "RedHat"
-
- - name: Copying router configs
- copy:
- src: '../topologies/{{topology}}/{{item}}.conf'
- dest: /usr/local/etc/qpid-dispatch
- with_items: '{{ nodes }}'
-
- - name: stop running routers
- shell: "ps ax | grep qpid-dispatch/{{item}}.conf | grep -v 'grep' | awk -F ' ' '{print $1}' | xargs kill -9"
- #action: shell pkill -f qdrouterd
- ignore_errors: True
- with_items: '{{ nodes }}'
-
- - include_tasks: run_dispatch.yaml
- with_items: "{{ nodes }}"
-
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/deployments/run_dispatch.yaml
----------------------------------------------------------------------
diff --git a/console/config/deployments/run_dispatch.yaml b/console/config/deployments/run_dispatch.yaml
deleted file mode 100644
index c7730ef..0000000
--- a/console/config/deployments/run_dispatch.yaml
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License
-#
-
- - name: 'start router for {{item}}.conf'
- shell: "qdrouterd --config /usr/local/etc/qpid-dispatch/{{ item }}.conf -d"
- ignore_errors: True
- register: qdrouterd
-
- - name: 'force stop of {{item}}.conf'
- shell: "ps ax | grep qpid-dispatch/{{item}}.conf | grep -v 'grep' | awk -F ' ' '{print $1}' | xargs kill -9"
- ignore_errors: True
- when: qdrouterd.rc == 1
-
- - name: 'verify router for {{item}}.conf'
- shell: "ps aux | grep qpid-dispatch/{{item}}.conf | grep -v 'grep'"
- register: psresult
- ignore_errors: True
-
- - name: 'retry {{item}}.conf'
- shell: "qdrouterd --config /usr/local/etc/qpid-dispatch/{{ item }}.conf -d"
- when: psresult.rc == 1
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/4f42d5b3/console/config/favicon-32x32.png
----------------------------------------------------------------------
diff --git a/console/config/favicon-32x32.png b/console/config/favicon-32x32.png
deleted file mode 100644
index bd39a8b..0000000
Binary files a/console/config/favicon-32x32.png and /dev/null differ
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org