build: extended support for containerpilot v3

with sensors and local-compose
This commit is contained in:
geek 2017-06-19 18:52:20 -05:00 committed by Sérgio Ramos
parent ffb66639d7
commit 6cd39b2d8c
18 changed files with 526 additions and 135 deletions

View File

@ -6,17 +6,18 @@
# turn this into an HA Consul raft.
#############################################################################
consul:
image: autopilotpattern/consul:latest
image: autopilotpattern/consul:0.7.2-r0.8
command: >
/usr/local/bin/containerpilot
/bin/consul agent -server
-bootstrap-expect 1
-config-dir=/etc/consul
-ui-dir /ui
-config-dir=/etc/consul
-log-level=err
-bootstrap-expect 1
-ui-dir /ui
restart: always
mem_limit: 128m
ports:
- 8500
- 8500:8500
dns:
- 127.0.0.1
@ -27,47 +28,62 @@ consul:
# it is included here for demo purposes and is not required
#############################################################################
prometheus:
image: autopilotpattern/prometheus:latest
image: autopilotpattern/prometheus:1.7.1-r20
restart: always
mem_limit: 1g
ports:
- 9090
- 9090:9090
links:
- consul:consul
environment:
- CONSUL=consul
- CONSUL_AGENT=1
dns:
- 127.0.0.1
traefik:
image: d0cker/traefik
ports:
- "80:80"
- "8080:8080"
links:
- consul:consul
environment:
- CONSUL=consul
restart: always
#############################################################################
# FRONTEND
#############################################################################
frontend:
build: packages/cp-frontend
build: ./
dockerfile: packages/cp-frontend/Dockerfile
mem_limit: 512m
links:
- consul:consul
environment:
- CONSUL=consul
- CONSUL_AGENT=1
- PORT=5000
ports:
- REACT_APP_GQL_HOSTNAME=localhost
- REACT_APP_GQL_PORT=80
expose:
- 5000
#############################################################################
# BACKEND
#############################################################################
api:
build: packages/portal-api
build: ./
dockerfile: packages/portal-api/Dockerfile
mem_limit: 512m
links:
- consul:consul
- rethinkdb:rethinkdb
environment:
- CONSUL=consul
- CONSUL_AGENT=1
- PORT=3000
- RETHINK_HOST=rethinkdb
ports:
expose:
- 3000
#############################################################################

View File

@ -1,16 +1,18 @@
FROM quay.io/yldio/alpine-node-containerpilot:latest
ENV CONTAINERPILOT /etc/containerpilot.json5
RUN yarn add lerna@^2.0.0-rc.5 serve \
&& ./node_modules/.bin/lerna clean --yes --scope joyent-cp-frontend --include-filtered-dependencies \
&& ./node_modules/.bin/lerna bootstrap --scope joyent-cp-frontend --include-filtered-dependencies
WORKDIR /opt/app/packages/cp-frontend
COPY packages/cp-frontend/etc/containerpilot.json /etc/
COPY packages/cp-frontend/etc/containerpilot.json5 ${CONTAINERPILOT}
RUN yarn run build
ARG CIRCLE_BRANCH
ENV REACT_APP_GQL_HOSTNAME gql-mock-server-$CIRCLE_BRANCH.svc.f4b20699-b323-4452-9091-977895896da6.eu-ams-1.triton.zone
RUN yarn run build
EXPOSE 3069
CMD ["/bin/containerpilot"]

View File

@ -0,0 +1,44 @@
#!/bin/bash
set -e
help() {
echo 'Uses cli tools free and top to determine current CPU and memory usage'
echo 'for the telemetry service.'
}
# memory usage in percent
memory() {
# awk oneliner to get memory usage
# free -m | awk 'NR==2{printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }'
# output:
# Memory Usage: 15804/15959MB (99.03%)
local memory=$(free -m | awk 'NR==2{printf "%.2f", $3*100/$2 }')
/bin/containerpilot -putmetric "frontend_memory_percent=$memory"
}
# cpu load
cpu() {
# oneliner to display cpu load
# top -bn1 | grep load | awk '{printf "CPU Load: %.2f\n", $(NF-2)}'
local cpuload=$(uptime | awk '{printf "%.2f", $6}')
/bin/containerpilot -putmetric "frontend_cpu_load=$cpuload"
}
diskusage() {
local usage=$(df -P | grep '/$' | awk 'NR=2{print $3}' | sed 's/[^0-9\.]*//g')
/bin/containerpilot -putmetric "frontend_disk_usage=$usage"
}
diskcapacity() {
local capacity=$(df -P | grep '/$' | awk 'NR=2{print $2}' | sed 's/[^0-9\.]*//g')
/bin/containerpilot -putmetric "frontend_disk_capacity=$capacity"
}
cmd=$1
if [ ! -z "$cmd" ]; then
shift 1
$cmd "$@"
exit
fi
help

View File

@ -1,15 +0,0 @@
{
"consul": "0.0.0.0:8500",
"jobs": [
{
"name": "cp-frontend",
"port": 3069,
"exec": "../../node_modules/.bin/serve --single build --port 3069",
"health": {
"exec": "/usr/bin/curl -o /dev/null --fail -s http://0.0.0.0:3069/",
"interval": 3,
"ttl": 10
}
}
]
}

View File

@ -0,0 +1,102 @@
{
consul: 'localhost:8500',
jobs: [
{
name: 'cp-frontend',
port: {{.PORT}},
exec: '../../node_modules/.bin/serve --single build --port {{.PORT}}',
health: {
exec: '/usr/bin/curl -o /dev/null --fail -s http://localhost:{{.PORT}}',
interval: 2,
ttl: 5
},
tags: [
'traefik.backend=cp-frontend',
'traefik.frontend.rule=PathPrefix:/',
'traefik.frontend.entryPoints=http'
]
},
{
name: 'consul-agent',
exec: ['/usr/local/bin/consul', 'agent',
'-data-dir=/data',
'-config-dir=/config',
'-log-level=err',
'-rejoin',
'-retry-join', '{{ .CONSUL | default "consul" }}',
'-retry-max', '10',
'-retry-interval', '10s'],
restarts: 'unlimited'
},
{
name: 'sensor_memory_usage',
exec: '/bin/sensors.sh memory',
timeout: '5s',
when: {
interval: '5s'
},
restarts: 'unlimited'
},
{
name: 'sensor_cpu_load',
exec: '/bin/sensors.sh cpu',
timeout: '5s',
when: {
interval: '5s'
},
restarts: 'unlimited'
},
{
name: 'sensor_disk_capacity',
exec: '/bin/sensors.sh diskcapacity',
timeout: '5s',
when: {
interval: '60s'
},
restarts: 'unlimited'
},
{
name: 'sensor_disk_usage',
exec: '/bin/sensors.sh diskusage',
timeout: '5s',
when: {
interval: '60s'
},
restarts: 'unlimited'
}
],
telemetry: {
port: 9090,
tags: ['op'],
metrics: [
{
namespace: 'cp_frontend',
subsystem: 'memory',
name: 'percent',
help: 'Percentage of memory used',
type: 'gauge'
},
{
namespace: 'cp_frontend',
subsystem: 'cpu',
name: 'load',
help: 'CPU load',
type: 'gauge'
},
{
namespace: 'cp_frontend',
subsystem: 'disk',
name: 'capacity',
help: 'Disk capacity',
type: 'gauge'
},
{
namespace: 'cp_frontend',
subsystem: 'disk',
name: 'usage',
help: 'Disk usage',
type: 'gauge'
}
]
}
}

View File

@ -13,6 +13,7 @@ const GLOBAL = typeof window === 'object'
}
};
const GQL_PORT = process.env.REACT_APP_GQL_PORT || 3000;
const GQL_HOSTNAME =
process.env.REACT_APP_GQL_HOSTNAME || GLOBAL.location.hostname;
@ -30,7 +31,7 @@ export const client = new ApolloClient({
return `${o.__typename}:${id}`;
},
networkInterface: createNetworkInterface({
uri: `http://${GQL_HOSTNAME}:3000/graphql`
uri: `http://${GQL_HOSTNAME}:${GQL_PORT}/graphql`
})
});

View File

@ -1,11 +1,15 @@
FROM quay.io/yldio/alpine-node-containerpilot:latest
ENV CONTAINERPILOT /etc/containerpilot.json5
RUN yarn add lerna@^2.0.0-rc.5 serve \
&& ./node_modules/.bin/lerna clean --yes --scope joyent-cp-gql-mock-server --include-filtered-dependencies \
&& ./node_modules/.bin/lerna bootstrap --scope joyent-cp-gql-mock-server --include-filtered-dependencies
WORKDIR /opt/app/packages/cp-gql-mock-server
COPY packages/cp-gql-mock-server/etc/containerpilot.json /etc/
COPY packages/cp-gql-mock-server/etc/containerpilot.json5 ${CONTAINERPILOT}
COPY packages/cp-gql-mock-server/bin /bin
ARG CIRCLE_BRANCH

View File

@ -1,15 +0,0 @@
{
"consul": "0.0.0.0:8500",
"jobs": [
{
"name": "cp-gql-mock-server",
"port": 3000,
"exec": "yarn run start",
"health": {
"exec": "/usr/bin/curl -o /dev/null --fail -s http://0.0.0.0:3000/",
"interval": 3,
"ttl": 10
}
}
]
}

View File

@ -0,0 +1,102 @@
{
consul: 'localhost:8500',
jobs: [
{
name: 'cp-gql-mock-server',
port: {{.PORT}},
exec: 'node .',
health: {
exec: '/usr/bin/curl -o /dev/null --fail -s http://localhost:{{.PORT}}/graphiql',
interval: 2,
ttl: 5
},
tags: [
'traefik.backend=cp-gql-mock-server',
'traefik.frontend.rule=PathPrefix:/',
'traefik.frontend.entryPoints=http'
]
},
{
name: 'consul-agent',
exec: ['/usr/local/bin/consul', 'agent',
'-data-dir=/data',
'-config-dir=/config',
'-log-level=err',
'-rejoin',
'-retry-join', '{{ .CONSUL | default "consul" }}',
'-retry-max', '10',
'-retry-interval', '10s'],
restarts: 'unlimited'
},
{
name: 'sensor_memory_usage',
exec: '/bin/sensors.sh memory',
timeout: '5s',
when: {
interval: '5s'
},
restarts: 'unlimited'
},
{
name: 'sensor_cpu_load',
exec: '/bin/sensors.sh cpu',
timeout: '5s',
when: {
interval: '5s'
},
restarts: 'unlimited'
},
{
name: 'sensor_disk_capacity',
exec: '/bin/sensors.sh diskcapacity',
timeout: '5s',
when: {
interval: '60s'
},
restarts: 'unlimited'
},
{
name: 'sensor_disk_usage',
exec: '/bin/sensors.sh diskusage',
timeout: '5s',
when: {
interval: '60s'
},
restarts: 'unlimited'
}
],
telemetry: {
port: 9090,
tags: ['op'],
metrics: [
{
namespace: 'cp_gql_mock_server',
subsystem: 'memory',
name: 'percent',
help: 'Percentage of memory used',
type: 'gauge'
},
{
namespace: 'cp_gql_mock_server',
subsystem: 'cpu',
name: 'load',
help: 'CPU load',
type: 'gauge'
},
{
namespace: 'cp_gql_mock_server',
subsystem: 'disk',
name: 'capacity',
help: 'Disk capacity',
type: 'gauge'
},
{
namespace: 'cp_gql_mock_server',
subsystem: 'disk',
name: 'usage',
help: 'Disk usage',
type: 'gauge'
}
]
}
}

View File

@ -1,14 +1,20 @@
# todo change to 7
FROM quay.io/yldio/alpine-node-containerpilot:latest
ENV CONTAINERPILOT /etc/containerpilot.json5
RUN set -x \
&& apk update \
&& apk add curl bash build-base python zeromq-dev \
&& rm -rf /var/cache/apk/*
RUN yarn add lerna@^2.0.0-rc.5 \
&& ./node_modules/.bin/lerna clean --yes --scope portal-api --include-filtered-dependencies \
&& ./node_modules/.bin/lerna bootstrap --scope portal-api --include-filtered-dependencies
WORKDIR /home/node/app/packages/portal-api
COPY packages/portal-api/etc/containerpilot.json /etc/
WORKDIR /opt/app/packages/portal-api
COPY packages/portal-api/etc/containerpilot.json5 ${CONTAINERPILOT}
ARG CIRCLE_BRANCH
EXPOSE 3000
CMD ["/bin/containerpilot", "yarn", "start"]
CMD ["/bin/containerpilot"]

View File

@ -1,46 +0,0 @@
{
"consul": "0.0.0.0:8500",
"services": [
{
"name": "cp-gql-mock-server",
"port": 3000,
"health": "/usr/bin/curl -o /dev/null --fail -s http://0.0.0.0:3000/",
"poll": 3,
"ttl": 10
}
],
"backends": [],
"telemetry": {
"port": 9090,
"sensors": [
{
"name": "frontend_memory_percent",
"help": "percentage of memory used",
"type": "gauge",
"poll": 5,
"check": ["/bin/sensors", "memory"]
},
{
"name": "frontend_cpu_load",
"help": "cpu load",
"type": "gauge",
"poll": 5,
"check": ["/bin/sensors", "cpu"]
},
{
"name": "frontend_disk_capacity",
"help": "disk capacity",
"type": "gauge",
"poll": 60,
"check": ["/bin/sensors", "diskcapacity"]
},
{
"name": "frontend_disk_usage",
"help": "disk usage",
"type": "gauge",
"poll": 60,
"check": ["/bin/sensors", "diskusage"]
}
]
}
}

View File

@ -0,0 +1,102 @@
{
consul: 'localhost:8500',
jobs: [
{
name: 'api',
port: {{.PORT}},
exec: 'node server.js',
health: {
exec: '/usr/bin/curl -o /dev/null --fail -s http://localhost:{{.PORT}}/check-it-out',
interval: 2,
ttl: 5
},
tags: [
'traefik.backend=api',
'traefik.frontend.rule=PathPrefix:/graphql,/graphiql',
'traefik.frontend.entryPoints=http'
]
},
{
name: 'consul-agent',
exec: ['/usr/local/bin/consul', 'agent',
'-data-dir=/data',
'-config-dir=/config',
'-log-level=err',
'-rejoin',
'-retry-join', '{{ .CONSUL | default "consul" }}',
'-retry-max', '10',
'-retry-interval', '10s'],
restarts: 'unlimited'
},
{
name: 'sensor_memory_usage',
exec: '/bin/sensors.sh memory',
timeout: '5s',
when: {
interval: '5s'
},
restarts: 'unlimited'
},
{
name: 'sensor_cpu_load',
exec: '/bin/sensors.sh cpu',
timeout: '5s',
when: {
interval: '5s'
},
restarts: 'unlimited'
},
{
name: 'sensor_disk_capacity',
exec: '/bin/sensors.sh diskcapacity',
timeout: '5s',
when: {
interval: '60s'
},
restarts: 'unlimited'
},
{
name: 'sensor_disk_usage',
exec: '/bin/sensors.sh diskusage',
timeout: '5s',
when: {
interval: '60s'
},
restarts: 'unlimited'
}
],
telemetry: {
port: 9090,
tags: ['op'],
metrics: [
{
namespace: 'api',
subsystem: 'memory',
name: 'percent',
help: 'Percentage of memory used',
type: 'gauge'
},
{
namespace: 'api',
subsystem: 'cpu',
name: 'load',
help: 'CPU load',
type: 'gauge'
},
{
namespace: 'api',
subsystem: 'disk',
name: 'capacity',
help: 'Disk capacity',
type: 'gauge'
},
{
namespace: 'api',
subsystem: 'disk',
name: 'usage',
help: 'Disk usage',
type: 'gauge'
}
]
}
}

View File

@ -27,6 +27,7 @@
},
"dependencies": {
"boom": "^5.1.0",
"brule": "^2.0.0",
"graphi": "^2.2.1",
"hoek": "^4.1.1",
"joi": "^10.6.0",

View File

@ -1,5 +1,6 @@
'use strict';
const Brule = require('brule');
const Hapi = require('hapi');
const Inert = require('inert');
const Vision = require('vision');
@ -31,6 +32,7 @@ const portalOptions = {
};
server.register([
Brule,
Inert,
Vision,
{

View File

@ -1,15 +1,17 @@
FROM quay.io/yldio/alpine-node-containerpilot:latest
ENV CONTAINERPILOT /etc/containerpilot.json5
RUN yarn add lerna@^2.0.0-rc.5 serve \
&& ./node_modules/.bin/lerna clean --yes --scope joyent-ui-toolkit --include-filtered-dependencies \
&& ./node_modules/.bin/lerna bootstrap --scope joyent-ui-toolkit --include-filtered-dependencies
WORKDIR /opt/app/packages/ui-toolkit
COPY packages/ui-toolkit/etc/containerpilot.json5 ${CONTAINERPILOT}
RUN yarn run styleguide:build
ARG CIRCLE_BRANCH
RUN yarn run styleguide:build
COPY packages/ui-toolkit/etc/containerpilot.json /etc/
EXPOSE 6060
CMD ["/bin/containerpilot"]

View File

@ -1,15 +0,0 @@
{
"consul": "0.0.0.0:8500",
"jobs": [
{
"name": "ui-toolkit",
"port": 6060,
"exec": "../../node_modules/.bin/serve --single styleguide --port 6060",
"health": {
"exec": "/usr/bin/curl -o /dev/null --fail -s http://0.0.0.0:6060/",
"interval": 3,
"ttl": 10
}
}
]
}

View File

@ -0,0 +1,102 @@
{
consul: 'localhost:8500',
jobs: [
{
name: 'ui-toolkit',
port: {{.PORT}},
exec: '../../node_modules/.bin/serve --single styleguide --port {{.PORT}}',
health: {
exec: '/usr/bin/curl -o /dev/null --fail -s http://localhost:{{.PORT}}',
interval: 2,
ttl: 5
},
tags: [
'traefik.backend=ui-toolkit',
'traefik.frontend.rule=PathPrefix:/',
'traefik.frontend.entryPoints=http'
]
},
{
name: 'consul-agent',
exec: ['/usr/local/bin/consul', 'agent',
'-data-dir=/data',
'-config-dir=/config',
'-log-level=err',
'-rejoin',
'-retry-join', '{{ .CONSUL | default "consul" }}',
'-retry-max', '10',
'-retry-interval', '10s'],
restarts: 'unlimited'
},
{
name: 'sensor_memory_usage',
exec: '/bin/sensors.sh memory',
timeout: '5s',
when: {
interval: '5s'
},
restarts: 'unlimited'
},
{
name: 'sensor_cpu_load',
exec: '/bin/sensors.sh cpu',
timeout: '5s',
when: {
interval: '5s'
},
restarts: 'unlimited'
},
{
name: 'sensor_disk_capacity',
exec: '/bin/sensors.sh diskcapacity',
timeout: '5s',
when: {
interval: '60s'
},
restarts: 'unlimited'
},
{
name: 'sensor_disk_usage',
exec: '/bin/sensors.sh diskusage',
timeout: '5s',
when: {
interval: '60s'
},
restarts: 'unlimited'
}
],
telemetry: {
port: 9090,
tags: ['op'],
metrics: [
{
namespace: 'ui_toolkit',
subsystem: 'memory',
name: 'percent',
help: 'Percentage of memory used',
type: 'gauge'
},
{
namespace: 'ui_toolkit',
subsystem: 'cpu',
name: 'load',
help: 'CPU load',
type: 'gauge'
},
{
namespace: 'ui_toolkit',
subsystem: 'disk',
name: 'capacity',
help: 'Disk capacity',
type: 'gauge'
},
{
namespace: 'ui_toolkit',
subsystem: 'disk',
name: 'usage',
help: 'Disk usage',
type: 'gauge'
}
]
}
}

View File

@ -3708,11 +3708,11 @@ extsprintf@1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
extsprintf@1.2.0, extsprintf@^1.2.0:
extsprintf@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.2.0.tgz#5ad946c22f5b32ba7f8cd7426711c6e8a3fc2529"
extsprintf@1.3.0:
extsprintf@1.3.0, extsprintf@^1.2.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
@ -4591,7 +4591,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1:
inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
@ -6021,10 +6021,10 @@ merge-descriptors@1.0.1:
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
merge-source-map@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.3.tgz#da1415f2722a5119db07b14c4f973410863a2abf"
version "1.0.4"
resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.4.tgz#a5de46538dae84d4114cc5ea02b4772a6346701f"
dependencies:
source-map "^0.5.3"
source-map "^0.5.6"
methods@~1.1.2:
version "1.1.2"
@ -7330,8 +7330,8 @@ react-router@^4.1.1:
warning "^3.0.0"
react-styled-flexboxgrid@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/react-styled-flexboxgrid/-/react-styled-flexboxgrid-2.0.1.tgz#be5e188c6c1db8ae619806ecf18a2901541c0ee7"
version "2.0.2"
resolved "https://registry.yarnpkg.com/react-styled-flexboxgrid/-/react-styled-flexboxgrid-2.0.2.tgz#c1991bd6b249ee4b7cf0abbc35869a0d28e65620"
dependencies:
lodash.isinteger "^4.0.4"
@ -7435,14 +7435,14 @@ read@1.0.7:
mute-stream "~0.0.4"
"readable-stream@>= 1.0.2", readable-stream@^2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6:
version "2.2.11"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.11.tgz#0796b31f8d7688007ff0b93a8088d34aa17c0f72"
version "2.3.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.0.tgz#640f5dcda88c91a8dc60787145629170813a1ed2"
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.1"
inherits "~2.0.3"
isarray "~1.0.0"
process-nextick-args "~1.0.6"
safe-buffer "~5.0.1"
safe-buffer "~5.1.0"
string_decoder "~1.0.0"
util-deprecate "~1.0.1"
@ -8062,7 +8062,7 @@ rx-lite@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
safe-buffer@^5.0.1, safe-buffer@^5.1.0:
safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.0.tgz#fe4c8460397f9eaaaa58e73be46273408a45e223"
@ -9615,7 +9615,7 @@ window-size@0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
wordwrap@0.0.2:
wordwrap@0.0.2, wordwrap@~0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
@ -9623,10 +9623,6 @@ wordwrap@1.0.0, wordwrap@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
wordwrap@~0.0.2:
version "0.0.3"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
wrap-ansi@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"