Compare commits

...

2690 Commits

Author SHA1 Message Date
bergquist ffe0ecfaaa release 4.2.0 beta1 2017-02-27 10:33:26 +01:00
bergquist 05952688c5 tech: avoid using http.DefaultClient 2017-02-24 17:22:12 +01:00
bergquist 03354bc49a tech: replace context.TODO with background ctx 2017-02-24 09:20:28 +01:00
Torkel Ödegaard e73b306e0c fix(templating): fixed duplicate dashboard refresh when changing template variable, #7654 2017-02-24 08:16:37 +01:00
bergquist 46ac8c098f changelog: adds note about closing #7482 2017-02-24 07:42:30 +01:00
Carl Bergquist 5d3da99806 Merge pull request #7482 from dbrgn/master
Alerting: Add Threema Gateway integration
2017-02-24 07:40:36 +01:00
bergquist 785cecac26 changelog: adds note about closing #7526 2017-02-24 07:35:45 +01:00
Carl Bergquist bef216b6f4 Merge pull request #7526 from Mic92/master
Add Pushover alert notifications
2017-02-24 07:32:59 +01:00
bergquist 67b8b9743b changelog: note about closing #7602 2017-02-24 07:30:47 +01:00
Carl Bergquist 3ef1a60647 Merge pull request #7602 from Altoros/suppress-empty-results-in-table-plugin
Added suppressing of empty results to table plugin
2017-02-24 07:28:59 +01:00
Torkel Ödegaard d6eaaf3add refactor: minor refactoring 2017-02-23 15:57:36 +01:00
Mitsuhiro Tanda 68bb417db9 support [[var]] in cloudwatch datasource (#7649)
* support [[var]] form in cloudwatch datasource

* support multi variable in single dimension

* fix test
2017-02-23 15:02:35 +01:00
bergquist d88286ab81 orgs: set orgId as query param on load
ref #1613
2017-02-23 11:03:39 +01:00
bergquist 73830a44fe sharemodal: fixes broken unittests 2017-02-22 14:29:49 +01:00
bergquist fe223cbc96 changelog: adds note about closing #1613 2017-02-22 14:04:01 +01:00
bergquist fdb06c7c10 sharing: set orgId as query parameter when sharing a dashboard
to make sure an user opens the dashboard in the correct org, orgId will
always be added when sharing a dashboard. if the users current orgId
doesnt match the query parameter grafana will change it and redirect the
user.

closes #1613
2017-02-22 13:56:06 +01:00
bergquist dea2e5d743 changelog: adds note about closing #6948 2017-02-22 11:24:06 +01:00
bergquist 607ee635d1 alerting: adds deduping of alert notifications 2017-02-22 10:52:01 +01:00
Carl Bergquist b4fd6f2d45 Merge pull request #7632 from grafana/alerting_notification_dedupe
alerting: dedupe alert notifications when running multiple servers
2017-02-22 10:48:41 +01:00
bergquist c1d69358ba changelog: adds note about closing #552 2017-02-22 10:39:52 +01:00
bergquist 9ed1d12cc0 style: use for loops over _.each in typescript 2017-02-22 10:36:30 +01:00
bergquist c5a76fba87 shortcuts: add expand/collapse to shortcut help 2017-02-22 10:33:24 +01:00
bergquist e828f3a97b shortcuts: change init bind key to d 2017-02-22 10:32:30 +01:00
Mitsuhiro Tanda 5a30b08b14 add keyboard shotcuts for collapse/expand rows 2017-02-22 09:30:56 +01:00
Torkel Ödegaard e3b71ed95e docs(): updated CLA 2017-02-22 09:10:08 +01:00
Torkel Ödegaard 9c84b9f944 docs(): CLA fixes 2017-02-22 08:55:24 +01:00
Daniel Lee e5f5c1724a templating: check for default data source (#7636)
For data source template variables, check if the
selected value is default and if so load the
default data source.

Fixes #7586
2017-02-21 17:27:21 +01:00
bergquist 00dddca26a alerting: dedupe alert notifications when running multiple servers
alert notifications will only be sent if the database value
is updated.

ref #6957
2017-02-21 16:54:49 +01:00
Daniel Lee 96a3ed0ac3 docs: new /api/users/search route
ref #7469. Description of new route that
adds paging for the users list.
2017-02-21 16:09:15 +01:00
Torkel Ödegaard d5245fd19a docs(): updated changelog with #7612 2017-02-21 10:49:50 +01:00
Aaron Roydhouse 4039e5edbc Improve 'external_image_storage.s3' documentation (#7623)
Add documentation for 'external_image_storage.s3' to explain how to specify the AWS region for the S3 bucket, and the requires S3/IAM permissions.
2017-02-21 10:09:50 +01:00
bergquist 70b36a02af Revert "tech: use context package over xperimental version"
This reverts commit 99f1c30071.
2017-02-20 22:04:51 +01:00
bergquist 99f1c30071 tech: use context package over xperimental version 2017-02-20 21:44:15 +01:00
tamayika b01fd3d0b5 Support for all ad-hoc filter operators on Elasticsearch (#7612) 2017-02-20 21:01:52 +01:00
bergquist 072c1559ba middlware: prevent orgredirect to open body stream
the org redirecter opened the body stream by misstake. Causing
downstream code to start reading from an empty stream and raise errors.
2017-02-20 11:38:29 +01:00
Torkel Ödegaard b176f36889 docs(): updated CLA 2017-02-20 10:41:13 +01:00
Torkel Ödegaard 38126bc595 fix(templating): fixed issue detecting template variable dependency, fixes #7354 2017-02-20 09:31:50 +01:00
bergquist 492b2bd42f build: fixes golang 1.8 build on windows 2017-02-19 11:32:26 +01:00
Simon Effenberg a4318e41f8 fixing little spelling issue (#7603) 2017-02-18 17:21:29 +01:00
Tim De Pauw 48649951e4 Github → GitHub (#7607) 2017-02-18 17:20:44 +01:00
bergquist d2444cbed0 Merge branch 'paging-users' 2017-02-17 16:25:03 +01:00
bergquist 400bd8d2d3 build: reduce logs from npm install 2017-02-17 16:16:17 +01:00
Carl Bergquist 24474ba41a Merge pull request #7601 from grafana/redirect_on_new_orgid
middlware: change org when url contains orgid
2017-02-17 15:31:17 +01:00
bergquist 6115941df0 middleware: rename org-id -> orgId 2017-02-17 15:18:40 +01:00
bergquist 5174d050f2 middlware: change org when url contains orgid
closes #6948
ref #1613
2017-02-17 15:02:14 +01:00
Torkel Ödegaard ac0d09c419 fix(): fixed issue with syncing refresh interval to url 2017-02-17 14:07:15 +01:00
bergquist 12f1ea71fd chore: delete empty test 2017-02-17 12:07:46 +01:00
bergquist 76f617b862 build: disable setup for windows build 2017-02-17 12:06:24 +01:00
bergquist 774c1de892 changelog: adds note about closing #7319 2017-02-17 10:42:52 +01:00
bergquist 5fb4540358 changelog: adds note about closing #7382 2017-02-17 10:41:15 +01:00
bergquist 79daa71350 docs: update golang requirement to 1.8 2017-02-17 10:37:59 +01:00
bergquist defa81e4c1 Merge branch 'http_graceful' 2017-02-17 10:34:02 +01:00
bergquist cf871b1284 http: close http server gracefully. 2017-02-17 10:33:47 +01:00
bergquist 52566376b2 tech(server): remove unused code 2017-02-17 10:18:11 +01:00
bergquist a32b7dfb9d build: upgrade to golang 1.8 2017-02-17 09:05:52 +01:00
bergquist c924510deb alertlist: adds pause as filter option
closes #7400
2017-02-16 16:01:57 +01:00
bergquist a747d33373 templating: allow whitespace values
closes #7382
2017-02-16 15:58:01 +01:00
bergquist d72011589e templating: refactor sorting test 2017-02-16 14:22:38 +01:00
bergquist 927b39fa63 templating: adds test for sorting template values 2017-02-16 14:14:17 +01:00
Senkevich Alexsandr 17d02a7065 added suppressing of empty results in table plugin 2017-02-16 14:35:42 +03:00
bergquist 3c0f61511d build: deps-go is not required for building grafana
setup compiles the backend and caches it which is nice
when developing grafana since incremental compiles are
much faster. But its not required for building grafana.
2017-02-16 09:10:55 +01:00
bergquist 9b4d95ff25 changelog: note about closing #7347 2017-02-15 14:35:40 +01:00
Roman Vynar 4fcd5eab29 Add advanced TLS settings to harden setup. (#7347)
* Hardcoded the most secured TLS options.
2017-02-15 14:29:20 +01:00
Torkel Ödegaard 902cf5f889 fix(): google analytics fix 2017-02-15 14:26:57 +01:00
bergquist bd010289b2 alerting: images in alert notifications is now optional
its now possible to turn of image uploading in alert notifications
for those who operate on very sensitive data.

closes #7419
2017-02-15 14:17:36 +01:00
bergquist f14e25612e annotations: go vet fixes 2017-02-15 14:15:42 +01:00
bergquist c8c3021987 docs: tutorial for setting up grafana as HA
ref #7541
2017-02-15 12:38:50 +01:00
Daniel Lee 6dfdcd7ca5 email: change default from name to Grafana
Changes default from name in smtp settings
from Grafana Admin to Grafana.

Fix for integration test (which is skipped but that
did not work)
2017-02-15 11:02:46 +01:00
Daniel Lee 8144b73544 changelog: adds note about closing #2131 2017-02-15 10:44:43 +01:00
Daniel Lee 5fca4c7304 Merge pull request #7569 from jacobbednarz/add-sender-name-to-email
Updates mailer to include `from_name` value
2017-02-15 10:32:06 +01:00
Dennis Wiemer 8b25ba6a7c Added click events in graph to core eventbus (#7511) 2017-02-15 08:47:20 +01:00
Torkel Ödegaard e573006283 docs(): added cla 2017-02-15 08:40:34 +01:00
Jan Garaj 79cd48f64c Cloudwatch AWS/SES metrics (#7568) 2017-02-15 08:12:24 +01:00
Jacob Bednarz 6a9247500a Update documentation to include information about from_name values 2017-02-15 08:07:29 +11:00
Jacob Bednarz 7520b4f404 Update default configuration to include from_name values 2017-02-15 08:06:58 +11:00
Jacob Bednarz 796957c8c6 Update mailer tests to include FromName 2017-02-15 08:04:21 +11:00
Jacob Bednarz 66445faeb5 Format mailer From field to include name
Updates the messafe `From` field to include the name and email of the
sender.
2017-02-15 07:51:41 +11:00
Jacob Bednarz 90cbfacacf Add FromName to SmtpSettings struct
Updates the `SmtpSettings` struct to include a value for setting the
name of the email sender.
2017-02-15 07:45:28 +11:00
Jacob Bednarz 7dc6b69c8b s/smpt/SMTP 2017-02-15 07:43:59 +11:00
Jacob Bednarz c9d4654592 s/from_adress/from_address 2017-02-15 07:43:16 +11:00
bergquist 423e8686ef docs: fixes markdown formating 2017-02-14 12:56:49 +01:00
bergquist e97cab9964 docs: removes version selector from influxdb 2017-02-14 12:02:31 +01:00
Daniel Lee 5304e7b220 changelog: adds #7554 - minor enhancement to 4.2.0 2017-02-14 11:22:47 +01:00
Daniel Lee 76f82b00d7 Merge pull request #7554 from ryantxu/kbn_physics
Add more physics units
2017-02-14 11:16:20 +01:00
bergquist 73bec813fc docs: adds delete datasource by name 2017-02-14 10:41:08 +01:00
Daniel Lee 6861c6033c Changelog: add 7449 - minor enhancement to 4.2.0
Closes #7449
2017-02-14 10:21:07 +01:00
Ryuichi Sakai 0c9f664ea0 Make timeout for snapshot creation configurable 2017-02-14 10:10:51 +01:00
bergquist 9f80e8c03d changelog: rearrange closed issues 2017-02-14 10:06:31 +01:00
bergquist 6761661e10 changelog: adds note about closing #7542 2017-02-14 10:03:23 +01:00
bergquist 0523830716 changelog: add note about closing #7542 2017-02-14 08:56:00 +01:00
xginn8 1c8509ea58 wrap text in annotations modal (#7549)
annotation: wrap text in drop_element, fixes #7542
2017-02-14 08:49:43 +01:00
ryan 7867a24d87 Adding more physics units 2017-02-13 23:30:15 -08:00
Carl Bergquist 05a6cb3f76 Merge pull request #7548 from ryantxu/influxdb_logo
update datasource logos
2017-02-14 08:23:03 +01:00
ryan a1e071d3c5 missing space 2017-02-13 18:47:59 -08:00
ryan 2749dd8711 elasticsearch svg 2017-02-13 18:47:01 -08:00
ryan b46fac34d9 replace elastic logo 2017-02-13 18:38:13 -08:00
ryan fc0de84701 update influx logo 2017-02-13 18:19:14 -08:00
bergquist 2ad2b96133 build: avoid progress bar update on yarn install
this will save us ~100TB of unneeded data in the long term.
2017-02-13 15:26:10 +01:00
bergquist 2c68c071c0 changelog: update release of 2017-02-13 2017-02-13 15:11:45 +01:00
bergquist c7560edba5 docs: release 4.1.2 for windows 2017-02-13 14:17:26 +01:00
bergquist 89fdcc84de docs: release 4.1.2 2017-02-13 13:52:42 +01:00
Daniel Lee 193d468ed3 admin: adds paging to global user list
Currently there is a limit of 1000 users in the global
user list. This change introduces paging so that an
admin can see all users and not just the first 1000.

Adds a new route to the api - /api/users/search that
returns a list of users and a total count. It takes
two parameters perpage and page that enable paging.

Fixes #7469
2017-02-13 12:59:36 +01:00
Jörg Thalheim f069aae576 Add Pushover alert notifications
Pushover is a service for getting real-time
notifications on your mobile devices and desktop
computers: https://pushover.net
2017-02-10 22:44:33 +01:00
bergquist e80f673264 changelog: adds note about closing issues 2017-02-10 15:56:28 +01:00
Carl Bergquist 7f4f38e773 Merge pull request #7519 from huydx/master
(feat) support datasource delete by name api
2017-02-10 15:53:34 +01:00
huydx 143cbe921f (feat) support datasource delete by name api 2017-02-10 23:30:14 +09:00
bergquist f147ac053d Merge branch 'huydx-feat/sqlmax' 2017-02-10 15:30:12 +01:00
bergquist 5b7b3fef64 conf: adds sample values for db conn settings 2017-02-10 15:30:01 +01:00
huydx 28d93b574d (feat) support max connection setting for database configuration 2017-02-10 15:30:01 +01:00
bergquist 3c7cf3f728 docs: kairosdb is no longer supported by default 2017-02-10 14:42:19 +01:00
Daniel Lee 1294b203e6 admin: adds paging to global user list
Currently there is a limit of 1000 users in the global
user list. This change introduces paging so that an
admin can see all users and not just the first 1000.

Adds a new route to the api - /api/users/search that
returns a list of users and a total count. It takes
two parameters perpage and page that enable paging.

Fixes #7469
2017-02-10 11:00:04 +01:00
bergquist 900230890f changelog: adds note about closing #2385 2017-02-10 10:15:03 +01:00
Vladimir Kolobaev 8083079eea graph: set max width for legend tables.
ref #2385
2017-02-10 10:11:39 +01:00
bergquist dcf097a8b9 changelog: adds note about closing #6109 2017-02-10 08:57:46 +01:00
xginn8 3d4c3ff00d return an empty message if table contains no data #6109 (#7487) 2017-02-10 08:54:00 +01:00
bergquist 7bf570532f docs: adds note about closing #7493 2017-02-10 08:34:56 +01:00
Vladimir Kolobaev 6eda5604d2 Full metric description (#7493)
graph: add full metric description for graph-legend-alias title
2017-02-10 08:31:51 +01:00
bergquist 38c29d2209 changelog: adds note about closing #7513 2017-02-10 08:29:44 +01:00
Carl Bergquist 73d441450b Merge pull request #7516 from grafana/oauth-login-redirect
redirect user to requested url after login via oauth
2017-02-10 08:27:41 +01:00
bergquist 5dd961c0f5 settings: remove commented code 2017-02-10 07:39:26 +01:00
Dan Cech b22881c717 redirect user to requested url after login via oauth 2017-02-09 14:01:53 -05:00
bergquist c7febca447 mqe: fixes broken test for indexalias 2017-02-09 16:43:57 +01:00
bergquist aa7292fac6 mqe: adds support for wildcard and index aliases 2017-02-09 16:25:03 +01:00
Daniel Lee bccb650010 Adds Sorting for lists of data sources to 4.2.0 2017-02-08 12:06:00 +01:00
Daniel Lee 2b2368b189 Merge pull request #7491 from grafana/sorting-datasources
Sorting datasources with case insensitive order
2017-02-08 12:01:31 +01:00
Daniel Lee fbc3c3dd32 api: removes import alias + some unused fields 2017-02-08 11:57:05 +01:00
bergquist 10508d0238 docs(changelog): adds note about closing #6451 2017-02-08 11:28:26 +01:00
bergquist e8f191ef32 Merge branch 'jregovic-master' 2017-02-08 11:25:41 +01:00
bergquist 00549f393c style(hipchat): improves code style 2017-02-08 11:24:49 +01:00
Daniel Lee 8aa5b62d6d fix(panel): case insensitive sort metric sources
Sorts the list of metric sources that is used in dropdown for Panel
Data Source on the Metrics tab so that it is case insensitive and
so that the built data sources are last in the list.
2017-02-08 00:01:42 +01:00
Daniel Lee cbd1455c42 fix(api): case insensitive sort for datasources
The data source list is case sensitive when sorted. This changes the
sort to be case insensitive. The test only tests the handler, not the
routing or database query.
2017-02-07 22:15:52 +01:00
James Regovich 53942f7987 Adding HipChat Notifier 2017-02-07 10:50:49 -06:00
bergquist 5bba0c2a94 tech(build): upgrade dist builder to golang1.8rc3 2017-02-07 12:45:06 +01:00
bergquist b3db5aae4b docs(changelog): adds note about closing #6799 2017-02-07 11:21:20 +01:00
Carl Bergquist 7d205ae2b8 Merge pull request #7466 from hagen1778/prometheus-basicauth-query
allow setting basic auth headers for prometheus datasource
2017-02-07 11:18:17 +01:00
bergquist 8ca4afaf22 docs(changelog): adds note about closing #7459 2017-02-07 11:17:20 +01:00
Danilo Bargen 689f5cb686 feat(alerting): Text formatting for Threema alert messages 2017-02-07 11:14:57 +01:00
Danilo Bargen d1a5d9c15c feat(alerting): Add Threema Gateway integration
This commit adds alerting support for Threema Gateway. It supports all
Simple IDs (managed by the Gateway server).

More information can be found on https://gateway.threema.ch/
2017-02-07 11:14:57 +01:00
bergquist 9ece10ef24 style(dataproxy): simplify expression 2017-02-07 11:03:57 +01:00
bergquist b386920abb Merge branch 'prometheus_secure' of https://github.com/mtanda/grafana into mtanda-prometheus_secure 2017-02-07 11:01:02 +01:00
hagen1778 a1e835884b use configured Transport instead of defaultHttpTransport 2017-02-07 11:56:59 +02:00
Daniel Lee 5e9653f935 docs(): adds missing index pages + link fix 2017-02-07 10:22:14 +01:00
bergquist 285918caf6 tech(build): switch to golang 1.8rc3 2017-02-07 10:13:21 +01:00
Daniel Lee abd9233f86 Docs for developing plugins (#7475)
* docs(plugins): new developing plugins section

Creates new section called Developing Plugins in
the plugin section of the docs.

1. Some changes to the Development guide page
2. Converted defaults/editor mode blog post
to new page
3. Converted snapshots blog post to new page
4. Adds new code styleguide page
5. Updates to apps and datasources pages
6. Adds plugin.json schema

* docs(links): fixes broken links

Fixes broken links to other pages as
well as broken image links.
2017-02-07 07:48:01 +01:00
Torkel Ödegaard 3398c28ab2 docs(): fixing redirects for moved doc pages, updating links to point to new urls 2017-02-06 18:04:53 +01:00
r.khavronenko 25be602dce go fmt 2017-02-06 17:17:16 +02:00
bergquist 5a7abe365c tech(build): echo before running go fmt/vet 2017-02-06 15:55:22 +01:00
bergquist 57d36b3d42 feat(alerting): transform labels into tags for prometheus tsdb 2017-02-06 15:25:15 +01:00
r.khavronenko 80b92335bb allow setting basic auth headers for prometheus datasource 2017-02-06 16:22:09 +02:00
Mitsuhiro Tanda 69566a23fc improve security of Prometheus datasource 2017-02-06 23:10:10 +09:00
bergquist 3827c0a69c tech(alerting): adds tags to alerting data model 2017-02-06 14:59:29 +01:00
Torkel Ödegaard 982dc276d3 Update building docs readme 2017-02-06 10:19:47 +01:00
jifwin 9e7df648b5 Fix requests cancelling (#7457)
* fix backendSrv request cancelling

* revert imports

* formatting
2017-02-06 06:42:26 +01:00
bergquist a36b1d9dce tech(build): require go vet to pass 2017-02-05 21:21:05 +01:00
bergquist c05bc0cb17 chore(vet): fixes invalid fmt.Sprintf format 2017-02-05 21:19:39 +01:00
bergquist d9b5628126 docs: update nodejs version requirement in readme 2017-02-03 16:15:37 +01:00
Carl Bergquist 282b1bc73a Merge pull request #7442 from lucapette/patch-1
Fix typo
2017-02-03 14:06:54 +01:00
lucapette 032ecad3b7 Fix typo 2017-02-03 12:10:22 +01:00
bergquist 457d6c8f81 tech(build): fixes broken build 2017-02-02 17:25:33 +01:00
Torkel Ödegaard 65cf0d0e5c fix(graph legend): fixed legend table mode scrollbar visible when it needs to to, fixes #6828 2017-02-02 16:29:11 +01:00
bergquist 3e62b1b2d7 tech(build): use build number as iteration number 2017-02-02 15:55:37 +01:00
bergquist a580113de4 feat(alerting): changes default timerange to 15min 2017-02-02 12:05:44 +01:00
bergquist 63aa436997 tech(build): slimdown the size of the build container 2017-02-02 11:33:34 +01:00
bergquist 3cbca80d3c tech(build): starts docker build for latest build 2017-02-02 10:41:11 +01:00
bergquist aef4195493 tech(build): fixes invalid script file usage 2017-02-01 07:09:36 +01:00
bergquist ea6d996abc tech(build): enable windows build trigger 2017-01-31 21:43:18 +01:00
bergquist 74c5c5368c tech(build): update windows trigger 2017-01-31 21:36:52 +01:00
bergquist afd135944a tech(build): upgrade golang to 1.7.4 2017-01-31 21:11:34 +01:00
bergquist 18f20a3357 tech(build): deploy to new s3 buckets 2017-01-31 20:26:19 +01:00
bergquist b600e1c50b docs(changelog): adds note about closing #7417 2017-01-31 15:24:00 +01:00
Mitsuhiro Tanda 91999851cb support regex expansion in templating "Regex" field (#6565) 2017-01-31 15:21:53 +01:00
Carl Bergquist 4f5dc6104f Merge pull request #7417 from Erliz/patch-1
Add image url to telegram alert notifier
2017-01-31 15:13:21 +01:00
Kevin Bowling 0c46def1a0 Add an idiomatic plugin path for FreeBSD (#7410) 2017-01-31 14:54:53 +01:00
Stanislav Vetlovskiy 0e892e9f86 Add image url to telegram alert notifier
If public image url of alert is exist add it to the telegram message
2017-01-31 16:47:14 +03:00
bergquist 513fcdeeb8 tech(build): prepare for tag builds 2017-01-31 11:00:23 +01:00
Torkel Ödegaard f602752bdc fix(packaging): fixed issue in deb package post install script that made it think upgrade was happening, fixes #7403 2017-01-31 10:56:04 +01:00
bergquist d72f257f27 tech(build): disable package iteration for release builds 2017-01-31 09:40:26 +01:00
Torkel Ödegaard fce2e341d2 mergefix(): fixed issue with master merge 2017-01-31 09:00:36 +01:00
Torkel Ödegaard 8a95c563bb Merge branch 'master' into websocket 2017-01-31 08:56:49 +01:00
Torkel Ödegaard 2594041eed hiding grafana live ds 2017-01-31 08:56:46 +01:00
Torkel Ödegaard 9ba1ea0179 fix(): another unit test fix attempt 2017-01-31 08:52:48 +01:00
Torkel Ödegaard 0c5abc1615 Merge branch 'xginn8-master' 2017-01-31 08:27:53 +01:00
Torkel Ödegaard 5fc5971145 refactor(): refactoring PR #7124 2017-01-31 08:27:48 +01:00
Torkel Ödegaard 436e35c845 fix(): fixed unit test broken in last PR merge 2017-01-31 07:59:14 +01:00
Torkel Ödegaard 9a61d43dc6 refactor(): refactoring PR #7141 2017-01-31 07:57:39 +01:00
Torkel Ödegaard c400b5cf63 Merge branch 'master' of github.com:grafana/grafana 2017-01-31 07:48:44 +01:00
Torkel Ödegaard 1a9aaa4138 feat(server side png rendering): added timezone parameter for server side rendering, refactoring PR #7264 2017-01-31 07:48:10 +01:00
Torkel Ödegaard 830491fa66 Merge branch 'time-offset-to-image' of https://github.com/ryu1-sakai/grafana into ryu1-sakai-time-offset-to-image 2017-01-31 06:28:54 +01:00
Pavlos Daoglou 3e741315b4 [3743] Adds support for user search based on login or email (#7334)
* [3743] Adds support for user search based on login or email

* Use query parameter instead

* Use macaron Query() instead
2017-01-31 06:25:55 +01:00
Stanislav Vetlovskiy bd4eadf69c #7383 Fix factory typo in telegram notifier (#7406) 2017-01-31 06:23:19 +01:00
bergquist 3c304b9b88 tech(build): disable builds for master 2017-01-30 16:24:50 +01:00
bergquist cefb4103a7 tech(build): disable build based on tag 2017-01-30 16:03:55 +01:00
bergquist dd982ac9a2 tech(build): dont include buildnumber when building tags 2017-01-30 15:23:38 +01:00
bergquist ac6b5ea796 tech(build): option to not include buildIteration in package name 2017-01-30 15:21:39 +01:00
bergquist 163036591d tech(build): fixes broken build 2017-01-30 15:04:55 +01:00
bergquist 2de8cdb85c tech(build): remove unused deps 2017-01-30 14:28:39 +01:00
bergquist 7307e6345b tech(build): remove sha calc from build step 2017-01-30 13:58:39 +01:00
bergquist 6de13e081b tech(build): deploy builds for each commit to master 2017-01-30 10:37:14 +01:00
Jay Linski 91513f0bc0 Remove deprecated dataproxy logging setting (#7398)
This should have been removed in 06440ef57b, but was probably forgotten.

Solves #6718.
2017-01-30 08:14:44 +01:00
Torkel Ödegaard b191638f41 feat(packaging): Make config file not part of package to simplify upgrade, made commit always a short sha, changed RESTART_ON_UPGRADE to true by default, #7399, #7227 2017-01-30 08:08:37 +01:00
Torkel Ödegaard 2a09d4a5a6 fix(): conf file had left over of old config key, #7395 2017-01-30 07:11:12 +01:00
Oleksandr Kushchenko edba465a75 add DeliveryStreamName dimension to AWS/Firehose Cloudwatch namespace (#7388) 2017-01-28 08:30:57 +01:00
lpic 5b699dbf0d Set time when testing ES datasource, fixes #7044 (#7390) 2017-01-28 08:30:33 +01:00
Kit Westneat cddc9ac0a7 file_export.ts: #5325 missed exportTableDataToCsv when adding sep (#7391) 2017-01-28 08:29:57 +01:00
bergquist 1fee26925f Merge branch 'new_deploy' 2017-01-27 15:55:42 +01:00
bergquist 4b6aaec880 tech(build): create sha files after signing packages 2017-01-27 15:54:19 +01:00
bergquist a634bd0ce8 tech(build): sign and deploy packages to s3 2017-01-27 15:21:16 +01:00
bergquist feed804a0e tech(build): updates path to signing file 2017-01-27 15:21:16 +01:00
bergquist 0cc21669f4 tech(build): adds package signing step 2017-01-27 15:21:16 +01:00
bergquist 46e4a54a6e style: go fmt with simplify 2017-01-27 15:21:02 +01:00
bergquist 1df9c2cab3 docs(changelog): adds note about closing #7377 2017-01-27 08:54:23 +01:00
Carl Bergquist b3847a3738 Merge pull request #7377 from solugebefola/patch-3
Disable sign out for AuthProxyEnabled
2017-01-27 08:51:32 +01:00
Solar Olugebefola de7edb40f5 Disable sign out for AuthProxyEnabled
Sign out was disabled for AuthProxyEnabled in #3122.  This is to catch the one other instance of a sign out link in the side menu.
2017-01-26 13:10:33 -05:00
Torkel Ödegaard 2f4da15264 fix(http api): throw validation error if missing property in call to /api/admin/users/123/permissions, #7365 2017-01-26 08:54:51 +01:00
Ryan McKinley a656d01bf5 append windows phantomjs with .exe (#7065) 2017-01-25 14:49:09 +01:00
Torkel Ödegaard 9b8760bad7 packaging(): fix rpm & SUSE compatability issue, #7293 2017-01-25 14:42:19 +01:00
Torkel Ödegaard 7c5ef2c75a Merge branch 'connection-reset-shared_tooltip' 2017-01-25 14:35:02 +01:00
Torkel Ödegaard 28f890e42f refactor(): removed commented out code 2017-01-25 14:34:55 +01:00
Torkel Ödegaard 23eab81cbe fix(): fixed minor issue with single stat tooltip, #7357 2017-01-25 14:11:30 +01:00
Torkel Ödegaard e073d20731 updated sample config 2017-01-25 13:34:02 +01:00
Torkel Ödegaard f196ffa07d updated docs 2017-01-25 13:33:27 +01:00
Torkel Ödegaard 40d39f8a3e refactor(): renaming alerting hide ui option, #7318 2017-01-25 13:32:26 +01:00
Torkel Ödegaard fee4846429 Merge branch 'alerting_ui' of https://github.com/smalik03/grafana into smalik03-alerting_ui 2017-01-25 13:16:48 +01:00
Torkel Ödegaard 4e30aa9da2 docs(): changelog updated with #7112 2017-01-25 12:32:59 +01:00
Naoufel JAMALI 4e1d8c9ced Elasticsearch - Term aggregation limit fix (should fix #7112) (#7338)
* Elasticsearch - Term aggregation limit fix  (should fix #7112)

* Elasticsearch - Term aggregation limit fix
2017-01-25 12:29:41 +01:00
bergquist b6305a6577 tech(build): dont upload packages from master 2017-01-24 15:24:43 +01:00
bergquist d5e753adbc tech(build): fixes circle.yml format issue 2017-01-24 14:01:50 +01:00
bergquist 3d6698389b tech(build): adds s3 bucket for nightly 2017-01-24 13:58:37 +01:00
bergquist f7993db73c tech(build): installs yarn in build image 2017-01-24 11:26:03 +01:00
bergquist 66fa12835a tech(build): replace grafana_branch with circle_branch; 2017-01-24 11:26:03 +01:00
bergquist 6b70fb2729 tech(build): fixes broken yum installer 2017-01-24 11:26:03 +01:00
bergquist 5f0033f3eb tech(build): path to build relative 2017-01-24 11:26:03 +01:00
bergquist ac111bc238 tech(build): cache golang downloads. DUH! 2017-01-24 11:26:03 +01:00
bergquist 5be00191ec tech(build): Dockerfile for building grafana 2017-01-24 11:26:03 +01:00
bergquist e504e5aaf6 tech(build): avoids setup since all deps should be in /vendor 2017-01-24 11:26:03 +01:00
bergquist 1339ce80f5 tech(build): moves builds script into main repo 2017-01-24 11:26:03 +01:00
Chris Burkhart b1888fb8eb Update building_from_source.md (#7340)
Add a note about the `go get` warning that the user sees when following the setup instructions.
2017-01-24 08:31:10 +01:00
bergquist 9b57005540 tech(build): makes npm paths absolute 2017-01-23 15:53:47 +01:00
bergquist 3d5efd3350 tech(build): removes coveralls 2017-01-23 15:53:16 +01:00
Carl Bergquist 3d3958e694 Merge pull request #7328 from jubicoy/master
Added commonly used kilo-prefixed energy units
2017-01-23 13:56:35 +01:00
Torkel Ödegaard 697d0867fa fix(Elasticsearch): fix for alias patterns that refers to term that is numeric zero, fixes #7323 2017-01-23 10:15:02 +01:00
Teemu Huhtala 03eb98e94d Added commonly used kilo-prefixed energy units
Kilovolt-ampere reactive (kvar)
Kilovolt (kV)
Kiloampere (kA)
2017-01-23 10:20:11 +02:00
Torkel Ödegaard 8eae09e5e6 docs(): updated changelog with info on #7324 2017-01-23 07:29:16 +01:00
lpic cf9790fc4c ES - Support for min_doc_count on group by terms (#7324) 2017-01-23 07:26:42 +01:00
lpic a0c8380baf ES: Change bool queries to use 'filter' clause (#7313)
Change all bool queries to use 'filter' clause instead of 'must' for
better performance
2017-01-21 08:31:29 +01:00
Chris Bentivenga 9151b4034a annotationsQuery -> annotationQuery (#7321)
Documentation calls for `annotationQuery` but the [example](https://github.com/grafana/simple-json-datasource/blob/205cf4cfbce95cd455da97c7972b64538cc80ab3/src/datasource.js#L41) uses the method name `annotationQuery`
2017-01-21 08:29:21 +01:00
smalik 9862c9ff40 feat(alerting): Show/hide alerting UI using configuration variable
Use configuration variable "show_alerting_ui" to show/hide alerting UI
2017-01-20 10:43:29 -05:00
Axel Pirek 4b8f2aeb36 Fix tooltips sometimes rendering outside of graph panel
I noticed tooltips on other panels rendering outside of their panel or
even the browser window when hovering on the very edge of graphs with
relative time overrides.
2017-01-19 13:33:49 +01:00
Axel Pirek 138a79c2fb Clear highlight when clearing tooltip and crosshair 2017-01-19 11:08:32 +01:00
Axel Pirek ee58a6ee2b Speed up tooltip value retrieval 2017-01-19 10:16:28 +01:00
Axel Pirek a2e6408be1 Only render tooltip if position is in viewport 2017-01-19 10:16:20 +01:00
bergquist 57099f0273 docs(changelog): adds note about closing #7301 2017-01-19 09:33:53 +01:00
bergquist 09b61caa65 Merge branch 'huydx-notify-line' 2017-01-19 09:30:13 +01:00
bergquist f5d8a75381 tech(webhook): remove redundant if statement 2017-01-19 09:29:40 +01:00
huydx 376d2d56bf (feature) add LINE notify to notifier 2017-01-19 17:26:53 +09:00
Adrián López e1b82e72eb Fix empty value tags and comma separated values (#7289)
When a tag doesn't have a value it was showing a empty 'bubble'.
If value has several values separated by commas, make a 'bubble' for
each one.
2017-01-18 16:02:40 +01:00
bergquist 94e901793a docs(guides): rearranges menu order 2017-01-17 14:56:11 +01:00
bergquist 96fbe404f8 docs(changelog): adds note about closing #7268 2017-01-17 12:19:46 +01:00
bergquist 55af92eba1 fix(table): fixes broken annotation rendering
closes #7268
2017-01-17 12:17:18 +01:00
bergquist 2dd1eb81cd docs(changelog): adds note about closing #7223 2017-01-17 10:49:31 +01:00
bergquist 4ea4e0436a feat(mailer): set localname to hostname
Some email providers does not accept localhost
in the HELO message. So we set it to hostname
instead. Our hope is that should be enough for
those providers who does not accept localhost.

closes #7223
2017-01-17 10:36:04 +01:00
bergquist 276916cd5d docs(changelog): note about closing #7035 2017-01-17 10:05:56 +01:00
bergquist ed9595a20d Merge branch 'show_no_data_in_list' 2017-01-17 09:53:38 +01:00
bergquist e78da57e4d feat(alerting): shows when no_data triggered alerts
closes #7035
ref #7257
2017-01-17 09:49:25 +01:00
Torkel Ödegaard 0683742e83 tech(library upgrade): fixed unit test broken by angularjs upgrade, #7274 2017-01-16 22:27:35 +01:00
Torkel Ödegaard 6f87f88690 tech(lib upgrade): upgraded angularjs from 1.5.8 to 1.6.1, closes #7274 2017-01-16 21:31:55 +01:00
Torkel Ödegaard 710d07d7a5 Merge branch 'mtanda-clipboard_js' 2017-01-16 21:08:47 +01:00
Torkel Ödegaard c5955bacd2 refactor(): minor refactor 2017-01-16 21:08:39 +01:00
Torkel Ödegaard 09cec8535e Merge branch 'clipboard_js' of https://github.com/mtanda/grafana into mtanda-clipboard_js 2017-01-16 20:57:16 +01:00
Mitsuhiro Tanda d683b0379b fix monkey patch for clipboard.js 2017-01-17 01:12:37 +09:00
bergquist f29f83ca75 chore: adds comment out why the code was added 2017-01-16 15:04:53 +01:00
bergquist 3c9357a2e9 fix(alerting): supports lowercase metrics
this fix is due to EvalMatch now serailize as lower case.

ref #7257
2017-01-16 15:01:57 +01:00
bergquist 01c6658a7a docs(changelog): adds note about closing #7269 2017-01-16 14:42:31 +01:00
bergquist bfa3c590e7 fix(alertlist): changes scroll to auto
close #7269
2017-01-16 14:38:01 +01:00
bergquist 22601fa736 docs(changelog): adds note about closing #7209 2017-01-16 12:48:29 +01:00
bergquist 76c9f62265 Merge branch 'Ricky-N-feature/dataProxyAuditLog' 2017-01-16 12:44:40 +01:00
bergquist 06440ef57b tech(dataproxy): moves cfg to [dataproxy] 2017-01-16 12:43:59 +01:00
bergquist d4a96b9741 tech(dataproxy): make the code a little bit more defensive 2017-01-16 12:24:08 +01:00
bergquist dd84fb563a style(dataproxy): renames log functions 2017-01-16 12:23:49 +01:00
bergquist 51bca7d84b tech(dataproxy): moves all parameters to Info call 2017-01-16 12:16:41 +01:00
bergquist 839eb97061 Merge branch 'feature/dataProxyAuditLog' of https://github.com/Ricky-N/grafana into Ricky-N-feature/dataProxyAuditLog 2017-01-16 12:02:43 +01:00
xginn8 873a8bc520 wrap the title of a panel and dashboard search results. fixes #7203 (#7213) 2017-01-16 12:02:07 +01:00
bergquist ee1c15b9cc docs(changelog): adds note about closing #7234 2017-01-16 11:54:38 +01:00
bergquist 99f18f9d69 merge branch 'oliverpool-diff-aggregate' 2017-01-16 11:52:34 +01:00
bergquist 480a58d377 Merge branch 'diff-aggregate' of https://github.com/oliverpool/grafana into oliverpool-diff-aggregate 2017-01-16 11:52:22 +01:00
bergquist 8a8de91a8b Merge branch 'andrewhowdencom-master' 2017-01-16 11:50:23 +01:00
bergquist 2fdb47ae97 docs(prometheus): rewrote and shorten the note about templates 2017-01-16 11:50:12 +01:00
bergquist 2696d6cd3f Merge branch 'master' of https://github.com/andrewhowdencom/grafana into andrewhowdencom-master 2017-01-16 11:47:13 +01:00
bergquist c73e86e557 docs(testdata): some minor changes 2017-01-16 11:21:23 +01:00
bergquist ae08386ce3 docs(testdata): adds docs page about test datasource 2017-01-16 11:13:52 +01:00
bergquist 92f0a22fd7 docs: moves datsources pages to feature folder 2017-01-16 11:13:27 +01:00
bergquist bd414c1793 docs: moves panels to panel folder 2017-01-16 08:17:37 +01:00
bergquist 20bdc48f13 docs(guides): remove (Latest) from menu name 2017-01-16 08:15:47 +01:00
bergquist f4713956f0 tech: updates latest.json to 4.1.1 2017-01-16 07:07:32 +01:00
bergquist eb8d1dfa34 docs(smtp): adds info about how to use passwords with #
closes #7265
2017-01-16 07:03:35 +01:00
bergquist 62eaa683c0 docs(changelog): note about closing #7256 2017-01-16 07:00:51 +01:00
And^Cw Howden 6edbc4604c Add additional documentation about Prometheus + Templated queries 2017-01-15 20:56:53 +01:00
Ryuichi Sakai 1bc55a2d38 Enable image rendering to use browser time offset 2017-01-15 22:01:28 +09:00
Torkel Ödegaard e5a6c523d7 Merge branch 'master' of github.com:grafana/grafana 2017-01-13 17:39:41 +01:00
Torkel Ödegaard 49fe74228b fix(browser history): fixes and enhancements to browser history, it now works properly again AND it can restore previous time ranges in dashboards, closes #7259 2017-01-13 17:37:53 +01:00
Carl Bergquist c43bb7fb99 Extractor should not modify dashboard json (#7256)
* test(dashboard): tests that he extractor does not modify original json

* feat(extractor): validate a cloned version of the dashboard json
2017-01-13 15:46:23 +01:00
bergquist 2d441bfb37 docs(changelog): note about closing #7149 2017-01-13 15:20:15 +01:00
Carl Bergquist 1efeaafdbf Merge pull request #7249 from grafana/alerting_test_alertrule
Enable error and no_data overrides when testing alerting.
2017-01-13 15:18:02 +01:00
Torkel Ödegaard deff24d2c1 Merge branch 'clipboard_js' of https://github.com/mtanda/grafana into mtanda-clipboard_js 2017-01-13 14:57:23 +01:00
Torkel Ödegaard d354f3a8af fix(alerting): fixed evaluation for no_value condition, fixes #7244 (#7247)
* fix(alerting): fixed evaluation for no_value condition, fixes #7244

* feat(alerting): moving null library into grafana, fixing handling on no value / no series
2017-01-13 12:32:30 +01:00
bergquist 0873d493c2 feat(alerting): moves getNewState to evalHandler
closes #7149
2017-01-13 11:02:24 +01:00
rrickardt bccdd7cad1 Update postinst (#7233)
With present postinst script on Centos 7, restart after upgrade is not working with Warning: grafana-server.service changed on disk. Run 'systemctl daemon-reload' to reload units.

So i added systemctl daemon-reload.
2017-01-13 06:27:36 +01:00
Tomas Varneckas 54c456ec5b Make API key usage example meaningfully runable (#7243) 2017-01-13 06:25:49 +01:00
Mitsuhiro Tanda 1672ca4edb call clipboard destroy() 2017-01-13 02:58:44 +09:00
Mitsuhiro Tanda 3df119002d patch for clipboard.js work 2017-01-13 02:19:02 +09:00
Carl Bergquist 13178d99d4 Merge pull request #7240 from tomasv/fix-tags-api-doc
Fix typo in tags API documentation example request
2017-01-12 17:08:14 +01:00
Tomas Varneckas 9449e93e1e Fix typo in tags API documentation example request 2017-01-12 17:55:43 +02:00
oliverpool 80c67267e8 Add the diff option on the singlestat panel 2017-01-12 16:23:57 +01:00
oliverpool 92a0b402c5 Add diff documentation 2017-01-12 16:22:41 +01:00
oliverpool 2b932492c2 Add a diff aggregate
`diff = current - first` (when available)
2017-01-12 16:19:18 +01:00
bergquist 60a2041065 tech(build): yarn install should use --pure-lockfile 2017-01-12 15:36:44 +01:00
bergquist 915b1efab9 tech(build): updates deps in yarn 2017-01-12 15:33:07 +01:00
bergquist 9a35d82e51 docs(singlestat): its called avg in grafana
ref #7234
2017-01-12 13:36:10 +01:00
bergquist 35db025b0a docs(installation): updates docs for 4.1.1 2017-01-12 10:38:23 +01:00
Torkel Ödegaard 821876a85b Merge branch 'master' of github.com:grafana/grafana 2017-01-11 19:48:17 +01:00
Torkel Ödegaard b8b517cd3f docs(): updated changelog 2017-01-11 19:48:06 +01:00
Mitsuhiro Tanda 4b567e35d5 suppress refresh when user is inactive (#7219) 2017-01-11 19:46:34 +01:00
Torkel Ödegaard f045fbf267 Merge branch 'master' of github.com:grafana/grafana 2017-01-11 19:40:59 +01:00
Torkel Ödegaard 9c0f7f547b fix(alerts): added alert listener for appEvents 2017-01-11 19:40:05 +01:00
Mitsuhiro Tanda db2718a699 remove zero_clipboard.js 2017-01-12 02:37:32 +09:00
Mitsuhiro Tanda 1571072c18 use clipboard.js 2017-01-12 02:37:29 +09:00
Mitsuhiro Tanda 5ccbe6d40b add clipboard.js 2017-01-12 02:22:56 +09:00
Ricky Niemi 0b48e48e3d Small whitespace fix on setting file 2017-01-11 07:51:46 -08:00
Ricky Niemi 269d16301a Rename to audit logging to data proxy logging 2017-01-11 07:40:06 -08:00
Ricky Niemi 0fee7c863a Gate data proxy audit logging behind audit_logging server setting 2017-01-11 07:22:57 -08:00
Torkel Ödegaard 61214899bd docs(): updated changelog 2017-01-11 15:26:08 +01:00
Torkel Ödegaard bd8899b37d fix(graph): fixed table legend min-height, fixes #7221 2017-01-11 15:24:43 +01:00
Torkel Ödegaard edae622d8f docs(): updated changelog 2017-01-11 14:04:34 +01:00
Mitsuhiro Tanda 7e4c101d02 S3 IAM support (#7058)
* add s3 dependencly

* rewrite image uploader by aws-sdk-go

* improve backward compatibility of s3 image uploading

* set default for expires option

* remove acl and expires
2017-01-11 14:00:49 +01:00
Lee Briggs 2e796da441 Add support for sensu notifications (#7207) 2017-01-11 13:57:07 +01:00
Torkel Ödegaard 64f5146a62 change(text panel): removed rarely used (and not properly working), text mode option, closes #6389, closes #7214 2017-01-11 12:33:12 +01:00
Torkel Ödegaard cdc7da3ae1 docs(): updated changelog 2017-01-11 12:16:34 +01:00
Torkel Ödegaard b48273d1cf Merge branch 'master' of github.com:grafana/grafana 2017-01-11 12:11:38 +01:00
Torkel Ödegaard 149dd78298 Merge branch 'built_in_template_variables' 2017-01-11 12:10:33 +01:00
Torkel Ödegaard b475f91387 feat(templating): completed work on built in template variables and , closes #7190, refactors #7170 2017-01-11 12:10:26 +01:00
bergquist 5e14f4a16e tech(build): changes build for 4.1 release 2017-01-11 11:07:01 +01:00
bergquist 8574f100aa docs(guides): removes beta info for 4.1 2017-01-11 10:50:41 +01:00
Torkel Ödegaard 44b7a26119 fix(graph): fix for table legend and scroll, fixes #7204, fixes #6628 2017-01-11 10:35:52 +01:00
Torkel Ödegaard 8c39cd35f0 progress on interval built in variable 2017-01-11 10:18:21 +01:00
bergquist f4e9bd507b tech(build): updates packagecloud script 2017-01-11 08:59:44 +01:00
Utkarsh Bhatnagar 7e3ccdf983 Fixed opentsdb templating bug (#7208) 2017-01-10 21:35:05 +01:00
Ricky Niemi d9cbb994b8 Clean up audit log formatting and code 2017-01-10 11:42:03 -08:00
bergquist 6518a0f765 Merge branch 'docs-4.1' 2017-01-10 15:37:07 +01:00
bergquist 50b937dcb1 tech(build): updates docs to 4.1.0 2017-01-10 15:36:54 +01:00
bergquist 4d0b5ca14a tech(build): upgrades appveyour nodejs version 2017-01-10 15:01:53 +01:00
bergquist 381f8d4475 docs(changelog): adds note about closing #7195 2017-01-10 10:30:28 +01:00
Ricky Niemi d03977ac0e Add initial audit logging to data proxy 2017-01-09 22:59:43 -08:00
Carl Bergquist edf868d46b Merge pull request #7195 from theisenmark/webhook-username
Fix webhook username mismatch
2017-01-09 18:03:34 +01:00
Mark Theisen afda9cbb2d Fix webhook username mismatch
Fixing variable name mismatch so that the Authorization HTTP header is added to webhook notifications.
2017-01-09 17:18:53 +01:00
bergquist 4f216f22e9 docs(http): fixes typos 2017-01-09 16:49:06 +01:00
Torkel Ödegaard e218837380 began work on built in template variables, #7190 2017-01-09 15:31:19 +01:00
Carl Bergquist bcfe048aae Merge pull request #7184 from simnv/git-via-https
Use HTTPS instead of git to download tether-drop package
2017-01-09 07:15:01 +01:00
Valeriy Simonov 1aa1f7b12c Use https instead of git for tether-drop
git protocol (tcp/udp/9418) is forbidden when using some corporate
proxies. HTTPS is used more widely.
2017-01-09 10:00:07 +05:00
Valeriy Simonov 5bfe0ab237 Merge remote-tracking branch 'grafana/master' 2017-01-09 09:37:19 +05:00
Vitaliy Fuks 7c376f2bda Fixed typo. (#7181) 2017-01-08 09:43:17 +01:00
Mekal Zheng e57c764410 check validation of interval string before converting to seconds 2017-01-07 18:17:44 +08:00
Mekal Zheng 333aeb43c4 use methods of kbn to convert interval string to both second and millisecond 2017-01-07 16:33:40 +08:00
Mekal Zheng af798092b7 add variable $intervalSecond 2017-01-07 00:28:32 +08:00
Torkel Ödegaard 53fbb8b074 docs(changelog): added entry for telegram notifier, #7098 2017-01-06 12:19:39 +01:00
Torkel Ödegaard 31bd725559 Merge branch 'notifier-refactor' 2017-01-06 12:17:34 +01:00
Torkel Ödegaard eca918c0e7 Merge branch 'master' of github.com:grafana/grafana 2017-01-06 12:15:12 +01:00
Torkel Ödegaard 69d31c560d bumped master to 4.2 2017-01-06 12:14:58 +01:00
Mitsuhiro Tanda dfaefe34a4 add cloudwatch region (#7161) 2017-01-06 12:05:27 +01:00
Torkel Ödegaard b8f559aecb feat(plugins): made notifiers more pluggable and easier to support many of them, new ones can now be added without modifying any existing file, #7162 2017-01-06 12:04:25 +01:00
Torkel Ödegaard d6a2431767 Merge branch 'notifier-telegram-messenger' of https://github.com/leonoff/grafana into leonoff-notifier-telegram-messenger 2017-01-06 10:27:20 +01:00
Torkel Ödegaard 45d2e70ba7 feat(dashboard): sorting dashboard model kekeys, refactoring PR #7139 2017-01-06 10:09:11 +01:00
Torkel Ödegaard c472054f21 Merge branch 'master' into dashboard-export 2017-01-06 07:50:16 +01:00
Carl Bergquist e61d049623 tech(build): replace npm with yarn (#7108)
* tech(build): replace npm with yarn

* tech(build): change node version for CI
2017-01-06 07:28:43 +01:00
Torkel Ödegaard 7433e8c58f docs(changelog): updated changelog with ES PR #7154 2017-01-06 07:24:56 +01:00
Torkel Ödegaard 20b7c2f2e2 feat(ES): refactoring PR #7154 2017-01-06 07:22:37 +01:00
Torkel Ödegaard 293fd93e6c fix(elasticsearch): fixed predict default value, fixes #7145 2017-01-06 07:06:41 +01:00
Torkel Ödegaard 6960fb46c2 fix(build): remove triggering full package release on every commit, #6970 2017-01-06 06:51:17 +01:00
Torkel Ödegaard 813232315e fix(testdata): fixed test data source build issue 2017-01-06 06:50:02 +01:00
Torkel Ödegaard 63f6e86e46 feat(ES): better support for text type, closes #7151 2017-01-06 06:35:08 +01:00
Torkel Ödegaard 658d39944b feat(elasticsearch): add support for Elasticsearch scaled_type number type, closes #7155 2017-01-06 06:12:48 +01:00
Vaibhav Tandon b97e784555 Moving average support for all models along with additional settings associated with each model 2017-01-05 23:17:24 +00:00
Matthew McGinn 870c5f8cef adding refresh url param to pass refresh interval #7124 2017-01-05 00:15:52 -05:00
Dan Cech df1e90c723 export sorted dashboard json 2017-01-04 18:13:33 -05:00
Torkel Ödegaard 36929c2a92 fix(elasticsearch): add support for text type filter in templating query, fixes #7136, fixes #7135 2017-01-04 20:14:56 +01:00
Utkarsh Bhatnagar 65057212e7 Org update should throw error if not found (#7066)
* Org update should give error if not found

* Used affected rows
2017-01-03 09:21:18 +01:00
bergquist d8ebebc612 docs(http_api): adds docs for alerting in http api 2017-01-03 08:12:18 +01:00
bergquist 9a3e51894b tech(alerting): remove unused property 2017-01-03 08:11:17 +01:00
Torkel Ödegaard 9dc42648cf fix(templating): fixed issue with experimental feature template variable value groups tags, fixes #6752 2017-01-02 13:32:20 +01:00
bergquist 2e7d222f6e Revert "tech: remove unused code"
This reverts commit d9131be0a5.
2017-01-02 13:22:37 +01:00
bergquist d9131be0a5 tech: remove unused code 2017-01-02 13:11:09 +01:00
Torkel Ödegaard 2be5ee0bd5 fix(graph): fixed graph legend issue with always visible scrollbar, fixes #6828 2017-01-02 12:22:56 +01:00
Torkel Ödegaard 083a42942f fix(phantomsj): fixed issue with y axis label rotation in phantomjs rendered graphs, fixes #6924 2017-01-02 12:01:48 +01:00
Torkel Ödegaard 8030b56bba fix(panel): fixed panel help text for panels that set background color, fixes #7085 2017-01-02 11:14:00 +01:00
Mitsuhiro Tanda 9855ea8c6c handle sts error (#7088) 2016-12-30 16:59:06 +01:00
bergquist 08bad530dc tech(build): fail when go fmt fails 2016-12-30 15:08:31 +01:00
Mikhail Leonov e32a653cb6 Added Telegram Messenger notification destination 2016-12-30 15:57:12 +03:00
Julie Lee 8ed8922525 Update _tabbed_view.scss (#7078)
repeated style statement
2016-12-28 12:28:05 +01:00
Carl Bergquist c97131d1a0 Merge pull request #7074 from ksatirli/master
Adds London and Canada AWS Regions
2016-12-27 16:32:56 +01:00
Kerim Satirli 48b57afe84 Adds London and Canada AWS Regions 2016-12-27 14:25:12 +01:00
Kerim Satirli 797e2ea25d Adds London and Canada AWS Regions 2016-12-27 14:10:36 +01:00
Vitaliy Fuks 716d6473b7 Fixed typo. (#7064) 2016-12-27 11:35:00 +01:00
Darrian d662961ebe Added 'linear' to fill types for InfluxDB (#7042) 2016-12-23 09:43:47 +01:00
Ryan McKinley 27d83f414e Add influx 'mode' and 'cumulative_sum' (#7045) 2016-12-23 09:43:15 +01:00
James Blackburn f98e07e012 Fix auto_assign_org_role = Read Only Editor docs (#7057)
`auto_assign_org_role` should be `Read Only Editor` rather than `Read-Only Editor`
2016-12-23 09:41:28 +01:00
bergquist fef511d403 docs(conf): adds docs about supporting database_url
closes #1878
2016-12-21 23:39:08 +01:00
bergquist c18741c605 docs(ldap): adds note about special chars in password
closes #5337
2016-12-21 22:02:34 +01:00
bergquist 02bf83b37e docs: fixes broken code formating 2016-12-21 15:35:55 +01:00
Torkel Ödegaard fad07f0d15 refactor(http): refactoring http server 2016-12-21 14:36:32 +01:00
bergquist 8859eeb151 docs(readme): adds link to 4.1 beta release 2016-12-21 12:35:54 +01:00
bergquist a7b3ef06a8 docs: update image in github repo 2016-12-21 12:31:25 +01:00
Carl Bergquist 70f37651be Merge pull request #7034 from Timosha/add-ruble-sign
add Russian ruble sign
2016-12-21 11:10:01 +01:00
Timon 1ab66ac5d7 add Russian ruble sign 2016-12-21 12:59:09 +03:00
bergquist cb21b20905 docs(changelog): adds note about closing #6997 2016-12-21 10:05:56 +01:00
bergquist 4e306590f8 Merge branch 'v4.0.x' 2016-12-21 10:02:28 +01:00
bergquist 8cef4cc74e fix(influxdb): handles time(auto) like time($interval)
closes #6997
2016-12-21 10:01:20 +01:00
Torkel Ödegaard 8bccbdafd2 feat(live): minor progress on stream manager 2016-12-21 09:16:29 +01:00
bergquist c3005397f5 docs: adds guide for whats new in 4.1 beta 2016-12-21 08:33:35 +01:00
bergquist c18b410104 docs: updates release date for 4.1.0 2016-12-20 20:11:38 +01:00
Trent White 5440804109 add new grabber icon and tweak styles to better fit space (#7019) 2016-12-20 17:49:04 +01:00
Torkel Ödegaard b7827962dc feat(live): just wanted to checkout how far I got on the websocket data source 2016-12-20 16:09:04 +01:00
bergquist 1c8865e702 docs: updates links to windows beta build 2016-12-20 16:08:05 +01:00
Torkel Ödegaard 1507d6c872 Merge branch 'master' of github.com:grafana/grafana 2016-12-20 15:30:10 +01:00
Torkel Ödegaard 4c5bdd9da4 fix(panel): need to check if panel has links 2016-12-20 15:24:53 +01:00
bergquist 48fbd7e134 docs: add note about closing #4079 2016-12-20 14:46:05 +01:00
bergquist afa5e9507a docs: updates install links for 4.1.0 beta 2016-12-20 13:15:59 +01:00
Utkarsh Bhatnagar 13c4ce68ee Added name and id in response of create/update (#7016) 2016-12-20 13:02:26 +01:00
Torkel Ödegaard fa01022494 fix(ux): fixed css issue with add row button, fixes #7017 2016-12-20 13:00:46 +01:00
Torkel Ödegaard e81e4ad06f updated websocket lib 2016-12-20 11:36:11 +01:00
bergquist 034db646ab release v4.1.0-beta1 2016-12-20 11:25:58 +01:00
bergquist 2660609c40 tech(build): adds scripts for only uploading to testing 2016-12-20 11:12:19 +01:00
bergquist ba96b88b66 feat(alerting): adds 24h and 48h duration as pre defined values
ref #7007
2016-12-20 09:23:05 +01:00
bergquist 80d438ca49 chore(alerting): removes double logging 2016-12-20 08:34:44 +01:00
bergquist 0c857e0ed8 docs(http): adds info about mass pausing alerts 2016-12-19 16:45:46 +01:00
bergquist a230ff65a9 fix(alerting): typo 2016-12-19 16:44:59 +01:00
bergquist 8d6c94b9f9 docs(changelog): adds note about closing #6589 2016-12-19 16:42:11 +01:00
Carl Bergquist 9135abf3ae Merge pull request #6996 from bergquist/pause_all_alerts
Pause all alerts
2016-12-19 16:38:44 +01:00
Torkel Ödegaard 164de5e3ce Merge branch 'master' of github.com:grafana/grafana 2016-12-19 16:36:26 +01:00
Torkel Ödegaard a2baec8592 fix(panel): fixed panel help tooltip issue, #4079 2016-12-19 16:36:09 +01:00
bergquist 6c2c3c7e24 Revert "fix(alerting): pause dto can only pause one"
This reverts commit b2c5a6a037.
2016-12-19 16:07:55 +01:00
bergquist b2c5a6a037 fix(alerting): pause dto can only pause one 2016-12-19 16:05:24 +01:00
bergquist 71f406558e tech(alerting): remove comments 2016-12-19 15:40:09 +01:00
bergquist a2257ec3d0 tech(alerting): renames pause all method 2016-12-19 15:17:49 +01:00
bergquist ecf44d4d9c tech(): go fmt code 2016-12-19 13:26:42 +01:00
bergquist ecdf1888c4 feat(alerting): removes pause per datasource 2016-12-19 13:24:45 +01:00
Torkel Ödegaard 090db9401c fix(graph): fix for when data min/max delta is zero and negative and grid y min/max is auto, fixes #6980 2016-12-19 09:30:52 +01:00
Torkel Ödegaard 3be77ad293 fix(docs): fixed spelling in docs article 2016-12-19 08:42:37 +01:00
bergquist 6b9db0c0c5 style(alerting): simplify support for pausing multiple alerts 2016-12-19 08:18:42 +01:00
Torkel Ödegaard 0a0b4f5533 Merge branch 'info-corner-refinements' 2016-12-16 21:17:47 +01:00
Torkel Ödegaard 2fc2cc721e change(panel): changed hover delay for #6998 2016-12-16 21:16:35 +01:00
Matt 594207b6d3 Polish on icon placement, incorporated torkel's better idea for going slightly lighter, make sure error icon color was white now 2016-12-16 12:51:22 -05:00
Matt 0c85e845df Softened the color a bit by mixing in the panel-bg, so it's not introducing any new variables. Was too start as pure body-bg 2016-12-16 12:11:29 -05:00
bergquist 86f148be48 docs(paths): updates relative path on /installation/ page 2016-12-16 17:42:40 +01:00
bergquist 30022b0d0b docs(paths): adds aliase for rpm and debian install
got reports on twitter about broken links.
2016-12-16 17:36:01 +01:00
bergquist 686f598d44 docs(changelog): adds note about closing #6473 2016-12-16 17:11:33 +01:00
bergquist 4244551a87 fix(influxdb): removes quotes for field key queries
fixes #6473
2016-12-16 17:09:17 +01:00
Torkel Ödegaard 3a9680939e Merge branch 'master' of github.com:grafana/grafana 2016-12-16 16:09:59 +01:00
Torkel Ödegaard a361d1f488 feat(panel): refinements for panel help text, made the inspector the home for the model version 2016-12-16 16:09:02 +01:00
bergquist 4ef95cfd31 style(api): reduce code complexity 2016-12-16 16:07:23 +01:00
bergquist c45ad965d1 chore(github): typo 2016-12-16 15:50:29 +01:00
bergquist 1f8f3ed038 style(api): extracts filter logic for mass pause 2016-12-16 15:19:13 +01:00
bergquist fb6aa0e026 feat(api): adds endpoint for mass pausing alerts
ref #6589
2016-12-16 15:00:58 +01:00
Torkel Ödegaard 2c05237d90 Merge branch 'master' of github.com:grafana/grafana 2016-12-16 13:47:22 +01:00
Torkel Ödegaard c04590784b Merge branch 'utkarshcmu-help-text' 2016-12-16 13:43:51 +01:00
Torkel Ödegaard af363ab478 fix(panel): build fixes 2016-12-16 13:43:43 +01:00
Torkel Ödegaard 62f3b16671 feat(panel): working on panel help text and unifying panel links, panel errors, and panel help into a single panel feature, #4079 , #6847 2016-12-16 13:06:04 +01:00
Torkel Ödegaard ac9ae52cea feat(panel): working on panel help text and unifying panel links, panel errors, and panel help into a single panel feature, #4079 , #6847 2016-12-16 12:46:29 +01:00
Torkel Ödegaard b9043c915e feat(panel): working on panel help text, #4079 , #6847 2016-12-16 11:48:32 +01:00
Mitsuhiro Tanda bc8d27737f fix cloudwatch docs (#6992) 2016-12-16 11:31:02 +01:00
Mitsuhiro Tanda 81394fcaa4 add cloudwatch internal metrics (#6990) 2016-12-16 10:48:05 +01:00
Mitsuhiro Tanda f8d6902428 fix cloudwatch percentile (#6989) 2016-12-16 10:47:41 +01:00
Torkel Ödegaard ca7bc25c83 feat(panel): working on panel help text, #4079 , #6847 2016-12-16 10:34:00 +01:00
bergquist df3adbc0f8 refactor(mqe): reduce duplication 2016-12-16 08:01:58 +01:00
bergquist 830bf5a91c docs(changelog): adds note about closing #6676 2016-12-15 16:31:30 +01:00
bergquist faa3b5f4e8 feat(alertlist): adds sorting on state
closes #6676
2016-12-15 16:29:40 +01:00
bergquist 2264addd9d docs(changelog): adds notes about closing #6905 2016-12-15 14:29:06 +01:00
bergquist c467e48940 feat(notifications): removes html escaping subject
closes #6905
2016-12-15 14:27:33 +01:00
Torkel Ödegaard 597ebb1161 fix(config): fixed issue setting generic oauth name via ENV variable, fixes #6974 2016-12-15 14:08:39 +01:00
Torkel Ödegaard 0c94194a5b Merge branch 'master' of github.com:grafana/grafana 2016-12-15 13:57:05 +01:00
Torkel Ödegaard b50490f080 docs(): changelog updated 2016-12-15 13:56:49 +01:00
Torkel Ödegaard 35b970347a Merge branch 'v4.0.x' 2016-12-15 13:55:26 +01:00
Torkel Ödegaard 497a1fcefc Merge branch 'v4.0.x' of github.com:grafana/grafana into v4.0.x 2016-12-15 13:54:58 +01:00
Torkel Ödegaard 94962b4193 fix(logging): fixed default log level filter option not taking effect, fixex #6978 2016-12-15 13:54:47 +01:00
bergquist 0c8193a6af docs(changelog): adds note about closing #6866 2016-12-15 11:15:06 +01:00
bergquist ca7baca21d feat(alerting): adds ok as no data option
closes #6866
2016-12-15 11:13:19 +01:00
bergquist 6a161216de fix(influxdb): fixes bug with empty tagColumn for annotations 2016-12-15 10:54:22 +01:00
bergquist 51c4385c92 fix(mqe): only parse none empty functions 2016-12-15 08:52:43 +01:00
bergquist f907330c9e tech(mailer): improves error when grafana cannot read open cert/key file
ref #6949
2016-12-15 08:27:21 +01:00
bergquist e3b53fe599 test(mqe): adds test for double function usage 2016-12-15 07:36:06 +01:00
bergquist 7dece3ff0c test(mqe): solves brittle unit test 2016-12-15 07:36:06 +01:00
Torkel Ödegaard 19552450fa Merge branch 'master' of github.com:grafana/grafana 2016-12-14 22:31:11 +01:00
Torkel Ödegaard 435f474e8a docs(): minor fix for docker docs 2016-12-14 22:30:20 +01:00
bergquist dde6e73fed feat(mqe): add basic support for functions list 2016-12-14 22:29:17 +01:00
Solar Olugebefola 1e6210dd41 update broken links (#6961) 2016-12-14 22:20:22 +01:00
Torkel Ödegaard 8fc6e4cfb0 fix(auth proxy, ldap): fixed so users cannot change password when ldap or auth proxy is enabled, fixes #2495, do not allow user to change email or username depending on what property auth proxy is using, fixes #6903 2016-12-14 22:19:25 +01:00
Torkel Ödegaard df562e23cf feat(ldap): better ldap logging, closes #6918 2016-12-14 22:01:02 +01:00
Torkel Ödegaard 6e27db148c Merge branch 'authproxy_ldap' of https://github.com/seuf/grafana into seuf-authproxy_ldap 2016-12-14 21:45:15 +01:00
Torkel Ödegaard 9f69a4d34d clean(): removed old docs file 2016-12-14 21:22:01 +01:00
Torkel Ödegaard c59fd2e8f6 fix(docs): fixed support for old docs url, fixes #6960 2016-12-14 21:21:21 +01:00
Torkel Ödegaard 330c1b945e refactor(datasource): refactoring datasource secure json fields handling, #6697, #6692 2016-12-14 21:06:10 +01:00
Torkel Ödegaard b38e9b0cac fix(cloudwatch): removed debugger statement 2016-12-14 20:40:02 +01:00
Torkel Ödegaard c3920bfba1 fix(cloudwatch): fixed broken cloudwatch edit page, #6697 2016-12-14 20:38:35 +01:00
Torkel Ödegaard 467ddc19c3 feat(panel): worked on panel description tooltip, #6847 2016-12-14 17:22:19 +01:00
bergquist ca6a667555 feat(mqe): renames app tag into cluster 2016-12-14 16:49:16 +01:00
Torkel Ödegaard 5f7ad9ddb6 Merge branch 'help-text' of https://github.com/utkarshcmu/grafana into utkarshcmu-help-text 2016-12-14 16:20:36 +01:00
bergquist f8871f9e4a chore(mqe): remove comments 2016-12-14 16:16:42 +01:00
bergquist 6d57e42246 feat(mqe): restricts the executor to max 4 concurrent outgoing requests 2016-12-14 15:40:15 +01:00
Torkel Ödegaard 7425c63528 fix(dashboard): fixed unit test 2016-12-14 14:42:25 +01:00
Torkel Ödegaard e72a60bbf5 feat(graph): shared graph tooltip is not a select option with 3 options, normal, shared crosshair & shared tooltip, CTRL+O or CMD+O cycles option, closes #6894 2016-12-14 14:33:33 +01:00
Torkel Ödegaard baec2bbe8a fix(firefox): fixed table options tab UX issues, fixes #6900 2016-12-14 13:16:54 +01:00
Torkel Ödegaard 488fe62f15 fix(singletat): fixed/polished layout in singlestat ui options tab 2016-12-14 12:58:20 +01:00
Torkel Ödegaard faf6a5fd36 fixed issue in metric segment and option lookup, #6912 2016-12-14 10:50:48 +01:00
Carl Bergquist 38d8ba8faa Merge pull request #6952 from huydx/format-gofmt
(format) run go fmt in pkg
2016-12-14 09:26:38 +01:00
Carl Bergquist 9cd04768f7 Merge pull request #6953 from huydx/typo-execution
(typo) Exeuction -> Execution
2016-12-14 09:24:54 +01:00
bergquist 9510f21304 docs(changelog): fixes invalid ticket ref 2016-12-14 09:12:22 +01:00
huydx b97f4fd8b9 (typo) Exeuction -> Execution 2016-12-14 12:21:41 +09:00
huydx adb441e5c8 (format) run go fmt in pkg 2016-12-14 12:17:38 +09:00
bergquist 63bf332023 Merge branch 'alerting_mqe' 2016-12-13 16:15:22 +01:00
bergquist e6c557bb91 Merge branch 'master' into alerting_mqe 2016-12-13 16:15:04 +01:00
bergquist 362162d6fa feat(mqe): add token cache 2016-12-13 14:01:48 +01:00
bergquist 69d6316512 style(mqe): instance dependencies in ctor func 2016-12-13 12:47:57 +01:00
bergquist 549c3ab78b tech(mqe): update todo 2016-12-13 11:42:06 +01:00
bergquist b620c7457d test(query_editor): adds test for nesting queries in targetFull 2016-12-13 10:46:09 +01:00
Utkarsh Bhatnagar bd20dc6c4c Fixed failing tests (#6941) 2016-12-13 10:00:33 +01:00
bergquist 76f78c0f72 test(alert_tab): basic test skeleton
I created this test by misstake. But instead of deleting it I thought it
might be good to keep it to make it easier to add tests for the alert
tab
2016-12-13 09:50:38 +01:00
Torkel Ödegaard 62d18cd493 docs(): updated changelog with PR #6940 2016-12-13 09:18:10 +01:00
Utkarsh Bhatnagar 5777f65d05 Basic Auth now supports LDAP username and password (#6940) 2016-12-13 09:15:52 +01:00
Torkel Ödegaard 0841e841f5 cleanup(): removed docker/production folder as it was old and unused (ie grafana-docker repo is the place for the offical production docker container 2016-12-12 22:12:27 +01:00
bergquist e1703166f0 docs(changelog): add thank you note to contributor 2016-12-12 19:06:21 +01:00
bergquist 99e3db8208 Merge branch 'master' into alerting_mqe 2016-12-12 19:01:50 +01:00
Torkel Ödegaard 46c161b104 Merge branch 'master' of github.com:grafana/grafana 2016-12-12 16:35:59 +01:00
Torkel Ödegaard 80d88d302c fix(config): changed default for oauth and allow_sign_up setting, #6928 2016-12-12 16:35:42 +01:00
Hans Kristian Flaatten 1060b99810 docs(configuration): set allow_sign_up to true for gerneric OAuth (#6928)
This enables Grafana to accept new users authenticated through OAuth, without this set to true only previously authenticated users may log in with OAuth - and thus defeating the purpose.
2016-12-12 16:27:51 +01:00
Torkel Ödegaard 9da44141f1 fix(git): removed external submodule, accedentially included in PR, fixes #6929 2016-12-12 15:43:04 +01:00
bergquist 0e03c43174 docs(changelog): adds note about merging #4550 2016-12-12 14:59:02 +01:00
bergquist f33aeb6591 Merge branch 'adrianlzt-bug/show_multiple_tags_with_influxdb' 2016-12-12 14:56:51 +01:00
bergquist 530e1b358a Merge branch 'master' into adrianlzt-bug/show_multiple_tags_with_influxdb 2016-12-12 14:55:56 +01:00
bergquist ce4e71364c test(influxdb): adds tests for supporting multiple tags 2016-12-12 14:55:39 +01:00
Torkel Ödegaard 5ec7dea81a Merge branch 'v4.0.x' 2016-12-12 14:39:53 +01:00
Torkel Ödegaard 8feaef20e0 fix(graph): fixed graph issue with axes mode set to series and picking Max value, fixes #6926 2016-12-12 14:37:40 +01:00
Torkel Ödegaard 40b359334b fix(typescript): fixed sourcemap issue, #6904 2016-12-12 14:24:36 +01:00
bergquist d599f45707 Merge branch 'bug/show_multiple_tags_with_influxdb' of https://github.com/adrianlzt/grafana into adrianlzt-bug/show_multiple_tags_with_influxdb 2016-12-12 13:30:27 +01:00
bergquist ba848cffb4 docs(cli): add page for the cli 2016-12-12 13:15:35 +01:00
Torkel Ödegaard ee6cd727ea Merge branch 'master' of github.com:grafana/grafana 2016-12-12 11:38:31 +01:00
Torkel Ödegaard 3bb9d47a45 minor change to #6904 2016-12-12 11:38:10 +01:00
bergquist 413a187119 docs(notification): add message property to notification 2016-12-12 11:28:16 +01:00
Carl Bergquist a5c41fe7cb Merge pull request #6921 from huydx/master
fix(alert): alert test should return error when it failed to dispatch
2016-12-12 11:02:14 +01:00
Torkel Ödegaard 815722c3cc Merge branch 'upgrade_typescript' of https://github.com/Nepomuceno/grafana into Nepomuceno-upgrade_typescript 2016-12-12 10:53:19 +01:00
bergquist 3cbc325f18 tech(github): asks ppl to remove placeholder text 2016-12-12 10:39:45 +01:00
huydx 015fa82cf5 fix(alert): alert test should return error when it failed to dispatch 2016-12-12 18:22:58 +09:00
Seuf 12a82bc0d4 Auth Proxy improvements - adds the option to use ldap groups for authorization in combination with an auth proxy - adds an option to limit where auth proxy requests come from by configure a list of ip's - fixes a security issue, session could be reused 2016-12-12 09:53:02 +01:00
Seuf ae27c17c68 Auth Proxy improvements
- adds the option to use ldap groups for authorization in combination with an auth proxy
- adds an option to limit where auth proxy requests come from by configure a list of ip's
- fixes a security issue, session could be reused
2016-12-12 09:43:17 +01:00
bergquist 06b4dacaa4 docs(changelog): add note about closing #5479 2016-12-12 08:37:29 +01:00
Carl Bergquist 73ec529688 Merge pull request #6897 from grafana/cli_db_commands
Enable the CLI to do change the grafana admin password in the database
2016-12-12 08:30:20 +01:00
Gabriel Nepomuceno cbf0d571f5 Removing task from other build sources 2016-12-10 09:00:58 +00:00
Gabriel Nepomuceno 2f46c56672 removing type validation because copy needs to be done first 2016-12-09 23:41:07 +00:00
Gabriel Nepomuceno 7ff07aa7b1 Revoming old files 2016-12-09 22:05:11 +00:00
Gabriel Nepomuceno a8ae0a5b79 fixing compilation of grunt 2016-12-09 21:53:00 +00:00
Gabriel Nepomuceno f3ebd2d849 upgrading bases and correcting identation missing tslint 2016-12-09 14:57:25 +00:00
Axel 2adbe3e13e Prettify duration value format (#6875)
* Prettify duration unit format

Format duration like "2 days, 19 hours, 48 minutes" and make Decimals useful e.g.
0 decimals: 2 days
2 decimals: 2 days, 19 hours, 48 minutes
3 decimals: 2 days, 19 hours, 48 minutes, 27 seconds

Previous code did some rounding that is now gone so numbers might be
different.

* Rewrite kbn.toDuration without moment.js

Because https://github.com/moment/moment/issues/3653

* Add tests for kbn.toDuration
2016-12-09 15:55:25 +01:00
bergquist 96e8ecfa7b feat(cli): adds command to reset admin password
closes #5479
2016-12-09 15:25:02 +01:00
bergquist cd85e1f651 Merge branch 'master' into cli_db_commands 2016-12-09 12:36:05 +01:00
bergquist ba7a990f86 tech: bump version in server cli 2016-12-09 12:30:36 +01:00
bergquist 02392e5189 docs(changelog): adds PR contributors name to release notes 2016-12-09 12:19:41 +01:00
bergquist 64f22e7037 docs(changelog): add note about closing #6356 2016-12-09 11:49:23 +01:00
bergquist cfb6033765 Merge branch 'elastic5_support' 2016-12-09 11:42:15 +01:00
bergquist 619c5c4f1b Merge branch 'master' into elastic5_support 2016-12-09 11:41:23 +01:00
bergquist ebec02ffae style(elastic): minor code style changes 2016-12-09 11:40:00 +01:00
bergquist 99c5f7d571 feat(elastic): remove support for ES 1.x 2016-12-09 11:34:19 +01:00
bergquist 873024b917 tech(elastic): use bool conditions for all es queries 2016-12-09 11:13:28 +01:00
Matt Toback e58b6989c2 Small refactor to make hover highlighting proper, added a title tag for the completed grafana step. (#6882) 2016-12-09 09:42:24 +01:00
Matt Toback f39f77692b Adjusted the active state to fix the faint line showing. Probably related to the font change going into 4.0 (#6886) 2016-12-09 09:41:54 +01:00
Carl Bergquist 20e4cb9a0b Merge pull request #6885 from utkarshcmu/patch-1
Fixed Create org API in docs
2016-12-09 08:53:33 +01:00
Utkarsh Bhatnagar db3ac79015 Fixed Create org API in docs 2016-12-08 12:08:04 -08:00
bergquist 6265afd8b6 docs: updat latest to 4.0.2 2016-12-08 15:17:13 +01:00
bergquist 7c3c8bc4c9 docs(changelog): add date for 4.0.2 release 2016-12-08 15:14:44 +01:00
bergquist 49827de278 docs: release 4.0.2 2016-12-08 15:05:37 +01:00
bergquist a90f650109 update package.json version to 4.0.2 2016-12-08 14:04:08 +01:00
bergquist f68350acbf docs(alerting): link fix to issue rather then commit 2016-12-08 14:01:59 +01:00
Torkel Ödegaard 22bf6420f1 Merge branch 'master' of github.com:grafana/grafana 2016-12-08 10:25:26 +01:00
Torkel Ödegaard 05772b30d7 feat(ux): completed work on getting started panel, #6466 2016-12-08 10:25:05 +01:00
Carl Bergquist 249b82d28b Merge pull request #6873 from dec5e/reference_typos
Fix some typos in Reference docs
2016-12-08 09:49:10 +01:00
Andrey Artemov c97e95227a Fix some typos in "Export & Import" reference 2016-12-08 10:34:53 +02:00
Andrey Artemov c94805d4c2 Fix typo in Singlestat page title 2016-12-08 10:34:31 +02:00
Torkel Ödegaard dee6b7d150 Merge branch 'master' into getting-started-panel 2016-12-08 08:51:40 +01:00
Matt Toback 6ae6a5d312 Polished some styles, updated issue 6466 2016-12-07 14:51:00 -05:00
bergquist 8ee85626f2 fix(api): return correct json info after updating datasource
closes #6869
2016-12-07 18:09:17 +01:00
bergquist c871212d6c docs(changelog): adds note about fixing avg() reducer bug 2016-12-07 15:58:03 +01:00
bergquist dd3060fdc3 feat(alerting): calculate avg of valid points 2016-12-07 15:55:37 +01:00
Torkel Ödegaard 924535c6d0 change(graph): changed null value graph option to default to null, closes #6868 2016-12-07 15:27:20 +01:00
bergquist 2bdd2a59cb test(alerting): improve naming for test scenario 2016-12-07 15:19:58 +01:00
Adrian Lopez 395b834a23 Better match for culumn inside tagsColumn 2016-12-07 12:23:57 +01:00
Torkel Ödegaard e082d78697 fix(elasticsearch): removed unused code 2016-12-07 12:07:56 +01:00
Torkel Ödegaard 7b68e6ea3b feat(elasticsearch): Added support for Missing option (bucket) for terms aggregation, refactoring PR #4244, thx @shanielh 2016-12-07 12:06:47 +01:00
bergquist dd432e671e docs(changelog): note about closing #6687 2016-12-07 11:28:18 +01:00
Carl Bergquist 0294446af9 Merge pull request #6856 from kylemcc/opsgenie-alerting
alerting: add support for OpsGenie
2016-12-07 11:23:54 +01:00
Carl Bergquist 2c7adccf12 Use cache for http.client in tsdb package. (#6833)
* datasource: move caching closer to datasource struct

* tsdb: use cached version of datasource http transport

closes #6825
2016-12-07 11:10:42 +01:00
vaibhavinbayarea 24172fca01 Added feature request "predict value" in moving averages pipeline agg (#5689)
issue-id: #5688
2016-12-07 10:47:46 +01:00
Matt Toback d28726be06 Moved ADD ROW to left to consolidate row actions along the same vertical area. (#6852) 2016-12-07 10:45:23 +01:00
Carl Bergquist b0679b610f Merge pull request #6857 from SaaldjorMike/typo
Fix docs typo
2016-12-06 23:36:55 +01:00
Mike Rostermund c5b29228ee Add missing char/typo 2016-12-06 22:26:43 +01:00
Kyle McCullough 4ef940482c alerting: add support for OpsGenie 2016-12-06 14:48:13 -06:00
utkarshcmu 6b26a0f91d Fixed hover position 2016-12-06 05:53:33 -08:00
utkarshcmu 13f0b32a8f Added sanitizer to help text 2016-12-06 05:24:03 -08:00
bergquist 6440d884db elastic: make sure old tests are for es2 2016-12-06 14:17:03 +01:00
utkarshcmu 034d84354e Fixed HelpText input box 2016-12-06 03:58:38 -08:00
utkarshcmu 42de27a2cb Added help text for users 2016-12-06 03:54:44 -08:00
Torkel Ödegaard 83afbd4262 Merge branch 'master' of github.com:grafana/grafana 2016-12-06 11:58:51 +01:00
Torkel Ödegaard e1b25b3999 changelog(): updated changelog with info on shared tooltip feature merged via PR #6274, closes #1578 2016-12-06 11:58:39 +01:00
Torkel Ödegaard fa393c282a feat(graph): refactoring shared tooltip PR #6274 2016-12-06 11:55:20 +01:00
bergquist 005a17d52f Merge branch 'master' of https://github.com/lpic10/grafana into lpic10-master 2016-12-06 10:15:36 +01:00
bergquist 464553a453 docs: explains how to use comment chars in passwords 2016-12-06 09:48:56 +01:00
Torkel Ödegaard 51165e76ba Merge branch 'shared_tooltip' of https://github.com/connection-reset/grafana into connection-reset-shared_tooltip 2016-12-06 09:32:22 +01:00
bergquist 8f1ed07275 metrics: 64bit fields should come first in structs
https://golang.org/pkg/sync/atomic/#pkg-note-BUG
2016-12-06 09:08:51 +01:00
bergquist 21353f4ba5 docs: adds note about closing #6779 2016-12-06 09:08:50 +01:00
Torkel Ödegaard 9bb440bc82 Merge branch 'master' of github.com:grafana/grafana 2016-12-06 09:02:51 +01:00
bergquist c17064fb44 fix(webdav): adds missing auth headers
closes #6779
2016-12-06 09:02:14 +01:00
Torkel Ödegaard 62269bb894 change(influxdb): always specify absolute time range in milliseconds, refactoring #6571 2016-12-06 08:56:01 +01:00
Torkel Ödegaard c6bb86d833 Merge branch 'master' of https://github.com/ryantxu/grafana into ryantxu-master 2016-12-06 08:38:29 +01:00
jifwin e73b82d54f Disable web-security for phantomjs rendering (#6469) 2016-12-06 08:37:36 +01:00
Ben RUBSON e51525dbde Only take bar series to calculate barWidth (#6756)
* Only take bar series to calculate barWidth

solves #6751

* Typo

* Typo

* Typo

* Typo

* Refactor

* Simplify
2016-12-06 08:36:23 +01:00
Mitsuhiro Tanda 5f6a3ecd56 (cloudwatch) don't expand variable when panel or row repeat is used (#6618)
* (cloudwatch) don't expand variable when panel or row repeat is used

* fix test
2016-12-06 08:16:41 +01:00
Mitsuhiro Tanda be26c017f6 (cloudwatch) percentile support (#6634)
* support extended statistics

* handle different response format for extended statistics
2016-12-06 08:12:30 +01:00
Torkel Ödegaard d56b9a720a feat(alerting): added confirm text when removing panel with alert rule 2016-12-06 08:11:21 +01:00
Adrian Muraru f91fcaf5cf Dashboard PNG export (#6644) 2016-12-06 08:05:13 +01:00
Torkel Ödegaard 167936f9b9 updated changelog 2016-12-06 07:43:39 +01:00
Torkel Ödegaard ee36234196 Merge branch 'v4.0.x' 2016-12-06 07:42:35 +01:00
Torkel Ödegaard f9fba0e935 fix(timerange): fixed time range zoom out shortcut, fixes #6837 2016-12-06 07:42:22 +01:00
Torkel Ödegaard 88e1d56bc2 fix(logging): added extra logging when default config file is not found (ie homepath is not correct), fixes #6829 2016-12-06 07:36:10 +01:00
Torkel Ödegaard 4c406dec2f cleanup(): removed unused (old) migrate stuff 2016-12-05 12:52:34 +01:00
Torkel Ödegaard aea3093d85 change(Timepicker): removed last 90 days to make room for Last 2 days, #6758 2016-12-05 11:52:00 +01:00
Jaime Soriano Pastor f2d5829944 Add 'Last 2 days' option to quick ranges (#6758) 2016-12-05 11:51:02 +01:00
Torkel Ödegaard 37c1a49dc9 updated changelog 2016-12-05 11:44:50 +01:00
Torkel Ödegaard 50022253bd Merge branch 'v4.0.x' 2016-12-05 11:44:02 +01:00
Torkel Ödegaard 890e5ce8ca feat(playlist): added support for kiosk mode & minor polish/fix, closes #6727 2016-12-05 11:43:51 +01:00
Torkel Ödegaard 80f7a6a896 updated changelog 2016-12-05 11:20:54 +01:00
Torkel Ödegaard 1f50c6d76f Merge branch 'v4.0.x' 2016-12-05 11:20:14 +01:00
Torkel Ödegaard cc46b81961 fix(rendering): fixed server side rendering issue when sertting enforce_domain to true, fixes #6769 2016-12-05 11:20:01 +01:00
Torkel Ödegaard c5ff1e4584 Merge branch 'v4.0.x' 2016-12-05 11:04:24 +01:00
Torkel Ödegaard a9c0f66cda fix(influxdb): Fix for Ad-Hoc Filters variable & changing dashboards, fixes #6821 2016-12-05 11:04:05 +01:00
Torkel Ödegaard e1d52902c1 Merge branch 'master' of github.com:grafana/grafana 2016-12-05 10:54:40 +01:00
Torkel Ödegaard d1feaaf4f3 Merge branch 'v4.0.x' 2016-12-05 10:54:01 +01:00
Torkel Ödegaard ab07667b69 fix(rendering): minor fix for server side rendering when using non default http addr setting and non default domain setting, #6813 2016-12-05 10:51:46 +01:00
silvestre-abruzzo 48a14cb4c6 Use correct domain in render.js (#6813)
Phantomjs is always rendering login page because domain is not considered. According to http://phantomjs.org/api/webpage/method/add-cookie.html a correct domain must be passed. Probably this change is now necessary due to https://github.com/grafana/grafana/issues/6660
2016-12-05 10:50:23 +01:00
bergquist b81e97c99c webhook: adds json content-type
closes #6822
2016-12-05 10:46:04 +01:00
bergquist 4a2a935c8f changelog: adds note about closing #6822 2016-12-05 10:45:22 +01:00
bergquist 87dbdb8300 webhook: adds json content-type
closes #6822
2016-12-05 10:44:31 +01:00
bergquist 1b68116922 changelog: add bugfix header 2016-12-05 09:42:31 +01:00
bergquist ea829988da changelog: add note about closing #6807 2016-12-05 09:39:20 +01:00
bergquist 0403f53b6f feat(webhook): adds alert rule message to webhook
close #6807
2016-12-05 09:34:35 +01:00
bergquist b88478a7e5 docs(readme): remove link to old CLA page 2016-12-03 03:46:51 +01:00
Carl Bergquist fbf2113904 Merge pull request #6795 from hvnsweeting/patch-1
Use space to separate multiple modes
2016-12-03 03:15:31 +01:00
bergquist 6c9cf87080 feat(alerting): calculate avg of valid points 2016-12-02 23:44:14 +01:00
bergquist c9b7f8603e tech(): replace spaces to handle input more graceful 2016-12-02 23:43:02 +01:00
bergquist 9dd6cf45ac feat(webhook): adds alert rule message to webhook
close #6807
2016-12-02 22:24:36 +01:00
bergquist 96cd13044b change to golang 1.7.4 2016-12-02 21:27:12 +01:00
bergquist f70d7ff3a3 fix(influxdb): align tsdb.influxdb with dataproxy
ref #6784
2016-12-02 21:10:29 +01:00
bergquist 368889828d update latest.json to 4.0.1 2016-12-02 21:10:11 +01:00
Torkel Ödegaard a5f7edbe40 Update CHANGELOG.md 2016-12-02 11:29:12 -05:00
Torkel Ödegaard bc0fdc1f8e Update CHANGELOG.md 2016-12-02 11:28:06 -05:00
bergquist 8134724b8a docs: update links to 4.0.1 2016-12-02 17:17:33 +01:00
bergquist f7dced3067 update to version 4.0.1 2016-12-02 16:33:00 +01:00
bergquist b4b7156f42 fix(webdav): adds missing auth headers
closes #6779
2016-12-02 16:20:15 +01:00
Carl Bergquist c206c04399 Merge pull request #6796 from hvnsweeting/patch-2
Update sample.ini
2016-12-02 16:10:39 +01:00
bergquist 04fa86fdde docs(changelog): note about closing #6759 2016-12-02 15:43:39 +01:00
stuart nelson bc69c8ef40 Add transport cache for reverse proxy (#6776)
* Add transport cache for reverse proxy
* Use updated at in cache
2016-12-02 15:39:57 +01:00
stuart nelson 9ed21c6a16 Add transport cache for reverse proxy (#6776)
* Add transport cache for reverse proxy
* Use updated at in cache
2016-12-02 15:39:28 +01:00
Viet Hung Nguyen c6e66ec15e Update sample.ini
Use space to separate multiple modes
2016-12-02 13:48:08 +07:00
Viet Hung Nguyen b00fc73242 Use space to separate multiple modes 2016-12-02 13:46:41 +07:00
fg2it d3e47e50c1 swap member declaration in StandardGauge to avoid problem with atomic on arm and x86-32 2016-12-01 21:26:54 +01:00
bergquist 158656f570 docs(changelog): add note about closing #6749 2016-12-01 21:23:55 +01:00
Carl Bergquist 6c03c64c79 Merge pull request #6768 from fg2it/fix6749
fix 6749 by swapping member in StandardGauge to avoid problem with atomic
2016-12-01 21:16:16 +01:00
Carl Bergquist ae171357fc Merge pull request #6783 from solugebefola/patch-1
typo?
2016-12-01 18:16:10 +01:00
Solar Olugebefola 1c234c6089 typo? 2016-12-01 11:54:07 -05:00
Axel Pirek e6c8e75d62 Make tooltip shareable like crosshair 2016-12-01 10:10:23 +01:00
fg2it 834e3f1c29 swap member declaration in StandardGauge to avoid problem with atomic on arm and x86-32 2016-11-30 21:57:18 +00:00
bergquist 09e49f0a17 docs: adds note about closing #5677 2016-11-30 00:10:29 +01:00
Carl Bergquist d11b17b8fe Merge pull request #5677 from bmundt/remove_columns
Added Hidden Column Style for Table Panel
2016-11-30 00:08:17 +01:00
bergquist 4543bfe5aa docs: add note about closing cloudwatch 2016-11-29 23:38:44 +01:00
Carl Bergquist 3c662ade8c Merge pull request #6698 from grafana/cloudwatch_configurable_keys
Cloudwatch configurable keys from config page.
2016-11-29 23:37:13 +01:00
bergquist 180940a378 fix(singlestat): align width for gauge settings 2016-11-29 23:25:45 +01:00
bergquist 0d41b1294a fix(singlestat): align width for gauge settings 2016-11-29 23:24:46 +01:00
bergquist 16f6339327 docs: add note about closing #6740 2016-11-29 23:20:48 +01:00
Carl Bergquist c2ed24b788 Merge pull request #6740 from dirk-leroux/new_aggregation_on_singlestat_panel
New aggregation on singlestat panel
2016-11-29 23:18:01 +01:00
bergquist aa14d9d893 docs: add note about closing #6411 2016-11-29 22:30:05 +01:00
bergquist 87824d2be7 Merge branch 'ichekrygin-victorops' 2016-11-29 22:28:39 +01:00
bergquist 83e90325c9 chore(victorops): remove unused code 2016-11-29 22:26:42 +01:00
bergquist a6ea2f4fdb Merge branch 'victorops' of https://github.com/ichekrygin/grafana into ichekrygin-victorops 2016-11-29 22:22:25 +01:00
bergquist bb6248a51a docs: remove link to CLA since we use CLA assistance 2016-11-29 21:51:51 +01:00
bergquist a3a07b7191 docs(changelog): add note about closing #6655 2016-11-29 21:43:31 +01:00
Carl Bergquist b47410af6a Merge pull request #6670 from tomkozlowski/feature/postgres-certs
generalized database connection cert support and added to postgres
2016-11-29 21:40:27 +01:00
bergquist 9f4d06e8e2 docs(changelog): add note about closing #5443 2016-11-29 21:24:45 +01:00
bergquist 253324fc32 style(sqlstore): remove comment 2016-11-29 21:24:45 +01:00
Carl Bergquist f6557f14b7 Merge pull request #6741 from dpavlos/fix_5443
[5443] Check if title is empty before save a new dashboard
2016-11-29 21:22:07 +01:00
bergquist 3b4e55216c docs(changelog): add note about fixing #6679 2016-11-29 21:14:37 +01:00
Carl Bergquist 5a0fc434f3 Merge pull request #6722 from dpavlos/fix_6679
[6679] Check if org exists before delete it
2016-11-29 21:12:02 +01:00
bergquist b00e9390d3 docs(v4): update docs for v4 2016-11-29 19:03:33 +01:00
bergquist a73bebbf3d tech(build): update publish script for 4.0.x release 2016-11-29 18:18:44 +01:00
bergquist aed695ebe0 tech(build): set master to 4.1.0 pre 2016-11-29 18:03:20 +01:00
bergquist 9143165580 tech(build): change windows build branch 2016-11-29 17:41:18 +01:00
Torkel Ödegaard 25a5fc465c fix(row): fixed dropping new panels onto panels, should split target panel 2016-11-29 11:38:02 -05:00
Torkel Ödegaard 7276b00fc7 fix(row): fixed dropping new panels onto panels, should split target panel 2016-11-29 11:37:06 -05:00
bergquist 567c2a1799 tech(build): update branch to package 2016-11-29 17:31:15 +01:00
bergquist 231492d443 tech(build): change windows build branch 2016-11-29 17:03:49 +01:00
bergquist 64f371a32d tech: upgrade package json to v4.0.0 2016-11-29 16:51:38 +01:00
bergquist 360516ed41 feat(metrics): change active alerts to guage 2016-11-29 16:46:25 +01:00
Torkel Ödegaard 7e831e10a2 updated version in grafana-server main.go 2016-11-29 10:41:31 -05:00
Pavlos Daoglou 7f7f080ad8 [5443] Check if title is empty before save a new dashboard 2016-11-29 12:25:20 +02:00
Dirk le Roux e0073d7e54 Fixed spelling error 2016-11-29 08:32:51 +02:00
Dirk le Roux 6412bd2f57 oAdded value type documentation to singlestat panel
Signed-off-by: Dirk le Roux <dirk.leroux@gmail.com>
2016-11-29 08:26:32 +02:00
Dirk le Roux 49dda7e5c1 first, delta, range passing unit tests
Signed-off-by: Dirk le Roux <dirk.leroux@gmail.com>
2016-11-29 08:26:31 +02:00
Ryan McKinley 0534d43a6e use ms when query less then 5 mins 2016-11-28 14:57:36 -08:00
Ryan McKinley 1ce0d81736 Merge remote-tracking branch 'grafana/master' 2016-11-28 13:38:18 -08:00
bergquist f7e8e9c9af docs(readme): bump golang version 2016-11-28 20:47:04 +01:00
Carl Bergquist 2bdb2f79ec fix(table): renderes empty date column as '-' (#6736)
* fix(table): renderes empty date column as '-'

closes #6728

* docs(changelog): add note about closing 6728
2016-11-28 14:42:43 -05:00
bergquist 2bdeb78885 style(docker): remove comments 2016-11-28 18:48:34 +01:00
bergquist 20df0aafc2 tech(docker): adds docker fig for elastic 5 2016-11-28 18:43:26 +01:00
bergquist ab2f109443 fix(config): error message for broken config file
closes #6731
2016-11-28 17:55:18 +01:00
Torkel Ödegaard a2d1cc1a46 fix(css): minor style fix 2016-11-28 09:39:07 -05:00
Pavlos Daoglou 0064331bbf [6679] Check if org exists before delete it 2016-11-28 00:09:01 +02:00
bergquist b2edcd8cfd tech(docs): use relref for links 2016-11-27 20:22:29 +01:00
bergquist ce64a0173c docs(datasource): add root datasource page 2016-11-27 20:05:35 +01:00
bergquist 3475ff2d81 docs(http): moves overview content to /http_api/
ref #6719
2016-11-27 17:09:56 +01:00
bergquist e3ad740b49 docs(changelog): add note about closing #6701 2016-11-27 16:56:31 +01:00
bergquist bdfb773a98 fix(alerting): fixes broken no_value evaluator
closes #6701
2016-11-27 16:53:29 +01:00
bergquist 583de8e0e0 docs(graph): remove unused headers 2016-11-27 16:10:16 +01:00
bergquist adc1bd3dea docs(graph): moves thresholds to display tab
closes #6703
2016-11-27 16:07:41 +01:00
bergquist 7bc1c3cc1c feat(cloudwatch): make it possible to reset keys
closes #6697
2016-11-24 16:37:33 +01:00
bergquist 3d21f06d5b tech(cloudwatch): store keys in secure json blob 2016-11-24 14:16:52 +01:00
bergquist 0ea6537916 tech(cloudwatch): refactoring 2016-11-24 14:00:05 +01:00
bergquist f7e12e5f93 test(cloudwatch): fixes failing tests 2016-11-24 14:00:05 +01:00
bergquist 1695aece0c feat(cloudwatch): add authtype dropdown to config page 2016-11-24 14:00:05 +01:00
bergquist 64784db870 feat(cloudwatch): adds access and secret key to edit config page 2016-11-24 14:00:05 +01:00
bergquist c3075a9bd1 docs(changelog): add note about solving sync problem for alerts 2016-11-24 13:59:52 +01:00
Torkel Ödegaard 2f354ed926 fix(getting started panel): some more work on this, #6466 2016-11-24 13:58:51 +01:00
Carl Bergquist 42f522fe97 Merge pull request #6692 from grafana/feature/tls-client-auth
Feature/tls client auth
2016-11-24 13:58:08 +01:00
Daniel Lee ad8f06f87f feat(changelog): adds TLS Client auth 2016-11-24 13:57:19 +01:00
bergquist 2bbe3d56bc docs(alerting): add info about alerting metrics 2016-11-24 13:45:24 +01:00
Daniel Lee 0618122bcd feat(httpsettings): add tls auth option
- Three text areas where the user can paste
in the CA Cert (optional), Client Cert
and Client Key.

- Tooltips for Auth checkboxes with brief
descriptions of what With Credentials and
With CA Cert are.

- Adds popover for TLS Auth header too.

- Aligns gf-form elements as labels and
checkboxes were not aligned before.

- Makes CA Cert optional as it is only
needed for self-signed certs.
2016-11-24 13:33:28 +01:00
Daniel Lee b6b53c0f4b fix(dataproxy): test with CA Cert 2016-11-24 13:22:25 +01:00
Daniel Lee 2893b25a05 feat(datasources): allow updating of tls certs
The tls files are stored as a json blob in the
SecureJsonData field. To update one file, the
json has to be fetched from the db first and
then updated with the cert file that has been
changed.

Also, a change to the dto with flags that are
used in the frontend to show if a file has
been uploaded. For example, if tlsClientKeySet
is set to true then means a file for the
client key is saved in the db. This is to
avoid sending any private data to the frontend.
2016-11-24 13:22:25 +01:00
Daniel Lee 387f8cc0c6 feat(dataproxy): TLS CA Cert for self-signed certs
For self-signed TLS Certificates, authentication
with InsecureSkipVerify set to false then this
error will occur:

x509: certificate signed by unknown authority

The solution is to allow the user to upload the
CA cert as well.
2016-11-24 13:22:25 +01:00
Daniel Lee c9b2c694f1 refactor(dataproxy): TLS Client Auth
Use a SecureJsonData field for TLS
Client Auth instead of 3 new db
fields. Same model as used for
PluginSettings.

Saves and encrypts the pem file
content rather than just saving
the paths to the cert and key.
This allows for uploading from
the Edit Datasource page in
Grafana.
2016-11-24 13:22:25 +01:00
Daniel Lee af07adb146 refactor(securejsondata): extract to class
Extract from pluginsettings class so that the
securejsondata type can be used in the other
classes. Encrypt and decrypt functions
extracted too.
2016-11-24 13:22:25 +01:00
Joe Lanford 56b7e2dfaf Added support for TLS client auth for datasource proxies (#5801) 2016-11-24 13:22:25 +01:00
Torkel Ödegaard 2233938ba7 Merge branch 'master' into getting-started-panel 2016-11-24 13:17:22 +01:00
Torkel Ödegaard ad7ae1b912 fix(graph): Fixed tooltip date header visible when x-mode was set to series, fixes #6364 2016-11-24 13:16:46 +01:00
bergquist 421c1eed82 fix(dashboard): fixes bug when saving dashboards 2016-11-24 11:22:13 +01:00
Torkel Ödegaard d9cf6a958b fix(unsaved changes): You now navigate to the intended page after saving in the unsaved changes dialog fixes #6675 2016-11-24 11:06:09 +01:00
Ben RUBSON 614bd7f1e8 Sort series by yaxis by default (#6683)
* Sort series by yxis by default

* Sort series by yxis by default

* Sort series by yxis by default
2016-11-24 10:24:49 +01:00
bergquist 6081c6cb61 docs(http_api): convert to new docs format 2016-11-24 10:16:24 +01:00
Carl Bergquist df2b2e3058 feat(alerting): validate alerts before saving dashboard (#6691)
ref #6576
2016-11-24 09:50:35 +01:00
Torkel Ödegaard 223f2320eb fix(streaming): clear data stream on subject completion 2016-11-23 17:12:30 +01:00
Torkel Ödegaard cf751c256b fix(graph): fixed order of graph tooltip when sort order was none, fixes #6648 2016-11-23 17:08:14 +01:00
Torkel Ödegaard ea5cb0d076 fix(server side rendering): Fixed address used when rendering panel via phantomjs and using non default http_addr config, fixes #6660 2016-11-23 15:35:43 +01:00
Torkel Ödegaard 773fb5d1ae fix(alerting): check if dashboard is saved before testing alert rule, fixes #6549 2016-11-23 14:55:10 +01:00
Pavlos Daoglou c365d52a80 [6486] Fix status code when adding an existing user to org (#6678) 2016-11-23 14:38:44 +01:00
bergquist 02dc51b1b6 docs(influxdb): typo 2016-11-23 07:15:34 +01:00
Carl Bergquist 78ce29b8f1 Merge pull request #6671 from peregrinogris/patch-2
Fix typo in Basic Concepts
2016-11-23 06:30:44 +01:00
Hernán Rodríguez Colmeiro e7e83a71a6 Fix typo in Basic Concepts 2016-11-22 21:47:59 -03:00
Tom Kozlowski c21ffcc6c9 generalized database connection cert support and added to postgres 2016-11-22 15:29:22 -08:00
bergquist 56156fcd7f feat(alerting): add median reducer to frontend 2016-11-22 14:35:26 +01:00
Torkel Ödegaard 2a33594c02 fix(templating): fixed duplicate button bug, fixes #6652 2016-11-22 14:20:24 +01:00
Torkel Ödegaard 34790e1fab fix(dashboard): minor fix to schema upgrade when schemaVersion is not correct, fixes #6650 2016-11-22 14:20:24 +01:00
bergquist 6882dcfb99 feat(alerting): add backend support for median reducer 2016-11-22 14:09:35 +01:00
Mitsuhiro Tanda 51f80affe3 (cloudwatch) update aws-sdk-go to v1.5.8 (#6658)
* (cloudwatch) upgrade aws-sdk-go v1.5.8

* (cloudwatch) remove non-required aws-sdk-go part

* add go-ini
2016-11-22 13:38:11 +01:00
bergquist 50811c80ea fix(alerting): fixes bug that prevents noData from triggering
closes #6631
2016-11-22 11:47:52 +01:00
bergquist d73620f304 docs(issue_template): add note about alerting 2016-11-22 08:31:45 +01:00
bergquist 41a1ec29e7 docs(readme): add link to whats new in grafana 4 2016-11-21 14:01:41 +01:00
Torkel Ödegaard a3d5b4bf25 Update CHANGELOG.md 2016-11-21 11:51:20 +01:00
Torkel Ödegaard 092f0c4b62 docs(): fixed windows link 2016-11-21 10:58:45 +01:00
Torkel Ödegaard a5c0295a0e docs(): updated doc download links 2016-11-21 10:18:43 +01:00
Torkel Ödegaard c643466d57 bumped version to v4-beta2 2016-11-21 09:51:59 +01:00
bergquist 2b6013ce81 fix(notifications): failed image upload should not stop notification
closes #6638
2016-11-21 09:47:59 +01:00
Torkel Ödegaard 6fa4b8c0b6 Merge branch 'master' of github.com:grafana/grafana 2016-11-21 09:42:46 +01:00
Torkel Ödegaard 8d80812601 Merge branch 'issue-6566' of https://github.com/benrubson/grafana into benrubson-issue-6566 2016-11-21 09:39:35 +01:00
Torkel Ödegaard c1a15648c7 Merge branch 'master' of github.com:grafana/grafana into getting-started-panel 2016-11-21 09:00:40 +01:00
benrubson e71114f4fb Come back to #6287 for graph_tooltip.js
as it is an only one loop solution
2016-11-19 09:12:10 +01:00
benrubson 9797845460 Typo 2016-11-18 19:14:12 +01:00
benrubson 0034b6ede7 Highlight correct point when series has null values 2016-11-18 18:49:20 +01:00
benrubson 1eb0ea3450 Correctly stack series with null and missing values 2016-11-18 18:14:40 +01:00
benrubson becb6303e5 Revert #6287 for graph_tooltip.js 2016-11-18 17:50:54 +01:00
Torkel Ödegaard 1dc581bdfa ux(gettingstarted): progress on getting started panel, #6466 2016-11-18 17:42:14 +01:00
bergquist 5dea0fda51 fix(settings): remove nil pointer exception 2016-11-18 16:43:14 +01:00
benrubson 850d39fc50 Revert #6287 for jquery.flot.stack.js 2016-11-18 16:32:00 +01:00
Torkel Ödegaard fd512457d8 Merge remote-tracking branch 'origin/master' into getting-started-panel-css2 2016-11-18 16:31:54 +01:00
Torkel Ödegaard 0c9001c7ae ux(gettingstarted): progress on getting started panel, #6466 2016-11-18 16:31:19 +01:00
bergquist 1b0005a9e5 feat(mqe): add support for app and host alias 2016-11-18 11:40:38 +01:00
bergquist 61bb9cbc13 test(alerting): fixes broken unit test 2016-11-18 10:53:27 +01:00
Ryan McKinley 7958615097 Use ms rather than second precision 2016-11-17 09:21:25 -08:00
bergquist a3b0fbcaba fix(influxdb): fixes broken tag rendering for influxdb alerting
closes #6626
ref #6523
2016-11-17 15:50:49 +01:00
Torkel Ödegaard 7ce33c31ec Merge branch 'master' of github.com:grafana/grafana 2016-11-17 15:50:08 +01:00
Torkel Ödegaard b9cfb19ab8 changelog(): added entry for PR #6579 2016-11-17 15:50:00 +01:00
Torkel Ödegaard e34bf9a1fa Merge branch 'utkarshcmu-or_alerting' 2016-11-17 15:49:52 +01:00
Torkel Ödegaard 62e8a039a1 refactor(alerting): refactoring PR for OR conditions, #6579 2016-11-17 15:48:15 +01:00
bergquist 3ea66ebe3f fix(alerting): remove possible divide by zero panic
ref #6599
2016-11-17 15:20:14 +01:00
Torkel Ödegaard 457ae74343 Merge branch 'or_alerting' of https://github.com/utkarshcmu/grafana into utkarshcmu-or_alerting 2016-11-17 14:43:24 +01:00
Torkel Ödegaard 98d1748e43 fix(templating): work on fixing exporting issues when using templating variables, like data source variables, and panel repeats, requires more work #6189 2016-11-17 12:32:11 +01:00
Torkel Ödegaard 9d5928ddd6 feat(templating): don't persist template variable options when variable has refresh enabled, closes #6586 2016-11-17 11:38:06 +01:00
Torkel Ödegaard eafe0d6bfa fix(templating): fixed issue when adding template variable, fixes #6622 2016-11-17 11:28:33 +01:00
utkarshcmu aae33b36dd Added tests for firingEvaluation string 2016-11-17 01:41:23 -08:00
Torkel Ödegaard 196fdbfd31 fix(dashboard): fixed issue when dragging new panel to drop zone 2016-11-17 10:31:37 +01:00
utkarshcmu fc82dac868 Added braces to single condition firingEvaluation string 2016-11-17 01:30:50 -08:00
utkarshcmu 690868c837 Added firingEvalution to Rule test 2016-11-17 01:28:17 -08:00
Torkel Ödegaard a45fdfdd3f fix(dashboard): minor fixes, and restored in-activity timer to 1min 2016-11-17 10:11:59 +01:00
bergquist 5c153f0383 Merge branch 'master' into alerting_mqe 2016-11-17 09:57:56 +01:00
bergquist 0a0f558c48 style(mqe): improve code 2016-11-17 08:52:27 +01:00
bergquist 23387bd39b feat(mqe): simplify timestamp parsing 2016-11-17 08:42:09 +01:00
ichekrygin f6b70c7d82 Fix formatting 2016-11-16 17:30:42 -08:00
ichekrygin acc729131a Add VictorOps Test. 2016-11-16 16:14:02 -08:00
ichekrygin 8f0d51171d Resolve rebase w/ upstream conflicts.
Remove: `Alert on Exec Error` (no longer needed)
Add: `ruleUrl` to VictorOps message body.
2016-11-16 16:13:33 -08:00
ichekrygin bbca9861fb Fix return on nil and cleanup debug messages 2016-11-16 14:02:34 -08:00
ichekrygin b46cbc5fbe Add option to alert on ExecutionError 2016-11-16 14:02:34 -08:00
ichekrygin 4ca304b756 Change VictorOps fa from fa-exclamation-triangle -> fa-pagelines 2016-11-16 14:02:34 -08:00
ichekrygin 1e558e3936 Fix user-facing text 2016-11-16 14:02:34 -08:00
ichekrygin b0620a9d4b Add VictorOps alert notification capability 2016-11-16 14:02:34 -08:00
Torkel Ödegaard 42167a65c6 testdata(): added test graph for null stacking scenario, #6566 2016-11-16 19:00:23 +01:00
Torkel Ödegaard f52c6aafe7 docs(): minor update to centos docs about font packages needed for phantomjs 2016-11-16 18:49:14 +01:00
Torkel Ödegaard 4581bb4a7a fix(singletat): Support repeated template variables in prefix/postfix, fixes #6595 2016-11-16 18:44:39 +01:00
Torkel Ödegaard e6776f71d9 cleanup(sass): removed tight-form styles 2016-11-16 18:26:39 +01:00
Torkel Ödegaard d7e8753c59 cleanup(): removed unused gfbox style 2016-11-16 18:08:45 +01:00
Torkel Ödegaard 079b0ef44a change(alerting): delete alert rule from panel model when duplicating panel 2016-11-16 18:03:00 +01:00
Torkel Ödegaard a50178eab1 ux(tweak): minor polish to date picker styling 2016-11-16 17:56:42 +01:00
Torkel Ödegaard f64385cfc9 ux(tweak): minor polish to date picker styling 2016-11-16 17:53:56 +01:00
Torkel Ödegaard 465451c289 cleanup(): removed unused uio-angular tab component 2016-11-16 17:47:37 +01:00
Torkel Ödegaard 18e965c775 fix(error handling): fixed server side error handling page 2016-11-16 17:41:44 +01:00
bergquist 9572f086ae feat(mqe): add timerange to query 2016-11-16 17:09:34 +01:00
Torkel Ödegaard e3564d12a1 fix(404): fixed 404 page 2016-11-16 17:09:00 +01:00
Dan Cech c980efd470 fix up sass lint warnings (#6603) 2016-11-16 17:08:38 +01:00
Dan Cech eacb7c8aba Merge pull request #6584 from tomkozlowski/bugfix/oauth-login-bearer-token
explicitly set oauth2 token to Bearer Type
2016-11-16 10:35:32 -05:00
Torkel Ödegaard e7a30ac464 fix(units): fixed issue with data rate bit units, fixes #6602 2016-11-16 16:29:10 +01:00
Tom Kozlowski a353c8d1bb added explicitly setting token as Bearer Type 2016-11-16 09:55:14 -05:00
bergquist fa8213d8d5 feat(mqe): send http requests 2016-11-16 15:28:31 +01:00
Torkel Ödegaard 4fa995eafa ux(view/tv mode): treat tab change as user activity, resets in activity timer 2016-11-16 14:44:55 +01:00
bergquist f1897b7e96 feat(mqe): add response parser 2016-11-16 14:42:43 +01:00
Torkel Ödegaard 9c7f8268dc fix(build): fixed failing unit test 2016-11-16 14:39:17 +01:00
Torkel Ödegaard 171335bfef fix(ux): fixed dropzone display issues, fixes #6598 2016-11-16 14:28:52 +01:00
bergquist c6ad0cc5ec test(mqe): basic test for response parser 2016-11-16 13:00:25 +01:00
bergquist 113020aabe feat(mqe): support basic aliases 2016-11-16 11:04:15 +01:00
bergquist e12a4f6b46 docs(notifications): fixes typo 2016-11-16 10:55:47 +01:00
Mitsuhiro Tanda 9740752c1e (cloudwatch) long retention support (#6547) 2016-11-16 10:50:33 +01:00
Matt Toback 10cf32f835 Removed green border from OK alerts. Makes dashboards too busy, competes for attention where action is unnceessary (#6555) 2016-11-16 10:50:01 +01:00
bergquist 430104aaac feat(mqe): add support for wildcard series 2016-11-16 10:03:22 +01:00
bergquist fa92dfb7b2 feat(mqe): add support for apps in where clause 2016-11-16 09:54:45 +01:00
Torkel Ödegaard f91a833e6a fix(panel): set initial transparency state at first link 2016-11-16 09:44:16 +01:00
bergquist ab7263579f Merge branch 'master' into alerting_mqe 2016-11-16 09:28:26 +01:00
bergquist cbe8af967d docs(api): add docs about creating new org
close #6588
2016-11-16 09:06:32 +01:00
utkarshcmu f46c4c88ca Added OR condition in docs 2016-11-15 22:43:09 -08:00
Ben RUBSON a4de6da9a0 Correct series highlight (#6578)
solves issue #6573
2016-11-15 18:59:17 +01:00
bergquist 4739608ffb tests(mqe): add query builder 2016-11-15 18:37:34 +01:00
utkarshcmu 8d0bcd23f8 Added tests for checking nested operators 2016-11-15 08:07:05 -08:00
utkarshcmu dfb1b1918c Implemented operator based firiing in backend 2016-11-15 06:35:25 -08:00
bergquist b9d709ab27 feat(alerting): improve error logging for extracting alerts
ref #6576
2016-11-15 11:47:46 +01:00
Torkel Ödegaard 05c5a09f63 docs(): updated changelog 2016-11-15 08:46:30 +01:00
utkarshcmu b2db2b26dd Added OR to alert_tab 2016-11-14 18:36:22 -08:00
Ryan McKinley 04356f31d2 missing space 2016-11-14 14:56:11 -08:00
Ryan McKinley 3588b9732f round the seconds 2016-11-14 13:40:33 -08:00
Carl Bergquist 6e94ccea07 Merge pull request #6569 from nicr9/patch-1
docs(datasources/influxdb): Fix broken image link
2016-11-14 17:25:52 +01:00
Nic Roland 0cdf05ae5d docs(datasources/influxdb): Fix broken image link
Twas missing a leading `/`.
2016-11-14 16:04:33 +00:00
bergquist 1bdda76ba9 tests(mqe): parse mqe query model 2016-11-14 15:03:49 +01:00
bergquist c973241435 feat(mqe): add token request 2016-11-14 14:00:35 +01:00
Torkel Ödegaard 62ff85e774 docs(): fixed ldap link 2016-11-14 11:34:58 +01:00
bergquist 4fdfee739a fix(influxdb): add support for regex measurments
closes #6560
2016-11-14 08:48:19 +01:00
bergquist 118e2a6364 WIP: more boilerplate 2016-11-13 13:51:54 +01:00
bergquist a87fd11f26 feat(stats): add alerts to global admin stats 2016-11-11 14:04:38 +01:00
bergquist ad97db937c feat(stats_usage): add stats about alerts 2016-11-11 13:57:11 +01:00
Carl Bergquist 08429d9a08 Merge pull request #6546 from huydx/master
Fix typo (password strenght -> password strength)
2016-11-11 10:31:04 +01:00
huydx f5a804a558 Fix typo (password strenght -> password strength) 2016-11-11 18:02:58 +09:00
Andrew McDonald b98f817d68 Fix for cloudwatch datasource requesting too many datapoints (#6544)
The range checking in _getPeriod appeared to be using a different variable than the period that had just been calculated for its bounds checks.
2016-11-11 08:54:44 +01:00
bergquist e04d27c0b0 fix(influxdb): return internal influxdb errors
ref #6523
2016-11-11 08:47:53 +01:00
Carl Bergquist b824fa1916 Merge pull request #6538 from grafana/alertlist_only_from_dashboard
feat(alertlist): make it possible to filter on alerts from current da…
2016-11-10 16:19:12 +01:00
bergquist a51de8e987 tech(conf): remove dragoo :( 2016-11-10 16:15:55 +01:00
bergquist abb8f33d77 feat(alertlist): make it possible to filter on alerts from current dashboard 2016-11-10 16:07:13 +01:00
bergquist f924b241ae tech(influxdb): refactor query builder
trying to reduce the amounts of moving parts for influxdb
2016-11-10 14:38:07 +01:00
Torkel Ödegaard 18a37a9eef ux(getting started): struggleing witch cleaning up the css, #6466 2016-11-10 14:21:37 +01:00
bergquist a948dfe514 fix(influxdb): fixes broken raw query usage 2016-11-10 14:18:10 +01:00
Torkel Ödegaard 575828f1e9 Merge branch 'getting-started-panel' of github.com:grafana/grafana into getting-started-panel 2016-11-10 13:25:18 +01:00
Torkel Ödegaard de74bf0c33 Merge branch 'master' into getting-started-panel 2016-11-10 13:24:10 +01:00
Torkel Ödegaard 9f7d0862e8 docs(): minor docs fix 2016-11-10 13:08:32 +01:00
Carl Bergquist a825e63a19 Merge pull request #6515 from grafana/influxdb_alias_seriename
[Influxdb] Backend support for seriename alias
2016-11-10 12:56:53 +01:00
bergquist ecba23e883 Merge branch 'master' into influxdb_alias_seriename 2016-11-10 12:22:17 +01:00
Torkel Ödegaard 6767bdd76d fix(graph): fixed issue log base scale on right y axis, option was not applied at all, also issue with log scale and max value calculation fixed, fixes #6534 2016-11-10 12:04:55 +01:00
Torkel Ödegaard 316d754a21 fix(ui/browser): fixed border not showing in safari, fixes #6530 2016-11-10 11:31:27 +01:00
bergquist 70b9ba2573 tech(build): switch to golang 1.7.3
tls/cipher fixes
https://github.com/golang/go/issues?q=milestone%3AGo1.7.3
2016-11-10 11:30:18 +01:00
bergquist 4f3c8c6663 fix(influxdb): add default operator
ref #6523
2016-11-10 11:21:38 +01:00
Torkel Ödegaard 71eb0f3278 fix(graph): fixed issue with bar width when used in series override, fixes #6528 2016-11-10 10:50:48 +01:00
Ben RUBSON 6495ba155a Correct timeStep in case of missing values (#6526)
* Correct timeStep in case of missing values

* Comment
2016-11-10 10:20:27 +01:00
Ben RUBSON 2443326386 Add some comments about some previous modifications (#6533) 2016-11-10 10:19:42 +01:00
bergquist ef08a243c5 fix(influxdb): fixes possible nil pointer
closes #6531
2016-11-10 08:23:58 +01:00
bergquist bd3259d07a feat(mqe): init commit 2016-11-09 15:55:47 +01:00
bergquist 6a8138904e fix(shortcuts): CTRL on windows or linux 2016-11-09 14:48:51 +01:00
bergquist 82e1d3f6aa feat(influxdb): disable debug logging in appmode 2016-11-09 14:48:05 +01:00
Torkel Ödegaard fff26086d5 docs(): updated install links with beta links as well 2016-11-09 13:53:20 +01:00
Torkel Ödegaard 1d4cace849 fix(testdata): fixed query in default grafana data source 2016-11-09 12:52:56 +01:00
bergquist f0a0e647a0 feat(influxdb): backend support for alias by segment
ref #6510
2016-11-09 12:45:59 +01:00
Torkel Ödegaard d1bedfc1d1 updated version to beta1 2016-11-09 12:10:03 +01:00
Torkel Ödegaard bfed566ea8 changelog(): updated with entry for #2912 and #6287, closes #2912 2016-11-09 11:37:36 +01:00
Torkel Ödegaard a9c6bdc197 panel(graph): stacking can now handle null values, #6287 2016-11-09 11:34:34 +01:00
Torkel Ödegaard 485980eebf Merge branch 'issue-2912' of https://github.com/benrubson/grafana into benrubson-issue-2912 2016-11-09 11:17:04 +01:00
Torkel Ödegaard 33664b0a7e docs(): minor docs change 2016-11-09 11:14:04 +01:00
Torkel Ödegaard 2164bbd447 ux(tv mode): added 1 second delay animation 2016-11-09 10:59:06 +01:00
Torkel Ödegaard fb57bf77da ux(getting started): progress on getting started panel and persited help flag states, #6466 2016-11-09 10:41:39 +01:00
bergquist 97271514fb feat(influxdb): cleanup influxdb query editor options 2016-11-09 10:30:03 +01:00
bergquist c897d39d5e feat(influxdb): add support for serie alias replacement
ref #6510
2016-11-09 10:22:11 +01:00
bergquist 24a3a100ed feat(influxdb): add alias to query 2016-11-09 10:05:12 +01:00
Leandro Piccilli 717a96ab8d Fix raw document query on ES 5.x 2016-11-08 22:18:59 +01:00
Leandro Piccilli a5ee705b89 Merge branch 'master' of https://github.com/grafana/grafana 2016-11-08 22:18:30 +01:00
Torkel Ödegaard 652eb057cf change(graph): change default line width from 2 to 1 2016-11-08 20:57:17 +01:00
Torkel Ödegaard 20d789cb94 docs(): fix title 2016-11-08 20:57:16 +01:00
Torkel Ödegaard d717e0cf13 docs(): minor spelling fix 2016-11-08 20:57:16 +01:00
bergquist 029e52f5a1 docs(pagerduty): update docs regarding pagerduty 2016-11-08 20:41:02 +01:00
bergquist eb34855adb feat(pagerduty): add support for auto resolve
closes #6513
2016-11-08 20:38:38 +01:00
Carl Bergquist 0d729ae392 Merge pull request #6512 from utkarshcmu/pagerduty_bug
Send test notification fixed
2016-11-08 20:30:41 +01:00
utkarshcmu 610ea090dc Send test notification fixed 2016-11-08 11:22:03 -08:00
bergquist 5542b0ab9e tech(pagerduty): sync calls should be using context 2016-11-08 20:05:43 +01:00
bergquist b5c96d2685 style(influxdb): fixes broken layout 2016-11-08 20:02:55 +01:00
bergquist 98a7bf181a tech(influxdb): close body reader 2016-11-08 19:19:49 +01:00
Torkel Ödegaard 5f2cb8e193 Merge branch 'master' into getting-started-panel 2016-11-08 16:23:01 +01:00
Torkel Ödegaard d92bb677df docs(): fix title 2016-11-08 16:15:34 +01:00
Torkel Ödegaard 4c891e3758 docs(): minor spelling fix 2016-11-08 15:06:07 +01:00
Torkel Ödegaard fd09f17cd3 docs(): alerting docs, #6490 2016-11-08 14:53:28 +01:00
bergquist 8713dd8221 tech(docker): pin elastic to 2.4.1 for dev 2016-11-08 14:31:59 +01:00
Utkarsh Bhatnagar e642dce027 Fixed import dashboard bug (#6480) 2016-11-08 14:03:04 +01:00
Matt Toback b8ad86fabd Alert pulse tweak (#6508)
* Added faint tint of red to alerting panels, started working on animation. more to come

* Finally happy with pulse animation. Ready to merge
2016-11-08 14:02:45 +01:00
bergquist 309391cb79 docs(alerting): not only graphite 2016-11-08 11:24:39 +01:00
bergquist 5445e47fd5 docs(alerting): typo 2016-11-08 11:24:19 +01:00
bergquist 1f2b8044b2 docs(notifications): format as table 2016-11-08 11:14:35 +01:00
Torkel Ödegaard b658f38036 docs(): added what new in v4 article and initial draf of alerting docs, #6490 2016-11-08 11:09:10 +01:00
bergquist 8ca18b511f docs(alerting): add docs for alert notifications 2016-11-08 10:58:59 +01:00
Torkel Ödegaard dea5fd385f ux(alerting): minor wording change on alert tab 2016-11-08 09:34:52 +01:00
Torkel Ödegaard 49af12f69f Merge branch 'master' of github.com:grafana/grafana 2016-11-08 09:31:19 +01:00
Carl Bergquist a7be3b91fd Merge pull request #6499 from utkarshcmu/last
Added last function for alerting conditions
2016-11-08 09:10:35 +01:00
utkarshcmu 841fb74b39 Reversed loop for last function 2016-11-07 23:16:57 -08:00
utkarshcmu 74632b5e98 Added last function for alerting conditions 2016-11-07 23:16:57 -08:00
bergquist 5bbdd99d35 tech(notifications): remove async webhook 2016-11-08 08:06:42 +01:00
bergquist 66f257e382 tech(pagerduty): make api call sync 2016-11-08 07:51:19 +01:00
bergquist 7bc80d0374 tech(pagerduty): declare url as constant 2016-11-08 07:50:58 +01:00
bergquist 6dd076efc1 Merge branch 'alerting_pagerduty' of https://github.com/utkarshcmu/grafana into utkarshcmu-alerting_pagerduty 2016-11-08 07:48:20 +01:00
Carl Bergquist bdcff9d15c Merge pull request #6501 from utkarshcmu/invalid_state
Removed invalid alerting state from the UI
2016-11-08 07:00:55 +01:00
utkarshcmu a7e67f3bdd Removed invalid alerting state 2016-11-07 17:43:13 -08:00
Carl Bergquist 9479364600 Merge pull request #6481 from msound/update-github-auth-documentation
Update github auth docs
2016-11-07 20:42:05 +01:00
Carl Bergquist f7f64fbe95 Merge pull request #6495 from rogerswingle/add-govcloud
Add AWS Govcloud Region
2016-11-07 20:36:38 +01:00
Torkel Ödegaard 901e670db4 docs(): minor tweak 2016-11-07 19:58:30 +01:00
Roger Swingle 69ff13adce add govcloud 2016-11-07 13:56:29 -05:00
utkarshcmu 5549d8658a Fixed description message 2016-11-07 07:27:31 -08:00
utkarshcmu f8d1eb11a9 Removed ExecError state 2016-11-07 07:12:43 -08:00
utkarshcmu 4b53ea0a56 Fixed pagerduty tests 2016-11-07 07:08:52 -08:00
utkarshcmu 638d3bcb42 Removed NoData option 2016-11-07 07:08:51 -08:00
utkarshcmu de0fa3d479 Added pagerduty tests 2016-11-07 07:08:51 -08:00
utkarshcmu df8cd764b2 Added trigger options with Pagerduty 2016-11-07 07:08:51 -08:00
utkarshcmu 139bbecc10 Added Pagerduty basic alerting 2016-11-07 07:08:51 -08:00
Torkel Ödegaard a100836bb4 docs(): Added pages for alerting docs, added keyboard shortcuts doc article, #6490 2016-11-07 15:18:27 +01:00
Carl Bergquist 3607316920 Merge pull request #6489 from bergquist/reduce_notification_states
Reduce alerting states
2016-11-07 15:18:07 +01:00
bergquist b2d8e83c7d fix(alert_tab): better execution state description 2016-11-07 14:54:42 +01:00
bergquist 56340bfdfb fix(influxdb): fixes bug when using regexps/numbers in tags
closes #6488
2016-11-07 14:26:20 +01:00
bergquist d7f11c304c tech(alerting): set prev state when creating eval context 2016-11-07 13:01:54 +01:00
bergquist 489f087fbd feat(alerting): reduce states. Make exeuction result configurable.
ref #6444
2016-11-07 12:42:39 +01:00
bergquist 16e7bfc622 docs(changelog): add note about closing #6292 2016-11-07 08:10:36 +01:00
Carl Bergquist d670f1b959 Merge pull request #6479 from utkarshcmu/playlist_bug
Removed playlist item when dashboard is deleted
2016-11-07 08:00:57 +01:00
bergquist f0b591b89b feat(alerting): extract logic state updates and notifications
ref #6444
2016-11-07 07:57:34 +01:00
Torkel Ödegaard b88791135f sasslint fix 2016-11-06 18:05:01 +01:00
Torkel Ödegaard 907fb9c1be ux(dashboard): fix for dropzone width when resizing another panel 2016-11-06 17:41:17 +01:00
Mani Soundararajan db77dfea7a Update github auth docs
In Github's "allowed organizations" scenario, it makes sense to have
`allow_sign_up` to be `true` as most administrators will expect their
org's github users to be able to sign in without further steps like
creating a local user first.
2016-11-06 20:48:14 +05:30
Torkel Ödegaard 2d19af601a fix(alerting): various alerting fixes 2016-11-06 15:40:02 +01:00
Torkel Ödegaard 05c124bb1e docs(changelog): correct changelog 2016-11-06 11:07:52 +01:00
utkarshcmu c737704eeb Removed playlist item when dashboard is deleted 2016-11-06 01:49:43 -08:00
Torkel Ödegaard 8db40b25db ux(dashboard): final tweaks to view mode and kiosk mode, better animation for view mode, and kiosk mode can be entered via kiosk url parameter, #6476 2016-11-06 10:15:36 +01:00
Torkel Ödegaard bd996a4810 ux(viewmode): refining view mode #6476 2016-11-05 21:05:12 +01:00
Torkel Ödegaard 3df4375e39 docs(changelog): updated changelog with new ux improvements 2016-11-05 14:28:40 +01:00
Torkel Ödegaard d38de2cc8b ux(view/kiosk mode): added view mode and kiosk mode, #6476 2016-11-05 14:23:37 +01:00
Torkel Ödegaard 0d82fb71ad ux(keybindings): updated look of dashboard keybindings help modal, #6465 2016-11-05 12:19:52 +01:00
Torkel Ödegaard aaa174a091 ux(dashboard): minor fix so hide controls hide panel resize handles 2016-11-05 08:32:16 +01:00
Torkel Ödegaard 2b81b204aa docs(): fixing image urls in docs 2016-11-04 20:29:17 +01:00
Torkel Ödegaard 3cc4a194a9 ux(keybindings): polish help modal with keybindings, #6465 2016-11-04 17:19:03 +01:00
Torkel Ödegaard 4ab095b051 fix(ux): fixed issue with row menu gliding over header, or in realting extending outside it's bound and not getttin the menu background 2016-11-04 15:35:32 +01:00
Carl Bergquist 741faa2299 Merge pull request #6468 from utkarshcmu/changelog_entry
Added OpenTSDB nested templating fix entry to CHANGELOG
2016-11-04 15:01:46 +01:00
utkarshcmu a78db041ea Added OpenTSDB nested templating fix to CHANGELOG 2016-11-04 06:57:26 -07:00
Carl Bergquist 8bc0462877 Merge pull request #6467 from utkarshcmu/slack_mention
Added Slack mention feature
2016-11-04 14:14:32 +01:00
utkarshcmu dc3a62da83 Added slack tests , fixed webhook tests 2016-11-04 06:05:44 -07:00
utkarshcmu 2f60929d1e Added slack mention functionality 2016-11-04 06:05:44 -07:00
Torkel Ödegaard 6fa89456d6 build(): updated glob node package 2016-11-04 13:58:06 +01:00
Torkel Ödegaard 2da2d5df56 Merge branch 'master' of github.com:grafana/grafana 2016-11-04 12:15:08 +01:00
Torkel Ödegaard c99f4cb9c5 ux(dashboard): minor cleanup 2016-11-04 12:14:43 +01:00
Torkel Ödegaard 2fa7100c3b ux(dashboard): lots of tweaks and polish to row menu, added remove X to add panel and row option views, #6442 2016-11-04 11:43:49 +01:00
Ryan Bak 7165c866c2 Add blank default options for constant templates (#6460)
Restores ability to change constant templates without going into
templating menu
2016-11-04 11:41:39 +01:00
TerraTech 05d24020b1 settings.html: Fixup filename for custom.ini (#6463) 2016-11-04 11:41:12 +01:00
Carl Bergquist 691956bd33 Merge pull request #6363 from Noah-Heil/patch-1
Added two hints to help newer users
2016-11-04 11:12:20 +01:00
bergquist f0d9d133c6 tech(slack): format code using gofmt 2016-11-04 07:55:15 +01:00
Matt 616e9ce5f6 Changed panel-handle cursor to proper 2 directional 2016-11-03 22:56:39 -04:00
Matt cf248a503b Added panel name to individual add panel item to show full name when long 2016-11-03 17:49:54 -04:00
Matt 80f8c0712c Merge branch 'v4ux' of https://github.com/grafana/grafana into v4ux 2016-11-03 17:41:54 -04:00
Matt 308cc9d9f6 Thinned out fonts for row headers, sits much nicer in the dashboard 2016-11-03 17:41:35 -04:00
Torkel Ödegaard abf1f6a163 ux(dashboard): added back hide controls toggle and shortcut, #6442 2016-11-03 22:39:59 +01:00
Torkel Ödegaard d0513d3a54 ux(dashboard): changed name of delete row to remove row, #6442 2016-11-03 22:32:04 +01:00
Torkel Ödegaard 0da60a8bb2 ux(dashboard): minor tweak to row menu animation, it hides in a better way now after click #6442 2016-11-03 22:29:53 +01:00
Torkel Ödegaard 98be1734fa ux(dashboard): refining new row slide out menu, #6442 2016-11-03 22:14:29 +01:00
Torkel Ödegaard d917f69255 Merge branch 'v4ux' of github.com:grafana/grafana into v4ux 2016-11-03 20:32:45 +01:00
Torkel Ödegaard 82592f0c13 ux(help): began work on new help modal 2016-11-03 20:32:36 +01:00
Matt 4e15e61b39 Added vertical ellipses, played with box shadows and borders and such. Ellipses need to fade to Opacity 0 when menu is open. 2016-11-03 15:12:39 -04:00
bergquist 2d7bb4a9f3 fix(tsdb): broken build :( 2016-11-03 19:20:53 +01:00
bergquist b578d06e4a chore(notification): improve log message 2016-11-03 18:04:50 +01:00
bergquist 1afe0e90f9 fix(tsdb): fixes broken legend buidler for prometheus
closes #6456
2016-11-03 18:04:09 +01:00
bergquist 0059beb85d chore(tsdb): remove commented code 2016-11-03 17:34:57 +01:00
bergquist 4af420f759 tech(alerting): refactor how evalhandler uses conditions 2016-11-03 17:31:36 +01:00
Carl Bergquist 262b806193 Merge pull request #6455 from utkarshcmu/opentsdb_template_fix
Fixed multi-value nested templating for opentsdb
2016-11-03 17:11:52 +01:00
Torkel Ödegaard 3e712178cc ux(dashboard): began removing build mode and adding new slide out row menu 2016-11-03 15:50:11 +01:00
Torkel Ödegaard f91e067235 ux(dashboard): keybinding changes / new, #6442 2016-11-03 15:14:44 +01:00
Torkel Ödegaard 8ea2d3f19c ux(dashboard): removed getting started stuff from dashlist panel, #6442 2016-11-03 13:24:01 +01:00
Torkel Ödegaard e80241b5f4 ux(dashboard): minor tweaks 2016-11-03 13:19:40 +01:00
Torkel Ödegaard f1137e4d20 ux(dashboard): removed green row icon gain, replaced with collapse icon, #6442 2016-11-03 11:30:25 +01:00
Carl Bergquist 61c48aecc2 [Alertlist] Set max-height to respect row height (#6454)
* feat(alertlist): max-height to respect row height

closes #6417

* feat(alertlist): use pre calculated panel.height instead

* style(alertlist): rearrange variable order
2016-11-03 11:01:21 +01:00
utkarshcmu 89cf32b160 Made quotes consistent 2016-11-03 01:22:24 -07:00
utkarshcmu 849ac9441a Fixed multi-value nested templating for opentsdb 2016-11-03 01:18:54 -07:00
bergquist c138b04c5e feat(alerting): avoid double logging 2016-11-03 07:25:00 +01:00
bergquist ff5d4e8e0c fix(alerting): temp fix for broken AND condition
This should be refactored. lets return condition results instead
of setting new value on the evalContext. The condition execution
should only be able to update its own state.

closes #6449
2016-11-03 07:18:39 +01:00
Carl Bergquist 89a3d023ce Merge pull request #6453 from utkarshcmu/alert_message_typo
Log bad alert config and fixed alert message typo
2016-11-03 07:12:36 +01:00
Carl Bergquist bb7f03c91e Merge pull request #6446 from utkarshcmu/graphite_alerting_fix
Fixed intervalFormat for Graphite Alerting
2016-11-03 06:58:51 +01:00
utkarshcmu fc91231104 Fixed failing tests 2016-11-02 22:31:59 -07:00
utkarshcmu d009c6b953 Log bad alert config 2016-11-02 18:22:24 -07:00
utkarshcmu 942de5497e Fixed alert message typo 2016-11-02 18:13:11 -07:00
Torkel Ödegaard 075c722527 ux(dashboard): worked on single row edit mode, #6442 2016-11-02 22:24:08 +01:00
Matt Toback 15e369ec02 First pass of getting started panel for home dashboard 2016-11-02 17:21:11 -04:00
bergquist d1d7c240f9 tech(mailer): dont use deprecated method 2016-11-02 22:11:59 +01:00
Torkel Ödegaard e23f898418 ux(dashboard): minor tweaks and polish, added g a shortcut for go to alerting list 2016-11-02 22:08:17 +01:00
Torkel Ödegaard cdea420285 ux(dashboard): fixes for changing panel tabs, #6442 2016-11-02 21:45:46 +01:00
Carl Bergquist 377d9f4a78 Merge pull request #6452 from utkarshcmu/tooltip_bug
Fixed the tooltip message for slack notifier
2016-11-02 20:46:05 +01:00
utkarshcmu 2b28cf1ff1 Fixed the tooltip message for slack notifier 2016-11-02 12:42:33 -07:00
utkarshcmu 33ee85ede9 Commented strange behavior of tests 2016-11-02 11:11:06 -07:00
Torkel Ödegaard 47aae7f1f2 ux(dashboard): added more shortcusts to v/edit panel, #6442 2016-11-02 17:03:14 +01:00
Torkel Ödegaard 95e7ead89b ux(dashboard): varius dashboard ux fixes and keybinding improvements, press 'e' while hovering over panel will open dashboard in edit mode, pressing 'd' will remove panel, #6442 2016-11-02 15:16:48 +01:00
Torkel Ödegaard 19509d1e7a ux(dashboard): minor fix, #6442 2016-11-02 13:49:12 +01:00
Torkel Ödegaard 40ea014fa8 ux(dashboar): added shortcut for build mode, switched keybinding lib to mousetrap, supports sequences so also added for Go to home dashboard, open search with starred dashbords prefiltered, go to profile, #6442 2016-11-02 12:55:58 +01:00
Torkel Ödegaard 3c1435253d feat(ux dashboard editmode): added shortcut to setting menu, #6442 2016-11-02 11:05:28 +01:00
utkarshcmu a4a2e35bb2 Verified interval format function and gofmt check 2016-11-02 02:07:08 -07:00
bergquist d4bc92b267 feat(tsdb): default tsdb httpclient 2016-11-02 08:51:34 +01:00
utkarshcmu 2088363bf9 Added tests for graphite alerting 2016-11-02 00:00:18 -07:00
utkarshcmu 1e8beb8983 Fixed intervalFormat for Graphite Alerting 2016-11-01 17:55:45 -07:00
bergquist 9b28bf25a4 docs(cli): add info about how to install specific plugin version
closes #6434
2016-11-01 18:35:15 +01:00
Carl Bergquist e659eb745d Merge pull request #6420 from utkarshcmu/alerting_initial_state
Alerts not sent when state is changed from "initialized" to "ok"
2016-11-01 18:30:14 +01:00
Torkel Ödegaard 8980f481f7 fix(ux dashboard): panel height fix to reduce jumpiness when loading dashboard 2016-11-01 16:11:26 +01:00
Torkel Ödegaard 8eee4d8e6b fix(dashboard): fixed white theme for new dashboard row look / dash edit mode, #6442 2016-11-01 16:06:49 +01:00
utkarshcmu 7490c49f60 Alert un paused to pending state 2016-11-01 07:58:38 -07:00
Torkel Ödegaard f3090d8cd4 fix(dashboard): fixed issue with resizing panel, #6442 2016-11-01 15:33:20 +01:00
utkarshcmu d9f2519916 Renamed Initialized to Pending 2016-11-01 07:30:55 -07:00
Torkel Ödegaard 18056e53cc ux(dashboard): Fixing broken unit test made by changes for dash edit mode, #6442 2016-11-01 14:35:35 +01:00
Torkel Ödegaard 786afda4c3 ux(dashboard): edit mode fixes 2016-11-01 13:43:05 +01:00
bergquist 578507ae77 tech(cli): add default settings for transport 2016-11-01 08:58:44 +01:00
Carl Bergquist 4b8d9cac6f Merge pull request #6437 from dmvk/feature/grafana-cli-proxy
Take grafana-cli proxy settings from env
2016-11-01 08:53:23 +01:00
bergquist 39f9db8650 Merge branch 'utkarshcmu-slack_notifier' 2016-11-01 08:48:26 +01:00
bergquist 63e2337f6c feat(alerting): change placeholder to info-popover 2016-11-01 08:46:31 +01:00
David Moravek c6257b30c1 Take grafana-cli proxy settings from env 2016-10-31 23:14:48 +01:00
utkarshcmu 95117a0bc9 Added message parsing functionality 2016-10-31 14:55:21 -07:00
utkarshcmu 80fdd830de Added override default recipient functionality 2016-10-31 14:46:51 -07:00
Torkel Ödegaard 48a54edd85 ux(dashboard): improving drag and drop behavior! 2016-10-30 19:37:50 +01:00
Torkel Ödegaard 09a19d8ecb ux(dashboard): progress on ghost empty space panel 2016-10-30 18:02:46 +01:00
Torkel Ödegaard ca1f06f18f hunting memory leaks 2016-10-30 17:11:19 +01:00
Torkel Ödegaard 4d420a0c33 refactor(): dashboard row model and hunting down memory leak 2016-10-30 15:14:18 +01:00
Torkel Ödegaard 57cbefdf0a working on empty space / dropzone ghost panel 2016-10-30 12:05:11 +01:00
Torkel Ödegaard d98191ad65 Merge remote-tracking branch 'origin/row-tabs' into dash-edit-mode 2016-10-30 11:09:09 +01:00
Matt caaeb8e468 Added move row up and down arrows 2016-10-29 09:15:58 -04:00
Torkel Ödegaard 703eda489e ux(row): fixed panel footer hook border 2016-10-29 13:56:47 +02:00
Torkel Ödegaard c6757bed72 ux(dashboard): new row tabs look 2016-10-29 13:51:16 +02:00
Torkel Ödegaard bda5cdcb2f ux(dash edit mode): fix for row height when collapsed 2016-10-29 13:14:37 +02:00
Torkel Ödegaard 591f6536f8 feat(ux): trying to simplify display rules for edit mode / row actions 2016-10-29 13:10:20 +02:00
Torkel Ödegaard 3be9e8e022 Merge branch 'dash-edit-mode' of github.com:grafana/grafana into dash-edit-mode 2016-10-29 11:51:18 +02:00
Torkel Ödegaard 2fbe8cde8a Merge branch 'master' of github.com:grafana/grafana into dash-edit-mode 2016-10-29 11:50:57 +02:00
utkarshcmu dcaae47e96 Fixed tests 2016-10-28 14:54:55 -07:00
utkarshcmu 4c64e45a59 Added initalized state to alerts 2016-10-28 14:44:45 -07:00
Matt d9f99eb501 Added fadeIn animation to non-build mode 2016-10-28 17:09:33 -04:00
Matt 51f55cf6f1 Beginnings of changes to row edits 2016-10-28 16:12:20 -04:00
Torkel Ödegaard e170e47e7c ux(dashboard): minor updates 2016-10-28 16:41:48 +02:00
Torkel Ödegaard 3fc6f6d730 ux(dashboard): minor fixes 2016-10-28 16:37:13 +02:00
Torkel Ödegaard 366650e1ae ux(dashboard): fixed scss issue 2016-10-28 16:30:16 +02:00
Torkel Ödegaard be99c3e20a updates to dashboard edit mode 2016-10-28 16:26:53 +02:00
Torkel Ödegaard 30789308d7 minor change 2016-10-28 14:49:34 +02:00
Torkel Ödegaard 155cce959f more polish on edit mode 2016-10-28 14:38:48 +02:00
Torkel Ödegaard e215ba821c ux(): edit mode polish 2016-10-28 14:13:11 +02:00
Torkel Ödegaard f1a44ad090 ux(): progress on row ux 2016-10-28 13:36:27 +02:00
Eric Uldall 658fc1a67a added hosted domain suppport to google oauth login (#6372) 2016-10-28 12:00:47 +02:00
seanclerkin 7acdbde8f0 Cloudwatch: add support for Aurora specific RDS metrics (#6378) 2016-10-28 12:00:22 +02:00
Hans Kristian Flaatten b5eaa5ea59 Add missing closing " in Docker README (#6413) 2016-10-28 11:55:47 +02:00
Torkel Ödegaard 517ebfaf6d Merge branch 'dash-edit-mode' of github.com:grafana/grafana into dash-edit-mode 2016-10-27 22:11:08 +02:00
Torkel Ödegaard f8395666e6 minor update 2016-10-27 22:11:00 +02:00
Torkel Ödegaard 9c50893221 progress on new design 2016-10-27 21:51:57 +02:00
Leandro Piccilli c9a69c3ed9 Merge branch 'master' of https://github.com/grafana/grafana 2016-10-27 19:00:23 +02:00
Leandro Piccilli 538e1fbc64 Fix templating using query 2016-10-27 18:59:24 +02:00
Matt b58c38a5db Refactored to be a proper list, added x button in upper right. Before cleaning up the CSS, want trent to set some eyes on it and make it look better. 2016-10-27 11:36:46 +02:00
Matt 4633da47ef Merge branch 'dash-edit-mode' of https://github.com/grafana/grafana into dash-edit-mode 2016-10-26 17:52:41 +02:00
Matt e7f5b76570 Added styles and new markup for dashlist panel 2016-10-26 17:52:37 +02:00
Torkel Ödegaard c609586ff0 ux(dashboard): making progress on new add panel experiance 2016-10-26 17:42:39 +02:00
Torkel Ödegaard f1f923abb9 build fix 2016-10-26 14:31:47 +02:00
Torkel Ödegaard 113a772e33 ux(dashboard): add panel stuff 2016-10-26 12:19:18 +02:00
Torkel Ödegaard 280709327c updated 2016-10-25 17:33:22 +02:00
Torkel Ödegaard 7b0eb6d0bb feat(dashboard): progress on dash edit mode 2016-10-25 16:36:40 +02:00
Utkarsh Bhatnagar b382d17e34 Fixed alerting bug for mysql (#6375) 2016-10-25 14:52:20 +02:00
Torkel Ödegaard 5e1f1c0989 updated 2016-10-25 12:12:59 +02:00
Torkel Ödegaard b45bd07032 ux(dashboard): when saving dashbord with default new dashboard title show Save As Dialog, #6099 2016-10-25 11:11:21 +02:00
Torkel Ödegaard 8a715cd122 using gf-form in row header 2016-10-25 10:47:13 +02:00
Torkel Ödegaard d1cc890ed3 Merge branch 'master' into dash-edit-mode 2016-10-24 14:57:30 +02:00
Torkel Ödegaard 556547b316 ux(panel resize): snap to even 12ths spans 2016-10-24 14:57:13 +02:00
Torkel Ödegaard d6c07d242c Merge branch 'master' into dash-edit-mode 2016-10-24 14:51:35 +02:00
Torkel Ödegaard 4db723ea81 ux(panel resize): snap to even 12ths spans 2016-10-24 14:40:46 +02:00
Torkel Ödegaard 6fb81f54bb ux(): minor fix 2016-10-24 14:12:19 +02:00
Torkel Ödegaard 01627b3a68 feat(ux): dashboard edit mode progress 2016-10-24 13:50:38 +02:00
Utkarsh Bhatnagar 10a42cc98c CHANGELOG entry (#6362) 2016-10-24 11:11:44 +02:00
Noah Heil 56ccd80cce Added two hints to help newer users
I spent a couple of hours trying to figure out why the cloudwatch datasource was not working and the "internal error" notice was not helpful. So I added some hints so that people who are a little newer to linux/aws/grafana wont have to suffer like I did.
2016-10-24 03:05:16 -06:00
Utkarsh Bhatnagar 86ca7ddda4 Added explicitTags support for OpenTSDB>=2.3 (#6361) 2016-10-24 09:15:19 +02:00
Torkel Ödegaard 29e834e74b feat(UX): revived dash-edit-mode branch, #6099 2016-10-23 10:05:31 +02:00
Torkel Ödegaard 1bb8192a38 Merge branch 'master' into dash-edit-mode 2016-10-23 10:03:55 +02:00
Torkel Ödegaard 42961ef8a0 fix(dashbard): fixed issue confirmig when saving a dashboard with conflict 2016-10-22 12:34:18 +02:00
Torkel Ödegaard 8735a84685 Merge branch 'master' of github.com:grafana/grafana 2016-10-22 11:51:48 +02:00
Torkel Ödegaard 8bb2f11505 Merge branch 'alerting_keeplast' 2016-10-22 11:51:16 +02:00
Carl Bergquist bc90e6ce46 Alerting: Keep last state on no data (#6354)
* feat(alerting): add support to keep last state on no data

closes #6332

* refactoring(alerting PR #6354): added new option type for NoData option so AlertStateType does not have to contain invalid state, #6354
2016-10-22 10:56:04 +02:00
Torkel Ödegaard a2e14f56e4 refactoring(alerting PR #6354): added new option type for NoData option so AlertStateType does not have to contain invalid state, #6354 2016-10-22 10:54:50 +02:00
Torkel Ödegaard 4999fff29b fix(alerting): fixed email notification so it splits email address multiple ways, fixes #6353 2016-10-22 10:24:31 +02:00
Torkel Ödegaard b32bbbd1a2 fix(influxdb): enforce database restriction, fixes #6352 2016-10-22 10:03:02 +02:00
Torkel Ödegaard 401c67d136 fix(dashboard): re-render panels when leaving fullscreen mode, fixes #6312 2016-10-22 09:51:18 +02:00
Torkel Ödegaard 1581bf8d5b fix(docs): added api_url to configuration docs, fixes #6351 2016-10-22 08:51:32 +02:00
bergquist 6e65c93203 fix(cli): improve error handling 2016-10-21 16:03:02 +02:00
bergquist 2c7dbde06a feat(alerting): recover from panic 2016-10-21 14:46:58 +02:00
bergquist ad56f67ad1 feat(alerting): add support to keep last state on no data
closes #6332
2016-10-21 14:00:20 +02:00
Torkel Ödegaard 96008c9738 Squashed commit of the following:
commit 4113ed00782590187d19dd2f8cbae683f164142c
Author: Torkel Ödegaard <torkel.odegaard@gmail.com>
Date:   Fri Oct 21 10:47:35 2016 +0200

    docs(): minor fix for docs index page

commit 45478d120571519462fac905aadeab5954696690
Author: Torkel Ödegaard <torkel.odegaard@gmail.com>
Date:   Thu Oct 20 14:28:21 2016 +0200

    updated

commit c9c1c1d5a462f85e8001a45218f24102583d7aee
Author: Torkel Ödegaard <torkel.odegaard@gmail.com>
Date:   Thu Oct 20 14:27:34 2016 +0200

    docs(): updated image refs

commit 5fa0f27963968d77bbbbb7edd973847ea72135e3
Author: Torkel Ödegaard <torkel.odegaard@gmail.com>
Date:   Wed Oct 19 14:33:04 2016 +0200

    docs is almost done

commit 6b988c90cb08563e2c27212338c2947e69f6fcc3
Author: Torkel Ödegaard <torkel.odegaard@gmail.com>
Date:   Tue Oct 18 20:45:28 2016 +0200

    almost done

commit 17757c21ed813892ddb1f289f2e52613caf7bcef
Author: Torkel Ödegaard <torkel@grafana.org>
Date:   Tue Oct 18 16:45:48 2016 +0200

    making progress on docs

commit f06c815991dd81b8893912a6da04a17b80b63fda
Author: Torkel Ödegaard <torkel.odegaard@gmail.com>
Date:   Tue Oct 18 14:30:55 2016 +0200

    progress on new docs

commit 5197237426252623de2d8b9cc22ddbbdbb240763
Author: Torkel Ödegaard <torkel.odegaard@gmail.com>
Date:   Tue Oct 18 13:25:26 2016 +0200

    making progress

commit 33e2b6b617f16f65878141cf11e54b2817a2ea96
Merge: de385e5 ecb4a99
Author: Torkel Ödegaard <torkel.odegaard@gmail.com>
Date:   Tue Oct 18 12:17:58 2016 +0200

    Merge branch 'new-docs' of github.com:grafana/grafana into new-docs

commit ecb4a99dd54aa39f17d9bf4d7e132a389812f8fd
Author: Torkel Ödegaard <torkel@grafana.org>
Date:   Tue Oct 18 10:39:59 2016 +0200

    keep urls for now

commit de385e56d86b071cf2150ccf9f1aa06ec5187277
Author: Torkel Ödegaard <torkel.odegaard@gmail.com>
Date:   Mon Oct 17 17:56:18 2016 +0200

    more progress

commit 8469ebc239ab2316cbbc01862e5026737f272f00
Author: Torkel Ödegaard <torkel.odegaard@gmail.com>
Date:   Mon Oct 17 17:08:06 2016 +0200

    progress on new docs

commit e755f656b12534cfcb23bad11f1fa696e43f7428
Merge: 4644a35 35cce3b
Author: Torkel Ödegaard <torkel.odegaard@gmail.com>
Date:   Mon Oct 17 12:21:27 2016 +0200

    Merge branch 'new-docs' of github.com:grafana/grafana into new-docs

commit 4644a35102555204787e91041b50dcbfe0f7a213
Merge: 25c4bef 977cdd5
Author: Torkel Ödegaard <torkel.odegaard@gmail.com>
Date:   Mon Oct 17 12:21:11 2016 +0200

    Merge branch 'master' of github.com:grafana/grafana into new-docs

commit 35cce3bef802fac020a53693b02c112a91a096fc
Author: Torkel Ödegaard <torkel@grafana.org>
Date:   Mon Oct 17 09:31:17 2016 +0200

    progress on #6170

commit 25c4bef629de7d77218ba95cc3bd25fb50bb19d6
Author: Torkel Ödegaard <torkel.odegaard@gmail.com>
Date:   Sun Oct 16 15:05:30 2016 +0200

    fix for osx

commit 6c6b52f975630be87da23dd51beafaecb820cec2
Author: Torkel Ödegaard <torkel@grafana.org>
Date:   Sun Oct 16 12:56:39 2016 +0200

    progress on new docs

commit 6a09633981ab26191d5542dbe3a788846ac6b73d
Author: Torkel Ödegaard <torkel@grafana.org>
Date:   Sat Oct 15 11:39:49 2016 +0200

    progress on new docs

commit 7d533fbc23e41b86fd1ba9c955dd17ae1ad977e5
Author: Torkel Ödegaard <torkel@grafana.org>
Date:   Mon Oct 10 09:25:12 2016 +0200

    making progress on new docs site

commit 50392ce98edfa201977716e92e4a86f9d48ae386
Author: Torkel Ödegaard <torkel@grafana.org>
Date:   Sun Oct 9 20:02:28 2016 +0200

    feat(new docs): progress on new docs site

commit 81a3d3d0952d3a5d790412e90d01ac5a247e0686
Author: Torkel Ödegaard <torkel@grafana.org>
Date:   Fri Oct 7 07:52:11 2016 +0200

    new docs site experiment

commit 704adc98664665b3624087ab38ce29fc9da005f1
Author: Torkel Ödegaard <torkel@grafana.org>
Date:   Sat Oct 1 20:46:53 2016 +0200

    new docs poc
2016-10-21 11:01:34 +02:00
Carl Bergquist 5520454523 Merge pull request #6344 from roidelapluie/cuu
Allow to set current on graph panel
2016-10-21 09:30:48 +02:00
bergquist 5bf5ed68e1 tech(notifications): replace internal email code 2016-10-21 09:06:03 +02:00
bergquist f77799837e feat(alerting): support for attached graphs in alert notifications
closes #6183
2016-10-21 09:06:03 +02:00
bergquist ded5a0a9d5 tech(alerting): remove unused code 2016-10-21 09:05:54 +02:00
Carl Bergquist 206a6b0a47 Merge pull request #6346 from cglewis/master
fix cla link; formatting and grammar fixes
2016-10-21 08:57:14 +02:00
cglewis 3931e0b743 fix cla link; formatting and grammar fixes 2016-10-20 13:08:12 -07:00
Julien Pivotto d1eb7e5fcd Allow to set current on graph panel
Refs #6335

Signed-off-by: Julien Pivotto <roidelapluie@inuits.eu>
2016-10-20 21:13:32 +02:00
Carl Bergquist 1ce0b8fe25 Merge pull request #6333 from utkarshcmu/alerting_typo
Fixed typo
2016-10-20 11:26:02 +02:00
utkarshcmu b989b08781 Fixed typo 2016-10-20 02:22:37 -07:00
Eric Uldall eda442dbf9 added support to login user oauth user by email only (#6330)
* added support to login user oauth user by email only

* added sql handler

* fixed model method name from GetUserByEmail to GetUserByEmailQuery

* fixed variable declaration typo
2016-10-20 06:45:10 +02:00
bergquist 9badb051ba fix(changelog): typo 2016-10-20 06:38:45 +02:00
bergquist f2cbfece2c feat(notification): add helptext for using multiple email addresses 2016-10-19 17:04:17 +02:00
bergquist 6ea0f0120e feat(notifications): switch to ; seperator
using \n caused problems with the json deserialisation.

closes #6326
2016-10-19 16:34:12 +02:00
bergquist 3ac38dfe70 Merge branch 'alerting_opentsdb' 2016-10-19 13:16:16 +02:00
bergquist 2df8c649b7 Merge branch 'master' into alerting_opentsdb 2016-10-19 13:15:22 +02:00
bergquist 5fbab038e8 fix(opentsdb): can always return false 2016-10-19 13:14:42 +02:00
Torkel Ödegaard a826591eed Merge branch 'master' of github.com:grafana/grafana 2016-10-19 13:14:34 +02:00
Carl Bergquist 497eca0190 Merge pull request #6325 from utkarshcmu/alerting_opentsdb
Implmented targetContainsTemplate for OpenTSDB
2016-10-19 13:07:33 +02:00
utkarshcmu 62895114e1 Implmented targetContainsTemplate for OpenTSDB 2016-10-19 03:54:41 -07:00
bergquist 4c2f2eeb58 feat(opentsdb): add mock method for detecting targets with template values 2016-10-19 11:45:39 +02:00
bergquist 20bfe443fe feat(prometheus): trim labelname lookup key
closes #6300
2016-10-19 08:57:58 +02:00
bergquist b2d5b920f5 feat(alerting): allow editor to modify notifications
closes #6314
2016-10-19 08:01:31 +02:00
Carl Bergquist a1e97b0067 Merge pull request #6290 from utkarshcmu/alerting_opentsdb
Opentsdb alerting feature completed, ready for testing
2016-10-19 07:50:40 +02:00
Eric Uldall 9468ddeed5 Issues/6317 empty google login (#6318)
* added Login property to google_oauth model

* fixed spacing

* fixed google_oauth syntax error, missing comma before newline

* set noexpandtab for commit
2016-10-19 07:43:32 +02:00
utkarshcmu 333a853948 Fixed for loop and append 2016-10-18 08:48:06 -07:00
bergquist d1eceedf55 feat(webhook): add httpmethod to webhook
closes #6255
2016-10-18 16:50:16 +02:00
bergquist 9429434cb5 feat(influxdb): use database auth if provided
closes #6310
2016-10-18 15:12:04 +02:00
Mitsuhiro Tanda a8dd44918b support future time range 2016-10-18 19:39:04 +09:00
bergquist 2b55cf609c tech(build): include sha1 as artifact 2016-10-18 11:42:25 +02:00
bergquist d016fc1da1 tech(build): create sha files for windows build 2016-10-18 10:54:17 +02:00
Carl Bergquist 860865bd55 Merge pull request #6303 from mtanda/cw_region
(cloudwatch) add region
2016-10-18 08:48:44 +02:00
Mitsuhiro Tanda 888619d74e (cloudwatch) add region 2016-10-18 12:28:20 +09:00
utkarshcmu 10d581dd0a Added unit tests for query parsing 2016-10-17 14:51:51 -07:00
utkarshcmu 2374d09877 Fixed query parsing bugs 2016-10-17 14:50:53 -07:00
bergquist 97008f90c4 tech(build): semicölöns 2016-10-17 15:19:00 +02:00
bergquist 75a1ff1037 tech(build): dont override arch for windows 2016-10-17 15:09:35 +02:00
bergquist 0abc22f272 tech(build): make artifact path less strict 2016-10-17 14:35:09 +02:00
mkm85 977cdd5933 Fix cloudwatch multivalue (#6282)
* Fixed missing contains variable problem

* allow All option to be used in cloudwatch templating
2016-10-17 11:33:28 +02:00
bergquist b6d112f8d7 tech(build): appveyor formating 2016-10-17 09:34:58 +02:00
bergquist 6c7e227d2f Merge branch 'master' of github.com:grafana/grafana 2016-10-17 09:29:29 +02:00
Paul Traylor a45a487ad3 Update query for "Rule Eval Duration" (#6294)
This query was changed to use seconds in https://github.com/prometheus/prometheus/commit/f69e668fc468dfa2feb13603237810b8d748d87e
2016-10-17 08:37:59 +02:00
utkarshcmu ace81760ea Added tests file for writing tests 2016-10-16 12:10:13 -07:00
utkarshcmu b7744b4928 Added tags and filters params to alerting 2016-10-16 10:55:07 -07:00
utkarshcmu 35f93f4117 Added rate params to alerting 2016-10-16 05:20:58 -07:00
utkarshcmu cc0a39f816 Added downsampling params to alerting 2016-10-16 04:12:13 -07:00
benrubson 807bc5eb47 Add time back to result array 2016-10-16 01:09:00 +02:00
benrubson 9792bd7b08 Typo 2016-10-16 00:46:56 +02:00
benrubson 604dcbc6b2 Missing values, corect tooltip 2016-10-16 00:30:50 +02:00
benrubson 07bf4c0b82 Missing values, keep interpolation 2016-10-16 00:29:15 +02:00
benrubson 04a276dc2c Missing values, correctly highlight last point 2016-10-15 16:51:18 +02:00
benrubson 8d5269dea7 Typo 2016-10-15 13:17:11 +02:00
benrubson 43129aa563 Missing values, correct graph specs 2016-10-15 13:10:19 +02:00
benrubson c976448f6a Missing values, stack null & missing values 2016-10-15 13:07:41 +02:00
benrubson 2cdd097b3a Missing values, correct timeStep 2016-10-15 11:43:36 +02:00
Ben RUBSON d1e8418c74 Correct tooltip timestamp (#6283)
Corrects #6275, follows #6211
2016-10-15 08:02:07 +02:00
Torkel Ödegaard c1567ae595 fix(build): fixes #6284 2016-10-15 08:00:48 +02:00
Torkel Ödegaard 04c23ef322 fix(SIGHUP): ignore SIGHUP syscall, fixes #6276 2016-10-14 14:23:22 +02:00
Torkel Ödegaard 30645a6d3d refactor(alerting): initial step for seperating alerting and dash model, #6273 2016-10-14 13:06:29 +02:00
bergquist 466e62968e tech(build): publish artifacts to s3 2016-10-14 10:37:31 +02:00
bergquist ec4260e14f tech(build): remove commented build steps 2016-10-14 10:26:08 +02:00
bergquist 5e0fa0f0ad feat(opentsdb): context aware http requests 2016-10-14 10:21:47 +02:00
bergquist 6d6d6d90fc Merge branch 'utkarshcmu-alerting_opentsdb' into alerting_opentsdb 2016-10-14 10:15:43 +02:00
bergquist f44e360b0d fix(opentsdb): fmt 2016-10-14 10:15:30 +02:00
Torkel Ödegaard 4c26c55fea fix(api): minor change to how pause alert was done 2016-10-14 09:58:22 +02:00
Torkel Ödegaard 46bab0bb37 feat(alerting): remove annotations when deleting alert, closes #6244 2016-10-14 09:43:30 +02:00
Torkel Ödegaard c9d7eb0a7a feat(alerting): added clear history button to alert state history view, #6244 2016-10-14 09:33:42 +02:00
bergquist fe24e6c8a8 Merge branch 'alerting_opentsdb' of https://github.com/utkarshcmu/grafana into utkarshcmu-alerting_opentsdb 2016-10-14 09:19:42 +02:00
bergquist 455df7f0a0 Merge branch 'master' into alerting_opentsdb 2016-10-14 09:17:35 +02:00
bergquist aeb0c5cb53 Merge branch 'master' into interval 2016-10-14 09:15:04 +02:00
bergquist f4e0a9245e feat(influxdb): choose highest interval value 2016-10-14 09:14:13 +02:00
utkarshcmu 4247e92e87 Resolved conflicts 2016-10-14 00:01:36 -07:00
utkarshcmu 06f2047ced OpenTsdb alerting works with metric query 2016-10-13 23:49:28 -07:00
bergquist 998df2a1ac feat(opentsdb): add alerting support to plugin.json 2016-10-13 23:49:27 -07:00
bergquist b8ec1ce9a2 tech(tsdb): add basic skeleton for alerting 2016-10-13 23:49:27 -07:00
bergquist fb99d9d680 feat(build): remove dist from artifact path 2016-10-14 07:05:36 +02:00
bergquist b2acc7cf03 feat(build): build zipfile before creating artifact 2016-10-13 17:51:09 +02:00
Carl Bergquist 0793811b7e Merge pull request #6192 from polynomial/fix_typo
fix(docs): duplicate word data in Graph Panel
2016-10-13 17:17:49 +02:00
bergquist da2aaf7095 feat(build): trigger windows build after successfull CI build 2016-10-13 17:11:04 +02:00
Carl Bergquist 7bdedff89c feat(plugins): make sure windows data plugin path is absolute (#6264) 2016-10-13 15:36:35 +02:00
Torkel Ödegaard 44f064392d feat(alerting): different colored lines/icons for alert annotations based on state, #6244 2016-10-13 15:22:54 +02:00
mdadm fa492c6828 fixed scoping issue with certPool variable (#6261) 2016-10-13 13:38:55 +02:00
bergquist 4144eacc24 feat(influxdb): start parsing interval parameters 2016-10-13 11:42:51 +02:00
bergquist 1506df8c11 feat(alerting): parse the interval value from the panel 2016-10-13 11:19:44 +02:00
Carl Bergquist c0596d0dd0 Merge pull request #6257 from utkarshcmu/opentsdb_lodash
Opentsdb queries fixed without alias but with tags/filters
2016-10-13 07:34:00 +02:00
utkarshcmu 6638605fd1 Removed console.log 2016-10-12 13:47:40 -07:00
utkarshcmu cc3b928708 Opentsdb queries broken if no alias is uses with tags/filters 2016-10-12 13:32:37 -07:00
bergquist 2e4ca64783 fix(cli): improve error handling
closes #6256
2016-10-12 22:31:28 +02:00
Torkel Ödegaard 0f2fa33daf docs(changelog): added fix for #4393 to the changelog 2016-10-12 13:17:30 +02:00
Uros Meglic e1739b6025 (fix)elasticsearch: IP addresses don't survive terms aggregation (#4393) (#6246) 2016-10-12 13:14:57 +02:00
Carl Bergquist ce60efea8a Merge pull request #6249 from txisme/master
Fixed latest builds URL
2016-10-12 13:06:38 +02:00
txisme 2fc7957485 Fixed latest builds URL 2016-10-12 11:27:21 +01:00
bergquist 5a39bf5c58 fix(alert_tab): dont add dup notifications to repeater
closes #6233
2016-10-12 11:27:49 +02:00
Torkel Ödegaard 0bae12e4ae change(graph): Changed default for stack hover value 2016-10-12 11:21:23 +02:00
bergquist c0829903ba fix(alerting): scope variable was updated
closes #6228
2016-10-12 09:46:32 +02:00
Torkel Ödegaard b8b577eafb fix(spelling): minor spelling fix in alerting code 2016-10-12 09:17:48 +02:00
bergquist 5a91d45f3f fix(influxdb): broken unittests 2016-10-12 07:43:30 +02:00
Torkel Ödegaard 1b8a81d4ba fix(alerting): fixed reducer change issue, fixes #6241 2016-10-12 07:04:53 +02:00
Torkel Ödegaard 3d593492c9 fix to text panel and transparent mode 2016-10-12 07:04:53 +02:00
marcv81 150d21800c Do not pass Authorization header in Grafana.net proxy (#6243) 2016-10-12 06:54:33 +02:00
bergquist 885e0366c5 feat(influxdb): support raw queries in alerting
ref #6231
2016-10-11 18:53:09 +02:00
bergquist ccee1b3f96 fix(alerting): fix bug with unhandled error
closes #6239
2016-10-11 17:37:07 +02:00
bergquist 0d4b00df95 feat(alerting): add template validation for influxdb
closes #6230
2016-10-11 16:03:00 +02:00
Torkel Ödegaard 2e21613be7 fix(templating): fixed issues with dynamic dashboard srv (panel/row) repeats, fixes #6237 2016-10-11 15:17:47 +02:00
Corentin Chary 4df379f90c Do not align refresh time (#6178)
When you have a lot of dashboards, all of them
end up refreshing their dashboards at the exact
same time, which isn't particulary good for your
TSDB backend.
2016-10-11 13:57:53 +02:00
Ben RUBSON f7124f1638 Patch: 4 tooltip bugs (#6211)
* Order tooltip by yaxis by default

solves #6174

* typo

* Avoid sorting multiple times

and evaluate series.yaxis.n as it may not exist.

* typo

* typo

* typo

* Tooltip values loose their format when reordered

solves #6208

* Hover the correct point

* Make tooltip sort happy with hidden series
2016-10-11 13:53:49 +02:00
Uros Meglic dc680a41c8 fix(elasticsearch): Query editor allows to remove last group by (#5692) (#6223) 2016-10-11 13:41:13 +02:00
Torkel Ödegaard cace1d6b8f change(plugin page): changed tab order on plugin page, closes #6123 2016-10-11 13:40:16 +02:00
Torkel Ödegaard 73fc659011 fix(graph): fixed issue with old threshold to new threshold model migration, fixes #6236 2016-10-11 13:22:46 +02:00
Torkel Ödegaard f1905a8485 fix(alerting): fixed issue with using nested queries in graphite query used in alerting rule, fixes #5996 2016-10-11 12:50:11 +02:00
bergquist 446bde2421 Merge branch 'pause_alert_rules'
closes #6135
2016-10-11 10:54:58 +02:00
bergquist c6cf7647ff feat(alerting): pausing alerts requires alert id 2016-10-11 10:53:24 +02:00
Carl Bergquist be2054fe51 Merge pull request #6229 from nijanthanh/cloudwatch_ApplicationELB_UnHealthyHostCount_fix
(cloudwatch) Fix UnHealthyHostCount metric of ApplicationELB
2016-10-11 10:36:19 +02:00
bergquist 3162e680c2 tech(notifiers): improve logging for notifications
ref #6228
2016-10-11 10:15:41 +02:00
Torkel Ödegaard 7b70e0ff3a fix(UI): fixed 3 UI bugs, fixes #6225 2016-10-11 09:51:43 +02:00
bergquist 8b0c29b104 Merge branch 'master' into pause_alert_rules 2016-10-11 09:46:48 +02:00
bergquist 4bbc2108f9 feat(alerting): add pause button to alert list 2016-10-11 09:45:38 +02:00
Nijanthan Hariharan 2b8404e178 (cloudwatch) Fix UnHealthyHostCount metric of ApplicationELB
The UnHealthyHostCount metric of ApplicationELB for cloudwatch datasource did not work because the capitalization was wrong - it was UnhealthyHostCount instead of UnHealthyHostCount.
Here is the AWS documentation listing the metric name - http://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-cloudwatch-metrics.html#load-balancer-metrics-alb
2016-10-11 13:10:57 +05:30
Dan Cech 6b16fcea52 Oauth2 Updates (#6226)
* break out go and js build commands

* support oauth providers that return errors via redirect

* remove extra call to get grafana.net org membership

* removed GitHub specifics from generic OAuth

* readded ability to name generic source

* revert to a backward-compatible state, refactor and clean up

* streamline oauth user creation, make generic oauth support more generic
2016-10-11 08:51:44 +02:00
bergquist 804797245d feat(alerting): make it possible to pause from alert tab 2016-10-11 08:40:38 +02:00
Torkel Ödegaard d4fd1c82e3 fix(alerting): added step any to alert threshold input fields, fixes #6205 2016-10-10 19:47:16 +02:00
Dan Cech 519100f1bd Merge pull request #6217 from ericpp/oauth_add_state_param
Added a state parameter for all OAuth requests
2016-10-10 09:58:35 -04:00
bergquist f3825263d4 feat(alerting): add pause button in alert list 2016-10-10 15:17:14 +02:00
Carl Bergquist b0d154d5aa Merge pull request #6221 from grafana/alerting_influxdb
Alerting support for influxdb
2016-10-10 14:32:47 +02:00
bergquist 264590a9c2 feat(alerting): add paused api endpoint 2016-10-10 14:26:09 +02:00
bergquist 19427b59f9 feat(alerting): do not enqueue paused rules 2016-10-10 13:29:10 +02:00
bergquist 04f417a423 feat(alerting): enabled by default. configurable elert engine
closes #6210
2016-10-10 13:09:16 +02:00
bergquist 8d96262106 chore(tsdb): tidy up code 2016-10-10 11:58:06 +02:00
bergquist b841e649ab Merge branch 'master' into alerting_influxdb 2016-10-10 11:38:29 +02:00
bergquist f609623abd style(influxdb): tidy up code 2016-10-10 11:34:52 +02:00
bergquist 95b9f472d1 tech(influxdb): remove unused logging 2016-10-10 11:17:00 +02:00
bergquist f919d04e3c docs(tsdb): improve fill comment 2016-10-10 09:52:53 +02:00
bergquist 0bfb94dc6f feat(tsdb): add interval calculator 2016-10-10 09:45:33 +02:00
Torkel Ödegaard 918481909c fix(metricsegment): fixed issue with metric segment, fixes #6212 2016-10-08 10:23:30 +02:00
Eric Perrino 81443bf8b4 Added a state parameter for all OAuth requests 2016-10-08 01:22:32 -05:00
Torkel Ödegaard 913f17ee8a fix(plugin dashboards): fixed issue with plugin dashboard list, fixes #6215 2016-10-07 16:04:58 +02:00
bergquist 4fafefd66a feat(influxdb): proper support for group by tags 2016-10-07 15:09:54 +02:00
bergquist e499e8850c fix(influxdb): fix for timerange 2016-10-07 11:33:17 +02:00
bergquist 0633e2c03f feat(influxdb): add real support for time ranges 2016-10-07 11:23:37 +02:00
bergquist e36f9fa795 Merge branch 'master' into alerting_influxdb 2016-10-07 10:45:05 +02:00
bergquist a3c91450d5 tech(config): add log.filters to default and sample 2016-10-07 10:39:01 +02:00
Torkel Ödegaard a5cbfc8b98 fix(opentsdb): fixed opentsdb issue, fixes #6206 2016-10-07 08:57:40 +02:00
Eric Perrino d3b0905899 Added allow_sign_up setting to auth.ldap to be able to disable automatic user creation for LDAP logins (#6191) 2016-10-07 08:49:58 +02:00
Wolfram Kroll 7e6595acaf hint about how to override settings from default section (#6181) 2016-10-07 08:48:57 +02:00
bergquist 522d40fa26 fix(influxdb): support mulitple tags 2016-10-06 18:51:17 +02:00
bergquist 87650c150b feat(influxdb): add tags to serie names 2016-10-06 18:47:59 +02:00
bergquist b0addbd7cb feat(influxdb): support multi row results 2016-10-06 15:30:09 +02:00
Torkel Ödegaard dacfa6b978 fixed issue in metric_segment 2016-10-06 15:09:02 +02:00
bergquist d8aa38fafe tech(influxdb): refactor and cleanup 2016-10-06 14:16:26 +02:00
bergquist ab8751767c feat(influxdb): send request and parse response 2016-10-06 12:51:45 +02:00
bergquist b519d5e92c feat(docker): update docker-compose for influxdb 2016-10-06 12:50:06 +02:00
Torkel Ödegaard 04a5ad529c generate sha1 for package files, fixes #913 2016-10-06 10:53:42 +02:00
Torkel Ödegaard cc1452277b added testdata scenario for null data and stacking, also updated testdata dashbord, #2912 2016-10-06 10:53:42 +02:00
bergquist 887ca40455 feat(influxdb): add support for policies 2016-10-05 20:57:28 +02:00
bergquist 4387d20222 feat(influxdb): render select and groupby 2016-10-05 20:36:05 +02:00
bergquist 9968fa5bc5 feat(influxdb): add query part definitions 2016-10-05 16:59:33 +02:00
bergquist 8588bb386c feat(influxdb): add conditions property to tag 2016-10-05 16:57:32 +02:00
Peter Dave Hello bf4c3f3ae6 optimize png images using zopflipng (#6197) 2016-10-05 15:57:50 +02:00
bergquist c7abd3ba4e feat(influxdb): add querypart renderers 2016-10-05 14:42:06 +02:00
bergquist d0e6a9559e feat(influxdb): add query part model 2016-10-05 10:56:34 +02:00
bergquist 92121ea656 feat(alerting): add nop uploader
ref #6183
2016-10-05 07:34:48 +02:00
Benjamin Smith 39769ea65b fix(docs): duplicate word data in Graph Panel 2016-10-04 12:40:34 -07:00
bergquist 946e0bf32e feat(influxdb): parse query json 2016-10-04 21:28:05 +02:00
bergquist e556df5b49 feat(tsdb): add draft implementation for influxdb 2016-10-04 16:25:33 +02:00
bergquist d726f49a8c fix(notification): broken test notifications
ref #6159
2016-10-03 17:03:21 +02:00
bergquist 5a201cfd35 tech(tsdb): abort batch procces when context closes 2016-10-03 14:33:47 +02:00
bergquist d889415c4b tech(tsdb): rename context to query 2016-10-03 14:32:04 +02:00
bergquist 653a0502c4 tech(tsdb): add jsondata to tsdb datasource struct 2016-10-03 14:31:33 +02:00
bergquist 1606b74fce tech(opentsdb): add init ref for opentsdb 2016-10-03 10:59:09 +02:00
bergquist f4a834f84b fix(opentsdb): add context to opentsdb executor 2016-10-03 10:37:49 +02:00
bergquist 8368a4a88a Merge branch 'master' into alerting_opentsdb 2016-10-03 10:36:33 +02:00
bergquist 6f1a9f4f2e Merge branch 'mtanda-cloudwatch_interval' 2016-10-03 10:32:07 +02:00
bergquist f4b5fa4d6a Merge branch 'master' into mtanda-cloudwatch_interval 2016-10-03 10:32:00 +02:00
bergquist 96ca69c5a9 tech(cloudwatch): extract method 2016-10-03 10:31:07 +02:00
Carl Bergquist c38f6ff182 Make alerting notifcations sync (#6158)
* tech(routines): move the async logic from notification to alerting notifier

* tech(notification): reduce code dupe

* fix(notification): dont touch the response unless its an error

* feat(alerting): make alerting exeuction async but flow sync

* tech(alerting): remove commented code

* tech(alerting): remove unused code

* tech(alerting): fix typo

* tech(alerting): implement Context on EvalContext

* tech(alerting): wait for all alerts to return

* feat(alerting): dont allow alert responses to cancel

* Revert "feat(alerting): dont allow alert responses to cancel"

This reverts commit 324b006c96.

* feat(alerting): give alerts some time to finish before closing down
2016-10-03 09:38:03 +02:00
bergquist 6b7015799c Merge branch 'cloudwatch_interval' of https://github.com/mtanda/grafana into mtanda-cloudwatch_interval 2016-10-03 08:51:33 +02:00
bergquist 36f0bf0e1e chore(web): Improve error message for invalid SSL configuration 2016-10-03 08:47:36 +02:00
Leandro Piccilli 0000065053 Merge branch 'master' of https://github.com/grafana/grafana 2016-10-02 16:59:25 +02:00
Torkel Ödegaard 4a116ad4ad fix(build): fixed failing unit test 2016-10-01 17:36:56 +02:00
Torkel Ödegaard 4ec2377e09 fix(notifications): added form validation and restored Send Test button which was always hidden, #6159 2016-10-01 17:14:45 +02:00
Torkel Ödegaard c6cf6d4655 fix(api): fixed issue with api content-type in api success messages, fixes #6160 2016-10-01 16:52:52 +02:00
HeroCC 72f81b3b2a Make Slack Logo link to Slack (#6165) 2016-10-01 16:50:56 +02:00
miao 1f5a68aab1 Modify basic introductions of docs and make it exact (#6166) 2016-10-01 16:50:09 +02:00
Torkel Ödegaard a6918617ff feat(api): fixed minor issue with error message when trying to create duplicate datasource, fixes #6164 2016-10-01 16:41:27 +02:00
Torkel Ödegaard 4f2263552c feat(alerting): updated look for alerting panel, #6136 2016-10-01 16:32:13 +02:00
bergquist 91b180168e tech(notifications): remove unused filter markup 2016-10-01 15:51:08 +02:00
Torkel Ödegaard aa78114440 fix(alerting): fixed icon for ok state in panel header, #6136 2016-09-30 17:39:05 +02:00
Torkel Ödegaard 7c339f0794 feat(alerting): show alertin state in panel header, closes #6136 2016-09-30 17:37:47 +02:00
bergquist 1226beba31 feat(opentsdb): add alerting support to plugin.json 2016-09-30 16:50:50 +02:00
Torkel Ödegaard 2c4524bbfd fix(logging): minor logging fix 2016-09-30 13:25:54 +02:00
Torkel Ödegaard 2908c6a80b fix(metricsegment): added min width for inputs for metric segment and value select components 2016-09-30 13:13:28 +02:00
Torkel Ödegaard fe4a0a98c1 fix(alerting): added confirm modal in UI, when deleting alert 2016-09-30 13:00:16 +02:00
Torkel Ödegaard 24a25453f6 fix(server): shutdown logging fixes 2016-09-30 10:18:19 +02:00
Torkel Ödegaard 5ec86a9ef4 fix(build): fixed broken build, unreachable code in migrator.go 2016-09-30 09:23:26 +02:00
Torkel Ödegaard 86b546c21d refactor(main): refactoring main grafana server / startup code 2016-09-30 08:36:20 +02:00
Torkel Ödegaard 2b8177e3e5 fix(migration): fix for sqlstore migration, the execution of the migration and recording of the success of it was not done in same transaction, fixes #5315 2016-09-30 07:49:40 +02:00
Torkel Ödegaard 0ab2113fab docs(config): added missing smtp config section, fixes #6155 2016-09-30 07:40:58 +02:00
bergquist b66d94343e tech(tsdb): add basic skeleton for alerting 2016-09-30 07:35:48 +02:00
Torkel Ödegaard 50d146e82c fix(docs): fixed influxdb docs and mention of InfluxDB version, #6027 2016-09-29 14:53:50 +02:00
Torkel Ödegaard 5a1a80bcdd feat(templating): adding missing label property to query variable defaults, fixes #6150 2016-09-29 14:46:59 +02:00
bergquist 1a062c52fa fix(notifications): handle none configured image uploader
ref #6152
2016-09-29 14:31:19 +02:00
Torkel Ödegaard 88ec307f3e fix(graph panel): fixed issue with graph axis labels 2016-09-28 21:39:51 +02:00
Alexander Zobnin c2856926aa fix(graph): fix X axis value selection. (#6145) 2016-09-28 21:29:51 +02:00
Torkel Ödegaard 75311e0626 feat(alerting): removed old init package 2016-09-28 21:27:24 +02:00
Torkel Ödegaard 5f5bbfbda5 Merge branch 'master' of github.com:grafana/grafana 2016-09-28 21:12:37 +02:00
Torkel Ödegaard 80eb82420e fix(cleanup): check if images dir exists 2016-09-28 21:12:25 +02:00
Torkel Ödegaard c28d004731 Merge branch 'go_routines' 2016-09-28 21:06:07 +02:00
Torkel Ödegaard 71e2c6f6ef refactor(backend): refactoring management of go routines in backend 2016-09-28 21:06:00 +02:00
Dan Cech 6d7061dcaf fix typo in config loader 2016-09-28 13:10:31 -04:00
Torkel Ödegaard 2750c8a801 feat(config): changed name of allow_user_login_pass to disable_login_form, changed the section of the config option to [auth], impacts merged PR #5423 2016-09-28 15:27:08 +02:00
Torkel Ödegaard 3e657357e5 Merge branch 'gnet-oauth' 2016-09-28 15:11:03 +02:00
Torkel Ödegaard e5fc4332cd feat(oauth): refactoring PR #6077 2016-09-28 15:10:50 +02:00
bergquist bc634f20d5 Merge branch 'master' into go_routines 2016-09-28 13:58:14 +02:00
bergquist 7a6501640f tech(log): fixes extra param logging 2016-09-28 13:57:19 +02:00
bergquist 991539e410 style(go_routines): improve variable naming 2016-09-28 13:35:24 +02:00
Torkel Ödegaard 5ccdbf01fd merge with master 2016-09-28 13:02:15 +02:00
Torkel Ödegaard 10e63e5dd2 Merge branch 'master' of github.com:grafana/grafana 2016-09-28 12:17:16 +02:00
Torkel Ödegaard 15299c2ac0 fix(govendor): added new null package 2016-09-28 12:15:47 +02:00
Torkel Ödegaard 599fe49944 fix(templating): fix to datasource variable, was not updated on dashboard load, added unit test for case as well 2016-09-28 12:12:38 +02:00
Mitsuhiro Tanda 593863fb9e (prometheus) check time range (#6137) 2016-09-28 11:54:25 +02:00
Torkel Ödegaard 68370ba2bc feat(testdata): added alert dashboard 2016-09-28 10:44:21 +02:00
Torkel Ödegaard a4648607bb feat(testdata): added csv test data scenario 2016-09-28 10:37:30 +02:00
Torkel Ödegaard 8d5857661e refactor(tsdb): changed tsdb time series model to use null.Float instead of pointers 2016-09-28 09:15:48 +02:00
Torkel Ödegaard 63caedb094 Merge branch 'master' of github.com:grafana/grafana 2016-09-28 08:09:51 +02:00
Torkel Ödegaard 460160cfa4 feat(testdata): added test case for ms resolution data 2016-09-28 08:08:46 +02:00
Torkel Ödegaard 22e8885690 feat(testdata): progress on test data stuff 2016-09-27 18:36:00 +02:00
Torkel Ödegaard 3ecd96e682 feat(testdata): lots of work on new test data data source and scenarios 2016-09-27 18:17:39 +02:00
bergquist 34b31aeef8 tech(goroutines): sync state between different go routines 2016-09-27 16:47:17 +02:00
bergquist 8e89173095 tech(log): fixes extra param logging 2016-09-27 16:06:06 +02:00
Torkel Ödegaard ade8aa5b92 feat(graph): refactorings 2016-09-27 14:47:04 +02:00
Torkel Ödegaard 34f15d92d0 feat(testdata): worked on testdata app 2016-09-27 14:39:51 +02:00
bergquist 262e7193a3 feat(alerting): keep proccessing results even if one response panics 2016-09-27 11:16:55 +02:00
bergquist 071f2205e1 tech(tsdb): ops <o> 2016-09-27 11:13:13 +02:00
bergquist 46d4f817e3 tech(graphite): return error if statuscode is not ok 2016-09-27 10:09:56 +02:00
Torkel Ödegaard 81cb4a740b refactor(graph): progress on graph panel work 2016-09-26 17:25:29 +02:00
bergquist 6a699d13c4 docs(configuration): add note about snapshot configuration 2016-09-26 14:46:03 +02:00
bergquist 7585e9a930 docs(changelog): add note about closing #4087 and #2172 2016-09-26 14:41:13 +02:00
bergquist dbb7852f21 feat: purge old files and snapshots
closes #4087
closes #2172
2016-09-26 14:33:40 +02:00
Torkel Ödegaard 40e6317b7b feat(graph): refactoring 2016-09-26 14:04:13 +02:00
Torkel Ödegaard acfde82c0a refactor(graph): js -> typescript refactoring 2016-09-26 13:55:42 +02:00
bergquist 1a32ab64b6 tech(renderer): improve renderOpts names 2016-09-26 11:07:36 +02:00
bergquist effd2098ee feat(alerting): fixes broken image renderer 2016-09-26 10:51:45 +02:00
bergquist 887e236bce fix(rule): fixes rule reading bug 2016-09-26 10:01:33 +02:00
bergquist 8cd9225eb6 feat(alerting): increase timeout to 15s 2016-09-26 08:45:55 +02:00
Torkel Ödegaard 5682520603 feat(graph): more work on graph panel and support for non time series 2016-09-24 13:08:58 +02:00
Torkel Ödegaard cd270f14a2 feat(graph): more work on graph panel and support for non time series 2016-09-23 17:12:10 +02:00
Dan Cech 501e67a657 use semver when comparing grafana and plugin versions (#6108) 2016-09-23 14:38:59 +02:00
Torkel Ödegaard 3bbc940b88 Merge branch 'master' into graph-panel-non-timeseries 2016-09-23 14:22:44 +02:00
Torkel Ödegaard 9a94072c1d Merge branch 'master' of github.com:grafana/grafana 2016-09-23 12:30:20 +02:00
Torkel Ödegaard 175c651e65 fix(server side rendering): Fixed issues with server side rendering for alerting & for auth proxy scenarios, fixes #6115, fixes #5906 2016-09-23 12:29:53 +02:00
bergquist 99c77e7df8 tech(plugins): increase timeout 2016-09-23 09:56:42 +02:00
bergquist e5c64732f1 fix(sql): Add boolstr to all dialects
closes #6116
2016-09-23 09:36:15 +02:00
bergquist 521b5cf014 tech(build): make sure build.go setup works fine
ref #6113
2016-09-23 06:51:37 +02:00
Carl Bergquist 696a5f6a80 Merge pull request #6113 from replay/fix_context_dependency
Fix context dependency
2016-09-23 06:43:32 +02:00
Carl Bergquist 66fe886755 Merge pull request #6112 from replay/fix_typo
fix typo
2016-09-23 06:42:59 +02:00
Mauro Stettler f7dfcb4401 Merge branch 'master' of github.com:grafana/grafana into fix_context_dependency 2016-09-22 21:13:53 +01:00
Mauro Stettler cb0f19f8d4 fix context dependency 2016-09-22 21:13:08 +01:00
Carl Bergquist 7bfef0ced8 Merge pull request #6111 from grafana/pluginreadme
allow non-admin users to view plugin readme
2016-09-22 21:12:44 +01:00
Torkel Ödegaard bb77caa369 Merge branch 'master' of github.com:grafana/grafana 2016-09-22 21:49:57 +02:00
Torkel Ödegaard e36cdac594 fix(templating): fixed issue with templating when initalizing variables without any existing value 2016-09-22 21:49:41 +02:00
Mauro Stettler b063cf0a6e fix typo 2016-09-22 20:44:57 +01:00
Carl Bergquist d6a0ec85c4 Merge pull request #6111 from grafana/pluginreadme
allow non-admin users to view plugin readme
2016-09-22 19:51:47 +02:00
Dan Cech 2c3dd84ebb allow non-admin users to view plugin readme 2016-09-22 13:46:11 -04:00
bergquist 5817948341 Merge branch 'alert_prometheus' 2016-09-22 19:27:35 +02:00
bergquist d711c0ed35 Merge branch 'master' into alert_prometheus 2016-09-22 19:27:24 +02:00
bergquist a49c21df3a fix(png-renderer): increase timeouts 2016-09-22 19:24:18 +02:00
Torkel Ödegaard f2f3115749 feat(graph panel): more progress on graph panel and non time series data support 2016-09-22 16:47:37 +02:00
Torkel Ödegaard 6cd4db12c7 feat(graph panel): refactoring axes tab options into it's own component 2016-09-22 16:19:44 +02:00
bergquist 76b8cff445 fix(gnet): remove trailing , 2016-09-22 16:17:22 +02:00
Torkel Ödegaard 23246605b0 feat(graph panel): working on adding non time series support to graph panel 2016-09-22 16:05:20 +02:00
Torkel Ödegaard f3d4a97f49 Merge branch 'master' into graph-panel-non-timeseries 2016-09-22 14:03:06 +02:00
Torkel Ödegaard 0fc7405b95 fix(elasticsearch): for query template variable when looking up terms without query, no longer relies on elasticsearch default field, fixes #3887 2016-09-22 12:05:03 +02:00
Torkel Ödegaard f79600b352 fix(internal metrics): removed local dev code 2016-09-22 11:54:47 +02:00
Torkel Ödegaard e336fb3d60 fix(smtp mailer): added timeout of 10 seconds to smpt mailer, fixes #2989 2016-09-22 11:51:39 +02:00
Torkel Ödegaard 936146768f fix(snapshots): fixed issue with viewing embedded/solo/png panel from snapshot without login, fixes #3769 2016-09-22 11:46:58 +02:00
Torkel Ödegaard 3ed7ab93c5 added small info text to plugins list page, #5176 2016-09-22 11:32:27 +02:00
Torkel Ödegaard 6574dfacfb feat(internal metrics): added some total stats to metrics reporting, closes #5865 2016-09-22 11:16:19 +02:00
Torkel Ödegaard 8c05a125dc fix(build): updated build.go setup 2016-09-22 10:33:43 +02:00
Torkel Ödegaard d8df421b43 fix(build): fixed issues with optimized build, fixes #6096 2016-09-22 10:22:16 +02:00
Torkel Ödegaard 39af588a94 fix(playlist): fixed sorting issue with playlist playback, fixes #5467 2016-09-22 10:06:03 +02:00
Torkel Ödegaard 598ac0e815 docs(http api): Clarified issue with admin http api docs, fixes #5834# 2016-09-22 09:09:12 +02:00
Torkel Ödegaard 2752dbd13a feat(templating): minor fixes to recent refactorings 2016-09-22 09:00:15 +02:00
Torkel Ödegaard 6257ae094c feat(sqlstore): added index for dashboard_id in dashboard_tag table, fixes #5868 2016-09-21 21:32:51 +02:00
Torkel Ödegaard d65fbcbb42 fix(graphite): fixed minor graphite lexer issue when nodes begin with octal syntax and end with dash identifier, fixes #6049# 2016-09-21 20:04:09 +02:00
Dan Cech 248ed2672f remove 'Github' from oauth login error messages 2016-09-21 09:42:06 -04:00
Dan Cech b387c1291d Merge branch 'master' into gnet-oauth
Conflicts:
	pkg/api/login_oauth.go
2016-09-21 09:39:35 -04:00
Torkel Ödegaard 9e26a4cfcb fix(templating): fixed unique filter after regex pass, fixes #6086 2016-09-21 15:30:11 +02:00
Torkel Ödegaard b4111d78e1 fix(security): fixed login issue that was a potential for social engineering, fixes #6014 2016-09-21 15:03:14 +02:00
Torkel Ödegaard 4a1693196c fix(mixed datasource): fixed issue when exporting dashboard using mixed data source, fixes #6032 2016-09-21 14:57:19 +02:00
Torkel Ödegaard 46ab09ed60 feat(links): fixed styling for dashboard links 2016-09-21 14:20:59 +02:00
bergquist b856d7e193 fix(prometheus): remove timerange from context 2016-09-21 13:55:42 +02:00
bergquist ae7345b04d style(prometheus): remove commented test 2016-09-21 13:46:26 +02:00
bergquist c084145cba refactor(prometheus): add timerange to alert context 2016-09-21 13:46:10 +02:00
Torkel Ödegaard dc3b614749 fix(submenu): fixed issue with submenu and annotation display, and annotation issue in table panel 2016-09-21 13:45:26 +02:00
bergquist af551b8825 refactor(tsdb): remove toUnix from timerange 2016-09-21 13:41:25 +02:00
bergquist 9534a04d3d fix(prometheus): only accept matrix result 2016-09-21 13:30:41 +02:00
bergquist ee0f1a0f36 feat(prometheus): handle more errors 2016-09-21 13:17:36 +02:00
Torkel Ödegaard d0b75cdb66 fix(templating): fixed issue with regex in query variable introduced by yesterdays big merged refactoring of template variable system 2016-09-21 11:38:59 +02:00
bergquist 3e73be8d2e feat(prometheus): improve error handling 2016-09-21 11:31:56 +02:00
Torkel Ödegaard 8b90eedb35 feat(table): table options tab form layout changes 2016-09-21 11:23:39 +02:00
bergquist 4c88db3e43 feat(prometheus): add support for legend formatting 2016-09-21 11:17:29 +02:00
Torkel Ödegaard 7c10af012e feat(singlestat): slight layout changes to options tab 2016-09-21 10:56:17 +02:00
Torkel Ödegaard 7b7ba46f12 fix(styleguide): fixed theme switching in style guide 2016-09-21 09:10:25 +02:00
Torkel Ödegaard 4f892ab9bf Merge branch 'master' of github.com:grafana/grafana 2016-09-21 09:03:57 +02:00
Torkel Ödegaard a01836e86d feat(adhoc filters): basic implementation for ad hoc filters for elasticsearch, #6038 2016-09-21 08:48:49 +02:00
Alexander Zobnin 392976981c fix(table panel): update Table Panel options tab styles. (#6087) 2016-09-21 07:40:12 +02:00
bergquist 43d8bd5a25 feat(prometheus): initial support for prometheus 2016-09-21 07:01:53 +02:00
Dan Cech 630a8ed8aa support setting default org role when adding user via grafana.net auth 2016-09-20 12:36:36 -04:00
Torkel Ödegaard 1b02632de8 fix(jslint): fixed lint issue 2016-09-20 17:36:20 +02:00
Dan Cech da95a23080 remove 'Github' from oauth login error messages 2016-09-20 11:36:13 -04:00
Torkel Ödegaard 0906312046 Merge branch 'adhoc-filters' 2016-09-20 17:34:57 +02:00
Torkel Ödegaard 15423e6e51 feat(adhoc filters): initial base mvp for adhoc filters are donecloses #6038 2016-09-20 17:34:38 +02:00
Torkel Ödegaard dfe0f91105 feat(adhoc): adhoc filters progress 2016-09-20 16:29:48 +02:00
Dan Cech dcd96c90e2 add grafana.net auth section to defaults.ini, normalize section heading line lengths 2016-09-20 10:09:20 -04:00
Alexander Zobnin 159a8bf734 fix(singlestat): update singlestat options tab styles. (#6084) 2016-09-20 15:29:10 +02:00
Torkel Ödegaard 6e429b8575 feat(adhoc filters): good progress on ad hoc filters and sync from to url, #6038 2016-09-20 11:57:43 +02:00
Alexander Zobnin 20f7eee8cc fix(graph): increase Y min and max range when series values are the same, (#6082)
fixes #6070, #6050.
2016-09-20 11:38:18 +02:00
Alexander Zobnin e926b01185 Bug fixes for flexible Y-Min and Y-Max settings (#6066)
* fix(flexible_y-min/max): fixed negative values support and added tests for this.

* fix(flexible_y-min/max): fixed issue with Y-Min and Y-Max values stored as numbers.
	Issue: panels with configured Y-Min and Y-Max don't display anything
		   after upgrade.
2016-09-20 11:23:31 +02:00
bergquist d2fb660557 fix(cli): remove unused logging 2016-09-20 10:10:27 +02:00
Carl Bergquist 630adfaf2b Merge pull request #6068 from fg2it/cross
Cross build support
2016-09-20 10:03:06 +02:00
bergquist ec452dd704 docs(conf): remove internal options since its not working atm 2016-09-20 08:18:15 +02:00
bergquist 21fcb2c643 Merge branch 'mtanda-cloudwatch_expand_template' 2016-09-20 08:14:01 +02:00
bergquist 46866add7e docs(changelog): add note about closing #5003 2016-09-20 08:13:53 +02:00
Mitsuhiro Tanda 71b5007ec7 refactor 2016-09-20 11:04:23 +09:00
Mitsuhiro Tanda 07cce5f6bd refactor 2016-09-20 11:04:23 +09:00
Mitsuhiro Tanda 481cc01242 (cloudwatch) add test for expand templater variables 2016-09-20 11:04:23 +09:00
Mitsuhiro Tanda 540436e9d5 inject templateSrv 2016-09-20 11:04:23 +09:00
Mitsuhiro Tanda 490141da82 (cloudwatch) expand multi select template variable 2016-09-20 11:03:35 +09:00
Dan Cech f5e2d61aef Merge branch 'master' into gnet-oauth 2016-09-19 16:48:40 -04:00
Dan Cech fc17ed351c support logging in with grafana.net credentials 2016-09-19 16:48:07 -04:00
Leandro Piccilli 128de86d49 Merge branch 'master' of github.com:grafana/grafana 2016-09-19 20:12:02 +02:00
Torkel Ödegaard cb522d58cd feat(templating): back to be able to continue work on ad hoc filters, #6048 2016-09-19 18:41:42 +02:00
Torkel Ödegaard 7a6fb70026 feat(templating): progress on variable system refactoring, #6048 2016-09-19 18:32:09 +02:00
Torkel Ödegaard 9d6ecc6361 feat(templating): progress on variable system refactoring, #6048 2016-09-19 18:06:36 +02:00
Steven Arnott 6e4ed4debd Altered DB for Prefix (#6062) 2016-09-19 17:12:43 +02:00
Torkel Ödegaard 945b5ee3cf feat(templating): progress on variable system refactoring, #6048 2016-09-19 17:03:36 +02:00
bergquist 87be56a4f0 fix: add goconvey to vendor 2016-09-19 16:22:39 +02:00
bergquist 3f00834f25 tech: remove unused dependencies 2016-09-19 15:21:53 +02:00
Torkel Ödegaard 8a796c5b4b feat(templating): progress on variable system refactoring, #6048 2016-09-19 15:15:15 +02:00
Torkel Ödegaard 5ded88fa4d feat(templating): progress on variable system refactoring, #6048 2016-09-19 11:34:08 +02:00
bergquist 1cb45c3416 fix(alertlist): better description 2016-09-19 10:11:33 +02:00
Torkel Ödegaard 524f505664 tech(templating): refactoring, updated dashboardSrv to typescript 2016-09-19 10:08:05 +02:00
bergquist 0bde2ae689 fix(alertlist): remove timerange checkbox option 2016-09-19 10:07:53 +02:00
fg2it 0984edd8b2 avoid copy of go dep. from vendor/ for release 2016-09-19 08:03:35 +02:00
fg2it 699c515369 enforce unconditional copy 2016-09-18 11:45:46 +00:00
fg2it c669de1169 add options to support cross build 2016-09-18 10:07:12 +00:00
fg2it 62a2f80f10 add option for grunt release 2016-09-18 09:13:00 +00:00
fg2it 174ea11b1c avoid copy of go dep. from vendor/ for release 2016-09-18 09:03:47 +00:00
Torkel Ödegaard 5ce3e40cc9 feat(templating): more work on new variable handling code, #6048 2016-09-17 15:27:53 +02:00
Torkel Ödegaard 4188c46f83 feat(templating): more work on new variable handling code, #6048 2016-09-17 11:28:45 +02:00
Torkel Ödegaard 46ebae7304 feat(templating): progress on template system rewrite #6048 2016-09-16 16:50:30 +02:00
bergquist 05d43999dc feat(alertlist): add support for time range lockdown
closes #5981
2016-09-16 15:55:38 +02:00
bergquist 77783c02cd fix(alerting): dont log null series
closes #6025
2016-09-16 14:59:54 +02:00
Torkel Ödegaard 7e8b279895 feat(templating): good progress on new variable update code, #6048 2016-09-16 10:48:03 +02:00
Torkel Ödegaard 852fd66c4c Update debian.md 2016-09-16 10:42:15 +02:00
Alexander Zobnin 4fa22e2158 Refactor: flexible Y-Min and Y-Max settings (#6051)
* Feature: Flexible Y-Min and Y-Max settings.

Y-Min and Y-Max is now string.
New usage for both Y-Min and Y-Max (Where X is a real number):
  >X Y-Max/Y-Max is auto if data is above X else X
  <X Y-Max/Y-Min is auto if data is below X else X
  =X Y-Max/Y-Min is scaled to current value +/- X
  ~X Y-Max/Y-Min is caled to average value +/- X

Example: Y-Min: <100 Y-Max: >200
If all points are within 100 and 200: Y-Min is 100 and Y-Max is 200
If some points are above 200: Y-Min is 100 and Y-Max is auto
If some points are below 100: Y-Min is auto and Y-Max is 200
if some points are below 100 and above 200: Y-Min and Y-Max is auto

Tests for new settings added

* Use parseFloat instead of implicit conversion

* feat(flexible_y-min/max): refactor.

* feat(flexible_y-min/max): added more tests.
2016-09-15 21:03:54 +02:00
bergquist a95808a7c3 docs(build): update required go version to 1.7 2016-09-15 16:29:25 +02:00
cmartin0077 f91f74be04 fix(influxdb) autocomplete measurement while typing, fixes #4278 (#5931) 2016-09-15 16:11:38 +02:00
bergquist 3c92f78ee7 feat(cli): add grafana version header to all request against grafana.net 2016-09-15 16:01:06 +02:00
Torkel Ödegaard 0f4a9f1ed1 feat(templating): began refactoring variables into rich behavioral classes 2016-09-15 14:53:36 +02:00
bergquist 3c966caa23 feat(cli): download all plugin dependencies 2016-09-15 14:38:11 +02:00
bergquist fc67ab1dce tech(build): add build grafana-server and cli to CI 2016-09-15 13:52:41 +02:00
bergquist dd70c535ed tech(build): upgrade ci build to 1.7.1 2016-09-15 13:43:37 +02:00
bergquist dede58915d Merge branch 'go_vendor' 2016-09-15 13:25:50 +02:00
bergquist 6be48269e2 tech(build): update build docs 2016-09-15 13:09:33 +02:00
bergquist d3a5d5c058 tech(build): update makefile 2016-09-15 13:02:16 +02:00
bergquist bda1f6493c tech(scripts): move benchmark script into /scripts 2016-09-15 13:00:26 +02:00
bergquist 283172e78c tech(build): remove unused file 2016-09-15 12:59:25 +02:00
bergquist 6489571179 move circle trigger to /scripts 2016-09-15 12:57:41 +02:00
bergquist 4afd7a5ef1 tech(build): update circle ci to build using vendor folder 2016-09-15 11:32:32 +02:00
Zihao Yu 6d843e3db5 update github oauth docs (#6042) 2016-09-15 11:29:03 +02:00
Torkel Ödegaard 94e5001c0e feat(templating): making progress on adhoc template variable, #6038 2016-09-15 09:18:28 +02:00
Alexander Zobnin 3be84b00d5 ES nested fields autocomplete (#6043)
* Re-create PR #4527 from @arcolife:
fixes #4526 - add nested support to fieldname autocomplete; Also:
    - update _mapping to first use given time range
      for deducting index mapping, then fallback to
      today's date based index name

* (elasticsearch): refactor getFields() method.

* (elasticsearch): add tests for getFields() method.

* (elasticsearch): fixed _get() method (tests was broken after @arcolife commit).
2016-09-15 07:30:08 +02:00
Torkel Ödegaard 83b9db51e3 feat(templating): great progress on adhoc filters, #6038 2016-09-14 17:36:28 +02:00
bergquist 6253476c73 tech(build): move dependencies to vendor folder 2016-09-14 16:14:27 +02:00
bergquist 4e567b5f02 feat(alert): order alerts by name.. instead of nothing. 2016-09-14 14:51:31 +02:00
bergquist a23b7f1371 fix(alerting): add missing evaldata field to set state command 2016-09-14 14:35:05 +02:00
bergquist 31892ed73c style(alertlist): remove unused code 2016-09-14 14:21:56 +02:00
bergquist 9dd8b3b408 wip 2016-09-14 14:12:19 +02:00
Torkel Ödegaard 0a44add6c9 feat(adhoc fiters): began work on ad-hoc filters, refactored submenu filters to use gf-form styles, #6038 2016-09-14 11:21:02 +02:00
bergquist d0f9623037 feat(alertlistpanel): support state filter
ref #5981
2016-09-14 10:49:05 +02:00
bergquist b49a642ca5 feat(alerting): extract method for join eval matches 2016-09-14 10:49:05 +02:00
bergquist d02f29fb02 feat(alertlist): basic alert list panel
ref #5981
2016-09-14 10:49:05 +02:00
Torkel Ödegaard babab7677c tech(lib upgrade): fixed issue with angular 1.5.8, so can revert revert of upgrade, that is we are no on latest angularjs, #6022 2016-09-14 10:45:56 +02:00
Torkel Ödegaard c594f9f2ad fix(lodash): corrected checked in lodash version 2016-09-14 10:13:33 +02:00
Torkel Ödegaard 649d9f9177 tech(lodash): upraded lodash to 4.15.0, closes #6021 2016-09-14 09:17:10 +02:00
Torkel Ödegaard 0fa0066cd9 tech(lodash): began migration work 2016-09-13 22:10:44 +02:00
Torkel Ödegaard 2146e69a11 revert angularjs upgrade 2016-09-13 21:26:28 +02:00
Torkel Ödegaard fffa26b876 tech(lib upgrade): updated jquery to 3.1, fixes #6034 2016-09-13 20:42:28 +02:00
Torkel Ödegaard 25139c77b9 tech(update angularjs): updated angularjs to 1.5.9 2016-09-13 20:33:49 +02:00
Torkel Ödegaard f5809c0209 fix(build): trying to fix build 2016-09-13 20:14:18 +02:00
Torkel Ödegaard 9cd517780f Merge branch 'master' of github.com:grafana/grafana 2016-09-13 16:25:48 +02:00
Torkel Ödegaard 8c30babdf1 feat(alerting): fixed build issues 2016-09-13 16:24:00 +02:00
Torkel Ödegaard 3af891d023 feat(alerting): restored alert history 2016-09-13 16:13:41 +02:00
Torkel Ödegaard b0c7e61ef8 feat(alerting): removed severity 2016-09-13 15:09:55 +02:00
wvl a73424d6af Secure Elasticsearch datasources a bit (#6031)
Instead of allowing users to access the
entire cluster, apply some sane restrictions.

Change-Id: Ib2e93722bf2e39d700d4afa713ff49ec556f2fdf
2016-09-13 15:04:21 +02:00
bergquist 6a723dff37 feat(notifications): set default value to false for new notifications 2016-09-13 14:25:48 +02:00
Torkel Ödegaard 6375418d8c Merge branch 'alerting' into grafana-annotations 2016-09-13 09:38:12 +02:00
Mitsuhiro Tanda 1264a1b3a6 (cloudwatch) add metrics/dimensions (#6020) 2016-09-13 09:08:33 +02:00
Jouni Kuusisto e53b815956 Enable "With Credentials" for InfluxDB datasource (#6018) 2016-09-13 08:57:39 +02:00
Carl Bergquist 52dc2db769 Merge pull request #6008 from rubycut/patch-1
Increase datasource limit to 1000 #3910
2016-09-13 08:38:07 +02:00
bergquist 3ba3d9d445 docs(changelog): add note about closing #2839 2016-09-13 08:14:43 +02:00
bergquist f7abf01efb Merge branch 'mtanda-template_sort' 2016-09-13 08:12:23 +02:00
bergquist 03fb152d4b tech(templates): extract sort method 2016-09-13 08:11:04 +02:00
bergquist 9c5436c648 feat(templating): set default sort order 2016-09-13 07:39:30 +02:00
bergquist e348822190 Merge branch 'template_sort' of https://github.com/mtanda/grafana into mtanda-template_sort 2016-09-13 07:16:34 +02:00
Carl Bergquist 1c7b76cb43 Merge pull request #6013 from mtanda/cloudwatch_kinesis_analytics
(cloudwatch) add metrics/dimensions
2016-09-12 17:03:25 +02:00
Mitsuhiro Tanda f998b86ade (cloudwatch) add metrics/dimensions 2016-09-12 23:47:31 +09:00
bergquist 157ab1ba36 fix(setting): broken code 2016-09-12 14:57:37 +02:00
bergquist 811b7188c4 docs(config): add docs for how to run grafana behind a reverse proxy 2016-09-12 14:47:21 +02:00
bergquist d7bf70a77b tech(tsdb): remove skip ssl setting. should be based on datasource settings 2016-09-12 13:37:00 +02:00
bergquist 6c5860d3e8 feat(metrics): measure proxy requests 2016-09-12 13:29:31 +02:00
Rubycut 501f89e829 Increase datasource limit to 1000 #3910 2016-09-12 10:45:17 +02:00
bergquist eb673fd16d fix(middleware): typo 2016-09-12 10:11:55 +02:00
Torkel Ödegaard 014b70ded9 fix(graph): fixed showing rendering error in inspector, fixes #5995 2016-09-10 12:00:33 +02:00
Torkel Ödegaard 7aab4a4a59 fix(table): fixed issue with using mixed data source in table panel, fixes #5999 2016-09-10 09:57:25 +02:00
Chen Chenglong 7b1c374f64 support connect ldap server with starttls (#5969)
* support connect ldap server with starttls

* add more doc for start_tls option
2016-09-10 09:40:56 +02:00
bergquist 4edb31723c fix(metrics): ignore datasource proxy requests 2016-09-09 13:53:50 +02:00
bergquist e7b56c6389 tech(metrics): move all request counters into one middleware 2016-09-09 13:28:19 +02:00
Torkel Ödegaard 4a2f2fba73 feat(alerting): show panel specific alert annotations, #5694 2016-09-09 11:30:55 +02:00
bergquist 583790e650 fix(alering): the crocdile turned on me > <
closes #5855
2016-09-09 07:42:07 +02:00
Carl Bergquist 51d2534f6a Merge pull request #5994 from mtanda/prometheus_fix_legend_template
(prometheus) fix template variable expansion in legend
2016-09-08 18:37:27 +02:00
Mitsuhiro Tanda 9d09e5bbd0 (prometheus) fix template variable expansion in legend 2016-09-09 00:46:04 +09:00
bergquist aa80b52c07 feat(alerting): make it possible to skip ssl verification for alerting https requests 2016-09-08 16:29:31 +02:00
bergquist 7b9099ef93 fix(query): requires all that all series are empty to set NoDataFound 2016-09-08 14:33:10 +02:00
Torkel Ödegaard 0ac4ece00d feat(annotations): refactoring annotations srv to typescript, #5990 2016-09-08 14:31:30 +02:00
bergquist 9511f89a22 fix(alerting): fixes bug in query conditions 2016-09-08 13:28:41 +02:00
Torkel Ödegaard 23de094a81 feat(alerting/annotations): fixed broken test 2016-09-08 13:22:30 +02:00
bergquist bec099cd84 tech: remove unused files 2016-09-08 11:41:56 +02:00
Torkel Ödegaard b8081b29fd Merge branch 'master' into grafana-annotations 2016-09-08 11:26:55 +02:00
Torkel Ödegaard d60bd77658 feat(annotations): added support to show grafana stored annotations in graphs, #5982 2016-09-08 11:25:45 +02:00
bergquist 3c9432b7e9 fix(metrics): default updateSince to ms 2016-09-08 10:48:11 +02:00
bergquist acf74cdacc fix(alerting): change execution time to ms 2016-09-08 10:45:10 +02:00
bergquist 5f934e0238 feat(emails): move bg color to main table 2016-09-08 09:59:51 +02:00
bergquist 21c5b543fb feat(profile): hide orgs list when it only contains one org 2016-09-08 09:03:29 +02:00
bergquist 592ae5a39a tests(alerting): fixes broken tests. pointers and stuff 🤷 2016-09-07 17:05:41 +02:00
bergquist 30f36fe2c4 docs(changelog): add note about merging #4718 2016-09-07 15:24:38 +02:00
bergquist f56d45ac56 feat(alerting): include default notifications in alert tab 2016-09-07 15:13:24 +02:00
bergquist c769148701 Merge branch 'emails' 2016-09-07 13:52:16 +02:00
bergquist 62372978e4 style: convert tabs to spaces 2016-09-07 13:51:17 +02:00
bergquist 59cb51dc6f test(emails): update fake data model 2016-09-07 13:47:57 +02:00
bergquist 9595916a5f feat: right align value metrics 2016-09-07 13:47:21 +02:00
bergquist 712061ab4f test(alerting): fixes broken unit tests 2016-09-07 11:45:38 +02:00
bergquist 166df66f66 docs(go): update go dep to 1.6 2016-09-07 11:28:22 +02:00
bergquist f26824049f Merge branch 'master' into emails 2016-09-07 11:19:52 +02:00
bergquist 374016b9b5 Merge branch 'kfitzpatrick-custom-github-style-oauth' 2016-09-07 11:07:30 +02:00
bergquist 10b3ee362c docs(oauth): add generic_auth to docs 2016-09-07 11:06:59 +02:00
bergquist 53dddf1a8f fix(oauth): remove github refs from generic auth 2016-09-07 10:55:46 +02:00
bergquist 3b6820ef03 feat(oauth): create struct for generic oauth and add config values 2016-09-07 10:34:56 +02:00
Torkel Ödegaard 0d083bad14 Merge branch 'master' of github.com:grafana/grafana
Conflicts:
	pkg/components/imguploader/s3uploader.go
2016-09-07 10:14:36 +02:00
Torkel Ödegaard 50b41130ca feat(alerting): fixed s3 upload issue, progress on alerting on null/missing data, updated ini package to get the support for line continuations 2016-09-07 10:11:00 +02:00
bergquist d1a7a23c84 test(imageupload): add more specific tests
torkels commit will fix this unit test :)
2016-09-07 10:05:01 +02:00
bergquist 4646723cbb Merge branch 'custom-github-style-oauth' of https://github.com/kfitzpatrick/grafana into kfitzpatrick-custom-github-style-oauth 2016-09-07 08:15:44 +02:00
Torkel Ödegaard fc8f0721cd Merge branch 'master' of github.com:grafana/grafana
Conflicts:
	pkg/services/alerting/eval_context.go
2016-09-06 20:40:49 +02:00
Torkel Ödegaard fbae6abb3c feat(alerting): progress on handling no data in alert query, #5860 2016-09-06 20:40:12 +02:00
bergquist 2e8d5ca519 docs(changelog): add note about updating systemd description 2016-09-06 17:32:18 +02:00
Carl Bergquist a02bef7d94 Merge pull request #5971 from cicku/master
Update systemd unit's description to be more understandable
2016-09-06 17:11:46 +02:00
Christopher Meng 6afb456bef Update systemd unit's description to be more understandable
Signed-off-by: Christopher Meng <i@cicku.me>
2016-09-06 16:29:15 +02:00
bergquist 04690ca920 feat(alerting): add support for retries
ref #5855
2016-09-06 15:09:49 +02:00
bergquist 0d7a871223 style(alerting): remove blank lines 2016-09-06 14:57:15 +02:00
bergquist 22805ce56b fix(alert_tab): fix broken alert history 2016-09-06 14:42:34 +02:00
bergquist 55b560a4a8 feat(alerting): filter notifications based on severity
closes #5851
2016-09-06 14:27:48 +02:00
Torkel Ödegaard b1ed641d73 fix(graph): fixed issue with duplicate metric calls when doing full page reload of graph in edit/view mode 2016-09-06 09:20:34 +02:00
Torkel Ödegaard 6b17cdbca6 feat(alerting): Save As removes alerts from panels, closes #5965 2016-09-06 09:14:11 +02:00
bergquist 2ca7284a56 tech(notifications): splitt into 3 queries
closes #5883
2016-09-06 08:43:15 +02:00
bergquist c893e5d241 feat(notifications): add support for default notifications
ref #5883
2016-09-05 21:35:37 +02:00
bergquist eb0396ad95 chore(tsdb): remove some logging 2016-09-05 21:35:24 +02:00
bergquist 015423b233 tech(gitignore): ignore vscode folder 2016-09-05 21:35:24 +02:00
Carl Bergquist b501590a75 fix(.editorconfig): correct spelling of indent_style
Unleash the fucking fury
2016-09-05 17:38:55 +02:00
bergquist d11bc57c37 feat(notifications): make it possible to send test alert notifications
closes #5847
2016-09-05 14:45:15 +02:00
Torkel Ödegaard 4c5461d4ba feat(alerting): alerting scheduling distribution, only distibutes it on seconds for now, not sub second distribution, #5854 2016-09-05 14:26:08 +02:00
Torkel Ödegaard e2f5bf1666 feat(alerting): fixed confirm delete dashboard issue 2016-09-05 13:38:25 +02:00
Torkel Ödegaard 395213abd7 feat(graph panel): more refactoring of #5917 2016-09-05 11:46:16 +02:00
Torkel Ödegaard 31642b472c refactoring(graph panel): #5917 2016-09-05 11:07:41 +02:00
Torkel Ödegaard 36252602af Merge branch 'master' into graph-panel-non-timeseries 2016-09-05 09:58:07 +02:00
bergquist daea38060f feat(notifications): redirect to notification list after creation. 2016-09-05 08:27:12 +02:00
Carl Bergquist 002cfb09cb Merge pull request #5953 from kobtea/fix/ng-ctrl
fix typo
2016-09-05 07:56:57 +02:00
Carl Bergquist ae2fe11166 Merge pull request #5957 from tdi/master
Changed EBS to ELB
2016-09-05 07:54:03 +02:00
Dariusz Dwornikowski 1b283d052b Changed EBS to ELB 2016-09-02 20:49:28 +02:00
Hiroaki Kobayashi 3645fb371c fix typo 2016-09-02 15:22:04 +09:00
bergquist 1955defc43 fix(api): add missing jsonData field to dto
The field is available on the dto so I guess is should be used.
Otherwise we should remove the field rather then not setting it.

ref #5944
2016-09-01 17:21:13 +02:00
bergquist 86aea89214 style(tsdb): extract some methods 2016-09-01 13:03:15 +02:00
bergquist d73547c0dc feat(tsdb): add missing content type and join url using path 2016-09-01 11:12:35 +02:00
bergquist 3d3365f242 tech(graphite): add more logging 2016-09-01 10:09:13 +02:00
bergquist 94389a3a44 tech(tsdb): improve logging for graphite client 2016-09-01 09:38:43 +02:00
bergquist 29b60329cc stupid stupid stupid me 2016-09-01 09:17:57 +02:00
bergquist 000eb669df tech(build): change min go version to 1.6 2016-09-01 08:13:48 +02:00
bergquist 7ddd625e9d feat(alerting): add slack/email support for execution errors 2016-08-31 15:55:01 +02:00
bergquist 4619a05f43 feat(alerting): save execution error message to annotations 2016-08-31 14:06:54 +02:00
bergquist c624f3d470 fix(alerting): measure state result instead of severity 2016-08-31 11:55:35 +02:00
bergquist e493015f54 fix(alerting): replace one hack with another hack 2016-08-31 10:10:39 +02:00
bergquist 53a9dec407 feat(alerting): move timestamp to new row
ref #5850
2016-08-31 09:48:58 +02:00
bergquist a5d49c9820 docs(config): add note about poodle vulnerabillity in <3.0
closes #3483
2016-08-31 08:34:15 +02:00
Trent White 00f82010f8 tweaked alert example to see if there were any visual changes 2016-08-30 12:11:00 -04:00
Trent White 852a8b77e4 table tweak 2016-08-30 12:04:26 -04:00
bergquist 1a70e69447 mark second td as last 2016-08-30 15:23:59 +02:00
bergquist ae428b9177 docs(changelog): add note about cli fix 2016-08-30 13:49:50 +02:00
bergquist 645293e590 fix(cli): improve error message for upgrade-all
closes #5885
2016-08-30 13:47:42 +02:00
bergquist b55b7cde4b fix(alerting): remove error message when model is valid again
closes #5921
2016-08-30 13:36:13 +02:00
bergquist 11a4ff0f8a feat(alerting): add basic UI for history in alert tab
ref #5850
2016-08-30 13:22:59 +02:00
bergquist 650a87dc05 feat(alerting): add alert history api endpoint
ref #5850
2016-08-30 09:32:56 +02:00
bergquist 1f1d232ea6 tech(githooks): remove symlink bash script 2016-08-30 07:48:15 +02:00
Trent White 90873cfe76 getting tables to behave on mobile 2016-08-29 16:55:19 -04:00
bergquist a2525f77d9 fix(config): comment sample value 2016-08-29 21:14:47 +02:00
bergquist ff9b95f4b3 docs(changelog): adds note about closing #5827 2016-08-29 16:24:23 +02:00
Carl Bergquist 47438ad9b9 Merge pull request #5926 from cmartin0077/5827-add-elapsed-influxdb
feat(influxdb) add elapsed(), fixes #5827
2016-08-29 16:21:59 +02:00
bergquist 9c92d8c4e9 fix(circle-ci): change to ubuntu 14 for CI 2016-08-29 16:12:42 +02:00
chrismartin0077 88ca695361 feat(influxdb) add elapsed(), fixes #5827 2016-08-29 07:05:10 -07:00
Carl Bergquist 7d4cc098a8 Merge pull request #5924 from cmartin0077/master
feat(api) HEAD response, fixes #3854
2016-08-29 15:54:21 +02:00
bergquist c0697b99d6 fix(alerting): adds support for basic auth
closes #5897
2016-08-29 15:50:11 +02:00
chrismartin0077 0050707134 feat(api) HEAD response, fixes #3854 2016-08-29 06:07:44 -07:00
cmartin0077 9c08d7aef5 fix(influxdb) fix tag value autocomplete with upper case values, fixes #5399 (#5919) 2016-08-29 13:03:54 +02:00
Torkel Ödegaard 9d69eaf07b Merge branch 'issue-5812-x-axis' of https://github.com/alexanderzobnin/grafana into graph-panel-non-timeseries 2016-08-27 09:53:10 +02:00
paulroche 5ba6bab237 redact provider_config (#5915) 2016-08-27 09:50:35 +02:00
Trent White ab4f06bc54 redesign email template 2016-08-26 14:25:39 -04:00
Alexander Zobnin 1bdd24ab9e Graph panel: fix merge conflicts introduced by alerting branch, issue #5812. 2016-08-26 21:22:46 +03:00
Alexander Zobnin 7a6d32138b Graph panel: refactor, issue #5812. 2016-08-26 20:47:12 +03:00
Alexander Zobnin 06af566f3f Graph panel: initial elastic raw document format support, issue #5812. 2016-08-25 22:03:42 +03:00
Trent White 35b90afdd0 initial styling 2016-08-24 17:41:29 -04:00
bergquist 5d821d3492 style(cli): minor fix 2016-08-24 20:27:41 +02:00
bergquist c087445d51 feat(cli): add db command to cli. 2016-08-24 15:46:26 +02:00
Alexander Zobnin d23e9fa3c3 Graph panel: table format support improvements, issue #5812. 2016-08-23 20:44:58 +03:00
Carl Bergquist 5b9366a9c3 tech(docker): update prometheus config 2016-08-23 11:50:17 +02:00
bergquist d0ca4ca3cd chore(alerting): remove unused files 2016-08-22 17:01:23 +02:00
bergquist 0cbedb4473 chore(api): remove commented endpoints 2016-08-22 16:56:28 +02:00
bergquist b8ccb82382 Merge branch 'alerting' 2016-08-22 16:10:36 +02:00
bergquist 7095a9d7e1 Merge branch 'master' into alerting 2016-08-22 15:31:33 +02:00
bergquist 3b8bba3e9f feat(alerting): add more fields to webhook 2016-08-22 15:11:27 +02:00
bergquist 1ff21b3ee8 docs(example): remove old properties 2016-08-22 14:55:16 +02:00
bergquist f3d6035c59 feat(alerting): add alerts for notification edits 2016-08-22 14:49:40 +02:00
Carl Bergquist 90388710af Merge pull request #5874 from mtanda/cw_api_gateway
(cloudwatch) add api gateway metrics/dimensions
2016-08-22 14:36:40 +02:00
Carl Bergquist 1c25d22f9e Merge pull request #5875 from mtanda/prometheus_time
(prometheus) refactor time calculation
2016-08-22 14:25:52 +02:00
bergquist 457eb91c2f docs(alerting): example dashboards 2016-08-22 13:30:57 +02:00
bergquist 77f9c24050 feat(alerting): add support for count reducer 2016-08-22 13:25:31 +02:00
bergquist 26c6437846 Merge branch 'master' into alerting 2016-08-22 12:27:08 +02:00
bergquist 69de3bcfc7 chore(example): remove example file and add links 2016-08-22 12:26:26 +02:00
bergquist 5a33679470 fix(alerting): remove has no value condition 2016-08-22 12:20:07 +02:00
Mitsuhiro Tanda d9fe41cc8d (prometheus) refactor time calculation 2016-08-20 22:51:33 +09:00
Mitsuhiro Tanda 6bd2bb04a7 (cloudwatch) add api gateway metrics/dimensions 2016-08-20 21:57:20 +09:00
bergquist 3077f992bb docs(changelog): add note about closing #5613 2016-08-19 15:19:08 +02:00
Carl Bergquist 9fdda0e269 Merge pull request #5613 from ctrochalakis/group_by_nodes
feat(graphite): added groupByNodes func def, closes #5612
2016-08-19 15:16:40 +02:00
bergquist 8d49b66dae Merge branch 'Scalingo-database_url' 2016-08-19 14:53:38 +02:00
bergquist aeb1b99648 docs(changelog): add note about closing #5456 2016-08-19 14:51:09 +02:00
bergquist 92a52ccdf7 docs(conf): add more info about using database.url 2016-08-19 14:48:40 +02:00
bergquist c663e32ea8 Merge branch 'database_url' of https://github.com/Scalingo/grafana into Scalingo-database_url 2016-08-19 13:15:44 +02:00
Alexander Zobnin c683c7a448 Graph panel: initial support for table format, issue #5812. 2016-08-18 21:59:28 +03:00
bergquist e415412691 feat(alerting): add image for howto popup
closes #5784
2016-08-18 18:36:58 +02:00
bergquist d3421c671c fix(alerting): make sure xorm can reset execution_error 2016-08-18 17:25:32 +02:00
bergquist 28ac05b1d1 docs(changelog): add filter for org switcher
closes #2609
2016-08-18 15:52:14 +02:00
bergquist 6d60d125d3 Merge branch 'Othyus-filter_orgs' 2016-08-18 15:48:47 +02:00
bergquist e3bbf96b37 Merge branch 'filter_orgs' of https://github.com/Othyus/grafana into Othyus-filter_orgs 2016-08-18 15:48:01 +02:00
Alexander Zobnin 284a6ee629 Graph panel: rename X axis modes, issue #5812. 2016-08-18 15:34:32 +03:00
bergquist def4632f08 test(alerting): add falsification test 2016-08-18 14:13:39 +02:00
bergquist cbe7f8b697 feat(config): add ascii dragon to sample.ini 2016-08-18 14:13:02 +02:00
bergquist d28df71c3b feat(alerting): add support for "no_value" evaluator 2016-08-18 11:44:25 +02:00
Torkel Ödegaard 09cdf3e9e1 feat(alerting): show execution errors in alert list 2016-08-18 11:37:35 +02:00
Torkel Ödegaard 5cf9711862 feat(alerting): added eval match to test results 2016-08-18 11:22:24 +02:00
Torkel Ödegaard 2f953d75a6 Merge branch 'alerting' of github.com:grafana/grafana into alerting 2016-08-18 10:07:45 +02:00
Torkel Ödegaard 9028d4899f feat(alerting): alert list fixes 2016-08-18 10:07:31 +02:00
bergquist 631acc2bf9 feat(alerting): only show available queries in alert query 2016-08-18 10:02:17 +02:00
Torkel Ödegaard 9b5a7b5ef6 feat(alerting): added alert howto text, closes #5784 2016-08-18 09:58:20 +02:00
Torkel Ödegaard 902314d3a1 Merge branch 'alerting' of github.com:grafana/grafana into alerting 2016-08-18 09:04:00 +02:00
Torkel Ödegaard 75a6c2b612 feat(alerting): added validation that checks valid data source and checks for template variables in graphite query, #5841 2016-08-18 09:03:46 +02:00
beejeebus 998ed097d3 Update aws-sdk from v1.0.0 to v1.4.1, fixes #5763. (#5813) 2016-08-18 08:19:53 +02:00
Roman Vynar d086f5d398 Align step with interval passed to Prometheus query using rate() (#5839) 2016-08-18 08:19:32 +02:00
bergquist 6d080904fa tech(alerting): empty string does not update database 2016-08-17 22:13:27 +02:00
bergquist 4154a4066f feat(alerting): handle all results, even due they have errors
DON'T SWALLOW THE ERR CARL
2016-08-17 22:12:08 +02:00
bergquist 158ce06167 fix(alerting): cleanup alerting example dashboard 2016-08-17 17:21:57 +02:00
Torkel Ödegaard eabba50bbf Merge branch 'alerting' of github.com:grafana/grafana into alerting 2016-08-17 15:49:18 +02:00
Torkel Ödegaard 2e7cb04490 feat(alerting): some final changes to alert list #5784 2016-08-17 15:48:58 +02:00
Torkel Ödegaard 63a283b4bc feat(alerting): working on alert state filters for alert list 2016-08-17 11:00:00 +02:00
bergquist 7d1e5b6374 tech(alerting): remove old crit/warn properties from dashboard 2016-08-17 10:53:24 +02:00
bergquist d8cfe22318 tech(alerting): add example dashboard with many alerts 2016-08-17 10:35:48 +02:00
Torkel Ödegaard da59d6547f Merge branch 'alerting' of github.com:grafana/grafana into alerting 2016-08-17 10:03:57 +02:00
Torkel Ödegaard 05697d5ecd Merge branch 'master' into alerting
Conflicts:
	conf/sample.ini
2016-08-17 10:03:33 +02:00
Torkel Ödegaard 6fae5a3b4e Merge branch 'v3.1.x' 2016-08-17 10:02:08 +02:00
Torkel Ödegaard 093563ac37 fix(metrics): restored prefix default to prod.grafana.. 2016-08-17 10:01:55 +02:00
Torkel Ödegaard f9b628ad0e Merge branch 'v3.1.x'
Conflicts:
	conf/defaults.ini
	conf/sample.ini
	pkg/metrics/graphite.go
	pkg/metrics/graphite_test.go
2016-08-17 09:53:46 +02:00
Torkel Ödegaard 2b2b64865b Merge branch 'master' of github.com:grafana/grafana 2016-08-17 09:42:52 +02:00
Torkel Ödegaard 159ea69e5d fix(OpenTSDB): correct content-type, fixes #4965 2016-08-17 09:42:40 +02:00
bergquist 6497b307c4 feat(alerting): save execution error upon state changed 2016-08-17 09:27:29 +02:00
bergquist 9915f15ed0 feat(alerting): adds sql layer for saving execution errors 2016-08-17 07:49:14 +02:00
Torkel Ödegaard 0951da9c89 Merge branch 'v3.1.x' of github.com:grafana/grafana into v3.1.x 2016-08-16 22:31:51 +02:00
Torkel Ödegaard a5f0f508ea feat(inspector): fixed error handling, showing response body when data proxy returns text/html body 2016-08-16 22:31:26 +02:00
Torkel Ödegaard 434332f02d feat(alerting): changed fontsize in alert list 2016-08-16 21:26:54 +02:00
Alexander Zobnin 93515d0ffc Graph panel: display only bars in histogram mode, issue #5812. 2016-08-16 21:53:53 +03:00
Alexander Zobnin 113173be3d Graph panel: preserve series options (colors and other), issue #5812. 2016-08-16 21:12:35 +03:00
Alexander Zobnin 63886598e9 Graph panel: add value option (min, max, avg, etc), issue #5812. 2016-08-16 19:43:14 +03:00
Alexander Zobnin e39e5f9a9b Graph-panel: Add initial histogram option, issue #5812. 2016-08-16 18:45:57 +03:00
Torkel Ödegaard 15c11fdb54 Merge branch 'alerting' of github.com:grafana/grafana into alerting 2016-08-16 16:51:24 +02:00
Torkel Ödegaard 0b7fa3c19d feat(alerting): minor progress on alert list, #5784 2016-08-16 16:50:36 +02:00
bergquist de714e3398 tech(docker): add default db for postgres 2016-08-16 15:54:13 +02:00
bergquist c7cb93a33a style(alerting): improve codestyle for evaluators 2016-08-16 12:44:31 +02:00
bergquist fb7f2ae2e2 feat(alerting): adds within_range and outside_range evaluators
closes #5829
2016-08-16 12:37:07 +02:00
bergquist b5d92b6191 test(alerting): fix broken tests 2016-08-16 12:37:07 +02:00
Torkel Ödegaard 6b90587d27 feat(alerting): fixing failing go unit test 2016-08-16 10:22:16 +02:00
Torkel Ödegaard 65ce01fbff feat(alerting): fixing failing typescript build 2016-08-16 10:09:07 +02:00
Torkel Ödegaard fe9d591b28 Merge branch 'alerting' of github.com:grafana/grafana into alerting
Conflicts:
	pkg/services/sqlstore/migrations/alert_mig.go
2016-08-16 09:54:06 +02:00
Torkel Ödegaard f934081bcb feat(alerting): making progress on alerting list, #5784 2016-08-16 09:52:45 +02:00
Alexander Zobnin 7588ee974d Working on non time series X-axis feature. 2016-08-15 22:46:34 +03:00
bergquist aaabdbe33b feat(alerting): make post execution fields nullable 2016-08-15 20:26:36 +02:00
bergquist 2c2157f3b0 fix(alerting): rename events to evalMatches 2016-08-15 20:17:32 +02:00
Claudius Zingerli 08932b8ebc InfluxDB data source: Removed 'required' attribute from User/Password (#5820) 2016-08-15 17:56:46 +02:00
Torkel Ödegaard 9f29c54170 Merge branch 'query_part_refactor' into alerting
Conflicts:
	pkg/services/sqlstore/migrations/alert_mig.go
	pkg/services/sqlstore/migrations/heartbeat_mig.go
2016-08-15 17:54:42 +02:00
Torkel Ödegaard d8d951c810 feat(alerting): can now change reducer 2016-08-15 17:53:44 +02:00
Torkel Ödegaard 1418cbbd8b feat(query_part): refactoring query part 2016-08-15 17:20:45 +02:00
Torkel Ödegaard 0392fde34e feat(alerting): doing schema changes 2016-08-15 15:12:43 +02:00
bergquist 3195209878 tech(circle): rearrange build order 2016-08-15 14:01:20 +02:00
Torkel Ödegaard befca9bb2f feat(query parts): refactoring query part component to support actions 2016-08-15 13:51:55 +02:00
bergquist f7a9102523 feat(metrics): improve graphite settings
Fixes the broken support for overriding settings with ENV variables.
closes #5769
2016-08-15 09:59:55 +02:00
bergquist cf6736d480 fix(metrics): add ending dot for graphite prefix 2016-08-15 09:58:32 +02:00
bergquist 41790c6709 fix(metrics): hide none existing metrics settings 2016-08-15 09:58:23 +02:00
bergquist ebecc5e5a0 fix(metrics): make metrics cfg backwards compatible 2016-08-15 09:57:49 +02:00
Torkel Ödegaard 2c1b893c55 feat(metrics): minor fix for internal metrics fix PR #5758 2016-08-15 09:57:23 +02:00
bergquist 0524d0c625 fix(metrics): replaces . with _ in instance name
closes #5739
2016-08-15 09:57:00 +02:00
bergquist 2b2e015d62 feat(cli): add default plugin folder for MAC OS
closes #5806
2016-08-15 09:18:56 +02:00
Torkel Ödegaard cd9bd5be17 Update CHANGELOG.md 2016-08-15 09:15:20 +02:00
bergquist 7ce13ef075 docs(changelog): add note about fixing #5806 2016-08-15 09:13:49 +02:00
bergquist 7a913f77d3 feat(cli): add default plugin folder for MAC OS
closes #5806
2016-08-15 08:54:35 +02:00
bergquist 4d0982a21c Merge branch 'master' into alerting 2016-08-15 07:58:30 +02:00
Torkel Ödegaard 0ea3458f69 Merge branch 'v3.1.x'
Conflicts:
	public/app/features/dashboard/dynamic_dashboard_srv.ts
2016-08-14 14:47:14 +02:00
Torkel Ödegaard 58df60f670 fix(templating): another fix for repeating panels and having old panels/scoped vars stuck after switching repeat variable, fixes #5795 2016-08-14 14:45:49 +02:00
Julian Einwag cbf0e77add fix repeat panels (#5796) 2016-08-14 13:59:16 +02:00
Torkel Ödegaard 1eca0d7c53 docs(): updated docs 2016-08-14 13:58:04 +02:00
Torkel Ödegaard 76e4b7ce3b Merge branch 'master' of github.com:grafana/grafana 2016-08-14 13:51:09 +02:00
Julian Einwag deb245f526 fix repeat panels (#5796) 2016-08-14 13:50:49 +02:00
Mitsuhiro Tanda 7a1011ac39 (cloudwatch) support ApplicationELB (#5802) 2016-08-14 13:21:17 +02:00
Torkel Ödegaard 8499d32d0f Merge branch 'master' of github.com:grafana/grafana 2016-08-14 13:18:55 +02:00
Torkel Ödegaard d894c13718 fix(graph): fixed issue with tooltip introduced in recent commit 2016-08-14 13:18:23 +02:00
Torkel Ödegaard 46ea3ed971 fix(godep): fixed godep dependency 2016-08-13 13:07:55 +02:00
bergquist fb7a6c0764 feat(alerting): list all series in alert email 2016-08-13 12:50:51 +02:00
Carl Bergquist a530df8449 Merge pull request #5809 from kou/patch-1
Update the number of ways
2016-08-13 12:18:01 +02:00
bergquist c4e905474a feat(alerting): improve email notifications layout 2016-08-13 11:24:03 +02:00
Kouhei Sutou 46630df88d Update the number of ways 2016-08-13 14:12:29 +09:00
Torkel Ödegaard 74dbd7fb36 feat(alerting): disable visual thresholds while alert is enabled 2016-08-12 13:19:06 +02:00
Torkel Ödegaard 7242dc2ebe feat(thresholds): hide threshold handles when second y axis is shown 2016-08-12 10:50:31 +02:00
Torkel Ödegaard 597103a1f2 Merge branch 'alerting' of github.com:grafana/grafana into alerting 2016-08-12 10:32:58 +02:00
Torkel Ödegaard 06210a4a22 feat(thresholds): refactoring and adding many unit tests 2016-08-12 10:32:46 +02:00
bergquist 1dcae464fe chore(notifications): remove commented test 2016-08-12 10:17:21 +02:00
bergquist 16e75a3036 feat(alerting): add alert message to slack integration 2016-08-12 10:12:04 +02:00
bergquist e7613b8bc0 fix(metrics): typo 2016-08-12 08:15:53 +02:00
bergquist 2fa97427eb fix(metrics): add ending dot for graphite prefix 2016-08-12 08:06:54 +02:00
Leandro Piccilli f844cd844b Fix for annotations query on ES 5.x 2016-08-11 22:24:58 +02:00
Torkel Ödegaard 895cff78b6 feat(thresholds): more work on thresholds, within and outside types no work 2016-08-11 22:22:15 +02:00
Torkel Ödegaard 7a5dda9e7c Merge branch 'alerting' of github.com:grafana/grafana into alerting 2016-08-11 21:33:29 +02:00
Torkel Ödegaard 6793eed6c5 feat(thresholds): dragging thresholds works again 2016-08-11 21:32:59 +02:00
Torkel Ödegaard 224ceb0ae5 feat(thresholds): updated design for grab handles 2016-08-11 21:22:40 +02:00
bergquist 937726499f feat(alerting): add global usage metrics for alerting
closes #5786
2016-08-11 21:12:46 +02:00
Torkel Ödegaard 89ca15f3a1 feat(thresholds): lots of progress on thresholds 2016-08-11 18:25:41 +02:00
bergquist ae15de119f Merge branch 'master' into alerting 2016-08-11 17:01:35 +02:00
bergquist f07b2ac446 fix(metrics): hide none existing metrics settings 2016-08-11 17:00:09 +02:00
bergquist cb6fd4ca78 test(alerting): fixes broken unit test 2016-08-11 16:55:08 +02:00
bergquist 99e99922b4 feat(alerting): add support for uploading images to webdav.
closes #5770
2016-08-11 16:48:54 +02:00
Torkel Ödegaard 72a67b39f1 feat(thresholds): more work thresholds 2016-08-11 15:18:21 +02:00
Torkel Ödegaard 6881db87bb Merge branch 'alerting' into thresholds_v3 2016-08-11 10:31:39 +02:00
Torkel Ödegaard 8878a55dc6 Merge branch 'master' into alerting 2016-08-11 10:31:15 +02:00
Torkel Ödegaard da6ac07b1d Merge branch 'v3.1.x' 2016-08-11 10:29:48 +02:00
Torkel Ödegaard 0d26bc63ae fix(graphite): minor fix/improvement to graphite error handling when doing metric exploration in query editor, fixes #5778 2016-08-11 10:29:28 +02:00
Torkel Ödegaard 780ec92dd8 fix(docs): fixed plugins docs, fixes #5777 2016-08-11 07:39:34 +02:00
Jeremy Bingham 7150571e60 Mac grafana wrapper script (#5779)
* One of the homebrew folks first asked for a wrapper script to make launching grafana easier. Later I was asked to remove it and submit it upstream, so here it is.

* add instructions for installing grafana HEAD from git with homebrew back to the docs
2016-08-11 07:37:35 +02:00
Jeremy Bingham 2c4ab4af02 Mac grafana wrapper script (#5779)
* One of the homebrew folks first asked for a wrapper script to make launching grafana easier. Later I was asked to remove it and submit it upstream, so here it is.

* add instructions for installing grafana HEAD from git with homebrew back to the docs
2016-08-11 07:36:14 +02:00
Torkel Ödegaard fbb8f8e691 feat(alerting): making progress on alert handles 2016-08-10 21:37:10 +02:00
Torkel Ödegaard 2639c38912 fix(threshold): remove old threshold properties 2016-08-10 20:44:39 +02:00
Torkel Ödegaard bdb8d77562 feat(thresholds): migration from previous threshold schema 2016-08-10 20:41:21 +02:00
Alexander Zobnin 124961a9e3 Explicitly set charset to utf-8 in viewJson(), fixes #5719. (#5774) 2016-08-10 20:23:58 +02:00
Torkel Ödegaard 7c0675798e feat(thresholds): new thresholds options are looking ok 2016-08-10 17:32:34 +02:00
Torkel Ödegaard 0f8c8517e3 feat(thresholds): adding a new form of thresholds options 2016-08-10 15:27:33 +02:00
bergquist 95c1a4a936 feat(alerting): implement more simple reducers 2016-08-10 14:06:17 +02:00
bergquist f2436fc7cd test(alerting): add tests for simple reducer 2016-08-10 13:52:15 +02:00
Torkel Ödegaard 4fd8b2ace4 Merge branch 'master' into alerting 2016-08-10 12:53:41 +02:00
Torkel Ödegaard a56cf9d6fd Merge branch 'v3.1.x' 2016-08-10 12:44:43 +02:00
Torkel Ödegaard 9a7e0eaf42 fix(dashboard): fixed drag and drop issue in chrome, fixes #5767 2016-08-10 12:43:36 +02:00
bergquist 03f0bc46a1 fix(metrics): make metrics cfg backwards compatible 2016-08-10 11:15:49 +02:00
Torkel Ödegaard c5d0c9f088 Merge branch 'v3.1.x' 2016-08-10 08:42:30 +02:00
Torkel Ödegaard c0301349fb docs(): update mac docs 2016-08-10 08:39:57 +02:00
Torkel Ödegaard 624e30e743 fix(docs): minor doc fixes, fixes #5751 2016-08-10 08:38:08 +02:00
Torkel Ödegaard d95545b5d3 feat(graph tooltip): refactoring PR #3063 2016-08-10 08:31:53 +02:00
Torkel Ödegaard 34804bda6d Merge branch 'issue-3063' of https://github.com/alexanderzobnin/grafana into alexanderzobnin-issue-3063 2016-08-10 08:08:57 +02:00
Torkel Ödegaard d49f0569f2 feat(metrics): minor fix for internal metrics fix PR #5758 2016-08-10 08:06:10 +02:00
Torkel Ödegaard 61756d2ae6 feat(alerting): removed delete button 2016-08-10 07:58:40 +02:00
bergquist de47710f1e tech(circle): rearrange build order 2016-08-09 14:28:44 +02:00
bergquist 5b57210aeb fix(metrics): replaces . with _ in instance name
closes #5739
2016-08-09 14:06:03 +02:00
bergquist d6fdb598b0 fix(alerting): gofmt 2016-08-08 14:46:47 +02:00
Alexander Zobnin f8f7543d4a Fix Elastic datasource tests - use moment.utc() instead moment() to prevent timezone-related issues, fixes #5733. (#5746) 2016-08-07 12:01:53 +02:00
bmundt 6d1dd95ab3 adds check for making datasource template variables children of other template variables (#5717) 2016-08-05 10:03:46 +02:00
hc4 4d40326706 Add refresh query parameter parsing (#5729) 2016-08-04 18:58:59 +02:00
Torkel Ödegaard 34ea7312bc docs(): added missing snapshot config options, fixes #5708 2016-08-02 09:35:15 +02:00
Torkel Ödegaard 01e5fd623b Update latest.json 2016-08-02 09:31:02 +02:00
Torkel Ödegaard e044a65d08 feat(alerting): updated 2016-08-01 22:15:28 +02:00
Alexander Zobnin 2c283ddd77 Fixed shared tooltip time calculation. Fixes #3063. 2016-08-01 20:41:15 +03:00
Torkel Ödegaard 1edd224168 feat(alerting): fixing failing unit tests 2016-08-01 14:34:58 +02:00
Torkel Ödegaard e6c4e47849 updated dependencies 2016-08-01 14:15:41 +02:00
Torkel Ödegaard 2bfccd77d4 docs(): updated release links 2016-08-01 12:47:55 +02:00
Torkel Ödegaard 84d7305d37 docs(): updated release links 2016-08-01 12:45:31 +02:00
Torkel Ödegaard fbad17d3a1 docs(): updated changelog 2016-08-01 12:27:03 +02:00
Torkel Ödegaard 317ffd1b68 Merge branch 'master' of github.com:grafana/grafana 2016-08-01 12:24:01 +02:00
Torkel Ödegaard 49abb205a0 Merge branch 'v3.1.x'
Conflicts:
	public/sass/_variables.light.scss
2016-08-01 12:23:36 +02:00
Torkel Ödegaard a4d27083d0 fix(tests): fixed unit test broken in recent dynamic dashboard fix 2016-08-01 12:20:16 +02:00
Torkel Ödegaard a9cf7cd4f0 fix(light theme): fixes issue with hidden queries in light theme, fixes #5697 2016-08-01 11:58:12 +02:00
Torkel Ödegaard 44d1393480 fix(templating): fixed issue with panel/row repeat when saving dashboard, fixes #5591 2016-08-01 10:50:33 +02:00
Torkel Ödegaard b46af0069e fix(footer): fixed link in footer, #5690 2016-08-01 10:09:43 +02:00
Torkel Ödegaard 357358898d feat(annotations): working on alert annotations, #5694 2016-08-01 10:07:00 +02:00
Torkel Ödegaard c5e90b1801 feat(alerting): more polish on alerting tab UI 2016-07-31 21:58:12 +02:00
Torkel Ödegaard 3b69c8f687 feat(alerting): new design for alert tab with sidemenu 2016-07-31 09:31:32 +02:00
Torkel Ödegaard 2b276d5cd1 feat(alerting): working on alert notification and image rendering 2016-07-30 13:36:21 +02:00
slqgsm e17b1548e8 Release there were some issues with the way removing columns was being implemented.
So I decided to scrap that, and go for just having a hidden column style. This is what
@madshall did in his enhanced table pull request, so this is basically the hidden
column style feature form his pull request.
2016-07-29 20:21:59 +00:00
slqgsm 93cb08d9d0 fixed typo and issue of not being able to add fields in table transformation 2016-07-29 16:30:38 +00:00
Torkel Ödegaard f9ddfb4337 Merge branch 'master' into alerting 2016-07-29 15:07:47 +02:00
Torkel Ödegaard 79138e211f Merge branch 'v3.1.x' 2016-07-29 15:07:17 +02:00
Torkel Ödegaard 741b7353c1 Merge branch 'v3.1.x' of github.com:grafana/grafana into v3.1.x 2016-07-29 15:06:09 +02:00
Torkel Ödegaard c4e7a3ae89 fix(png rendering): another fix for #5606 2016-07-29 15:04:51 +02:00
Torkel Ödegaard 4fc50742a0 feat(alerting): working on image rendering with alert notifications 2016-07-29 14:55:02 +02:00
slqgsm afb55fb3bd fixed to allow adding columns back in 2016-07-29 12:25:36 +00:00
Torkel Ödegaard f9a28d3306 feat(alerting): slack notification improvements, #5679 2016-07-29 13:41:42 +02:00
slqgsm e420bee2ab First commit for this branch, to allow removing of columns in table transformation 2016-07-28 21:44:07 +00:00
Torkel Ödegaard 01da3f6cb2 feat(alerting): worked on improving slack alerts 2016-07-28 17:03:53 +02:00
Torkel Ödegaard 717cce014b feat(alerting): refactoring 2016-07-27 17:07:44 +02:00
Torkel Ödegaard 6aaf4c97a2 feat(alerting): refactoring conditions out to seperate package 2016-07-27 16:18:10 +02:00
Torkel Ödegaard ae5f8a76d9 feat(alerting): lots of progress on notifications, refactored them out to their own package, restored webhook notitication and added slack notification 2016-07-27 12:09:55 +02:00
Torkel Ödegaard 77c66a88d9 Merge branch 'master' into alerting 2016-07-27 10:22:00 +02:00
Torkel Ödegaard c997923b17 Merge branch 'master' of github.com:grafana/grafana 2016-07-27 10:21:38 +02:00
Torkel Ödegaard e789d0df63 Merge branch 'v3.1.x' 2016-07-27 10:21:16 +02:00
Torkel Ödegaard 89dc3b88d1 fix(test): fixed failing test caused by recent change 2016-07-27 10:20:48 +02:00
Torkel Ödegaard c2eeb6dda0 fix(alerting): minor notification fix 2016-07-27 10:15:21 +02:00
Thib17 732c84c230 Enable scaling down seconds unit s > ms > µs > ns (#5642) 2016-07-27 10:10:01 +02:00
Torkel Ödegaard cde1bbff78 Merge branch 'alert_conditions' into alerting 2016-07-27 09:52:42 +02:00
Torkel Ödegaard c675ffc682 Merge branch 'master' into alerting 2016-07-27 09:45:16 +02:00
Mark Henderson 39be7cf7d7 Added grafana-cli command. Added public documentation for specifying plugin version when installing. (#5665) 2016-07-27 09:41:33 +02:00
Torkel Ödegaard e8e8463828 docs(): updated changelog 2016-07-27 09:39:46 +02:00
Torkel Ödegaard e4592c8d53 Merge branch 'v3.1.x' 2016-07-27 09:36:46 +02:00
Torkel Ödegaard 971e2d62f1 fix(zoom): fixed zoom in and out issues when graph is embedded, fixes #5666, fixes #4489 2016-07-27 09:36:35 +02:00
Leandro Piccilli 3057c9747c Change size on terms aggregation for ES 5.x 2016-07-26 22:05:49 +02:00
Torkel Ödegaard 5155c8a753 feat(templating): set default min span to 4, fixes #5662 2016-07-26 17:20:27 +02:00
Torkel Ödegaard 0b0f6b0848 feat(alerting): made very basic threshold viz work again 2016-07-26 14:35:42 +02:00
Torkel Ödegaard 0d9b98da6d feat(alerting): progress on email notifications 2016-07-26 12:29:52 +02:00
Torkel Ödegaard 6cb1dafb1d feat(alerting): progress on notifications 2016-07-25 16:26:28 +02:00
Torkel Ödegaard 8df558dece feat(notifications): refactoring notification handling 2016-07-25 13:52:17 +02:00
Torkel Ödegaard 9f14b209bd fix(html): moved body tag, fixes #5648 2016-07-25 12:21:51 +02:00
Torkel Ödegaard d4e2bb70e9 Merge branch 'v3.1.x'
Conflicts:
	package.json
2016-07-25 12:20:59 +02:00
Torkel Ödegaard 66a72e9ece changed version to 3.1.1 2016-07-25 12:20:21 +02:00
Torkel Ödegaard ee0d6ecfe6 Merge branch 'master' of github.com:grafana/grafana 2016-07-25 12:04:58 +02:00
Torkel Ödegaard def4d8f8dc docs(): updated changelog 2016-07-25 12:04:43 +02:00
Torkel Ödegaard 9fd7676846 Merge branch 'v3.1.x' 2016-07-25 12:03:40 +02:00
Torkel Ödegaard 0de0f4d014 feat(templating): fixed issue with template variables set to reload on dashboard load being issued multiple times, fixes #5637 2016-07-25 12:02:59 +02:00
bmundt f6b1d5a84a Added '!=' option for where clause in the influx query builder (#5646) 2016-07-25 10:36:38 +02:00
Torkel Ödegaard 9f777a535b fix(): removed dashboard version to schema version migration 2016-07-23 13:29:48 +02:00
Torkel Ödegaard 6d28365e84 docs(): updated changelog 2016-07-23 12:59:07 +02:00
Torkel Ödegaard 7a2e8324b9 Merge branch 'v3.1.x' 2016-07-23 12:54:23 +02:00
Torkel Ödegaard ddf579f204 fix(mixed data sources): fix when using two graphite data sources in mixed mode, fixes #5617 2016-07-23 12:54:11 +02:00
Torkel Ödegaard b943e41434 Merge branch 'master' of github.com:grafana/grafana 2016-07-23 12:01:48 +02:00
Torkel Ödegaard 4a33e2023f Merge branch 'v3.1.x' 2016-07-23 12:01:27 +02:00
Torkel Ödegaard 3abbf08a17 tech(): upgrade jquery to 2.2.4, closes #5627 2016-07-23 12:00:45 +02:00
Torkel Ödegaard 474a821767 fix(elasticsearch): fix json escape logic when doing terms template value lookup, fixes #5485 2016-07-23 11:52:49 +02:00
Torkel Ödegaard 14eba30f63 feat(alerting): more work on notifications 2016-07-23 11:50:48 +02:00
Peter Bonney 62e162c44c Update dashboard.md (#5640)
The key returned by `GET /api/dashboards/db/:slug` is "dashboard" (not "model").
2016-07-23 11:46:20 +02:00
Torkel Ödegaard a6c6094775 feat(alerting): started reworking notifications 2016-07-22 16:45:17 +02:00
Mitsuhiro Tanda 490ea18638 (cloudwatch) fix, don't block by white list (#5632) 2016-07-22 13:15:18 +02:00
Torkel Ödegaard 7eb2d2cf47 feat(alerting): working on state management 2016-07-22 13:14:09 +02:00
Torkel Ödegaard 783d697529 feat(alerting): more output when testing alert 2016-07-21 21:54:12 +02:00
Torkel Ödegaard b073fe0eba feat(alerting): more work on handling result and saving state 2016-07-21 17:31:46 +02:00
Torkel Ödegaard f0fc336e88 feat(alerting): worked on alert condition eval tests 2016-07-21 16:19:28 +02:00
Torkel Ödegaard 3ad38eefd2 feat(alerting): test results look better 2016-07-21 13:57:19 +02:00
Torkel Ödegaard f6a160b270 feat(alerting): testing alert is starting to work 2016-07-21 13:09:12 +02:00
Torkel Ödegaard 9e91aacd34 feat(alerting): progress on testing alerts 2016-07-21 10:29:11 +02:00
Leandro Piccilli df9ace8ac2 Change annotations query for ES 5.x 2016-07-21 00:42:36 +02:00
Torkel Ödegaard fb636344a6 feat(alerting): began work on testing alert rule from UI without having to save it 2016-07-20 16:13:36 +02:00
Torkel Ödegaard 0ce55600bb feat(alerting): progress on alerting backend 2016-07-20 14:28:02 +02:00
Torkel Ödegaard 3219d98a92 feat(alerting): starting work on condition evaluation 2016-07-20 09:30:31 +02:00
Torkel Ödegaard f872d5cfa3 feat(alerting): more refactoring work in backend code 2016-07-19 22:36:59 +02:00
Torkel Ödegaard 2a30baef05 feat(alerting): progress on updating extractor to work with new alert model 2016-07-19 21:00:41 +02:00
Torkel Ödegaard f60efed5d8 feat(alerting): progress on refactoring backend alert rule model 2016-07-19 17:45:37 +02:00
Torkel Ödegaard 20fcffb71e feat(alerting): working on alerting conditions model 2016-07-19 16:15:26 +02:00
Christos Trochalakis 824bf9f029 feat(graphite): added groupByNodes func def, closes #5612 2016-07-19 14:23:13 +03:00
Torkel Ödegaard f38c954639 feat(alerting): more work on alert conditions 2016-07-19 11:54:41 +02:00
Torkel Ödegaard 29d308e447 feat(alerting): refactoring alert model to use conditions concept 2016-07-19 11:24:27 +02:00
Torkel Ödegaard 0f555d6ab5 fix(alerting): minor fix 2016-07-19 09:28:49 +02:00
Torkel Ödegaard b0fe69822a Merge branch 'master' into alerting
Conflicts:
	public/app/core/services/alert_srv.ts
	public/app/partials/confirm_modal.html
2016-07-18 18:22:35 +02:00
Torkel Ödegaard 3f861dd039 Merge branch 'v3.1.x' 2016-07-18 16:27:27 +02:00
Torkel Ödegaard 3ae327320a fix(prometheus): fixed svg link in prometheus dashboard, fixes #5604 2016-07-18 16:27:02 +02:00
Torkel Ödegaard 78d0badffe Merge branch 'v3.1.x' of github.com:grafana/grafana into v3.1.x 2016-07-18 16:22:31 +02:00
Torkel Ödegaard 575b015fe0 fix(panel rendering): Fixed png panel rendering timing issue, #5606 2016-07-18 16:18:00 +02:00
Torkel Ödegaard b9a2546a10 fix(iframe): fixed issue with using full height of iframe, fixes #5605 2016-07-18 16:17:46 +02:00
Torkel Ödegaard 7ad0904fdb :Merge branch 'master' of github.com:grafana/grafana 2016-07-18 16:16:44 +02:00
Torkel Ödegaard b9c4107361 docs(): updated changelog 2016-07-18 16:16:35 +02:00
Torkel Ödegaard ffd865c7ca fix(panel rendering): Fixed png panel rendering timing issue, #5606 2016-07-18 16:13:50 +02:00
Torkel Ödegaard e507bb6dd7 fix(iframe): fixed issue with using full height of iframe, fixes #5605 2016-07-18 15:41:06 +02:00
Torkel Ödegaard 8f8ee28e64 docs(): updated changelog 2016-07-18 14:06:31 +02:00
Torkel Ödegaard 6c6dae1c92 Merge branch 'elasticsearch_precision_threshold' of https://github.com/lucasrodcosta/grafana into lucasrodcosta-elasticsearch_precision_threshold 2016-07-18 13:56:34 +02:00
Torkel Ödegaard c82d5f86ac fix(singlestat): fixed minor editor blur issue on decimal option that did not cause update of rendered value, fixes #5004 2016-07-18 11:24:41 +02:00
Leandro Piccilli 2a501d6cdb Merge branch 'master' of https://github.com/grafana/grafana 2016-07-18 10:34:11 +02:00
Loren West 51940fa209 Tooltip detatch too soon on mobile click (#5598)
* Tooltip detatch too soon on mobile click

* Fixed syntax error
2016-07-18 09:04:06 +02:00
Torkel Ödegaard f13b869aa4 feat(alerting): work on alerting 2016-07-14 13:32:16 +02:00
Jack Meagher 2c77f2231e Do not substitute #[A-Z] in graphite target when invalid ref (#5581)
* Do not substitute #[A-Z] in graphite target when invalid ref

In the case where #[A-Z] does not reference another query, such as #J when there
are only 2 queries, do not perform the substitution. This prevents the situation
target name without a query labelled J (10th query).

* Do not substitute #[A-Z] in graphite target when invalid ref

In the case where #[A-Z] does not reference another query, such as #J when there
are only 2 queries, do not perform the substitution. This prevents the situation
target name without a query labelled J (10th query).
2016-07-14 10:29:22 +02:00
Torkel Ödegaard 624cd6fc0a feat(alerting): cleanup, removed alert changes table and code 2016-07-13 11:58:55 +02:00
Torkel Ödegaard 82eebf64b6 fix(graph): Fix so that zoom works even when no data exists, fixes #5570 2016-07-13 10:02:53 +02:00
Torkel Ödegaard cc5c45112a Merge branch 'master' of github.com:grafana/grafana 2016-07-12 15:55:10 +02:00
Torkel Ödegaard 4bb4d7f7d3 Merge branch 'v3.1.x' 2016-07-12 15:54:31 +02:00
Torkel Ödegaard 383b313027 Update CHANGELOG.md 2016-07-12 15:17:04 +02:00
Torkel Ödegaard 0f9f903e09 Update latest.json 2016-07-12 15:16:46 +02:00
Torkel Ödegaard 6c2a61001a docs(): updated download links 2016-07-12 13:19:20 +02:00
Torkel Ödegaard d007363e7c bumbped version from beta1 to stable 2016-07-12 08:42:28 +02:00
Torkel Ödegaard b2acac3a41 feat(apps): more polish on app dashboard save warning, #5529 2016-07-12 08:41:56 +02:00
Torkel Ödegaard f3db2fa262 feat(plugins): hide link on small screens 2016-07-11 19:16:35 +02:00
Torkel Ödegaard 5b4fd8e9c8 Merge branch 'v3.1.x' of github.com:grafana/grafana into v3.1.x 2016-07-11 19:07:32 +02:00
Torkel Ödegaard 81af8f072c feat(links): updated links to grafana.net 2016-07-11 19:07:16 +02:00
Torkel Ödegaard d9096110f8 Merge branch 'master' into alerting
Conflicts:
	pkg/api/dashboard.go
	pkg/models/dashboards.go
	pkg/services/sqlstore/dashboard.go
2016-07-11 18:28:07 +02:00
Torkel Ödegaard 817f24e6fb Merge remote-tracking branch 'origin/development' 2016-07-11 15:24:24 +02:00
Bryan Irvine eafb0f3248 get rid of weird line breaks and use action (#4926)
* get rid of weird line breaks and use action

When using restarts/stops/starts you'd get weird output sometimes, Strange line breaks 'OK' status overlapping the next lines etc...
This fixes those moves OK to the right place and colorizes them correctly.

* added : for more uniformity

when doing a restart the output looked like:
Stopping Grafana Server ...                                [  OK  ]
Starting Grafana Server: ...                               [  OK  ]

The Stopping line did not have a colon. I added it just to make it look better.
2016-07-11 15:23:39 +02:00
stuart nelson eb35f8cb89 [prometheus] Use panelId and target.refId for requestId
Using these two values ties requests to a
particular query position within a panel, ensuring
that requests are canceled if:

- Duplicate requests with the same query are sent
- Requests from the same query position (but a
different query) are sent

The last point is important as it identifies
queries by a physical location in the dashboard
instead of with the query expression.  If a
different query from the same position in a panel
is sent, the previous request should be canceled.
2016-07-11 14:47:14 +02:00
Torkel Ödegaard 9055beff1a fix(table): fixed merge issue 2016-07-11 11:09:20 +02:00
Torkel Ödegaard e518f50248 docs(): updated changelog 2016-07-11 10:09:49 +02:00
Torkel Ödegaard 08202dcb83 Merge branch 'v3.1.x' 2016-07-11 09:39:17 +02:00
Torkel Ödegaard 65683ab241 feat(table): added sanitize html option to column styles for table panel, fixes #4596 2016-07-11 09:38:06 +02:00
Torkel Ödegaard 4c4cb20bde tech(sass): changed sass lint version to 1.7.0 2016-07-08 22:12:10 +02:00
Torkel Ödegaard 4133526d8d feat(build): updated sass lint 2016-07-08 21:04:58 +02:00
Alexander Akulov 010dbddf59 Fix double slashes in POST request to ES (#5536) 2016-07-08 18:24:08 +02:00
Torkel Ödegaard 12d455f3c3 Merge branch 'v3.1.x' of github.com:grafana/grafana into v3.1.x 2016-07-08 18:23:15 +02:00
Torkel Ödegaard 615b692442 feat(apps): fixed unit tests 2016-07-08 18:21:25 +02:00
Torkel Ödegaard ebdf0564eb feat(apps): plugin dashboard sync is starting to work 2016-07-08 17:44:57 +02:00
Torkel Ödegaard 68a8d9bc91 feat(apps): more work on plugin dashboard sync 2016-07-08 13:41:46 +02:00
Torkel Ödegaard 85be7dd902 feat(apps): progress on app dashboard sync 2016-07-08 12:26:51 +02:00
Torkel Ödegaard d44325affd feat(apps): progress on app dashboard imports 2016-07-08 09:35:06 +02:00
Fraser Savage 5a8efa9a52 Update configuration.md (#5527)
Insert missing backtick.
2016-07-08 07:12:26 +02:00
Torkel Ödegaard b62f1f00cd feat(apps): auto update dashboard dashboards, #5529 2016-07-07 18:11:03 +02:00
Torkel Ödegaard 3f83bf6e47 Merge branch 'v3.1.x' 2016-07-07 14:48:41 +02:00
Torkel Ödegaard 4545b4d323 fix(login): minor fix redirect on login change 2016-07-07 14:48:22 +02:00
bmundt e58ccc5a83 Hex units (#5530)
* added hex units

* deleted blank line, to fix style error

* added unit tests

* updated unit tests and changed the way it handles negative hex0x
2016-07-07 08:54:51 +02:00
Leandro Piccilli 0ebf469f5f Merge branch 'master' of https://github.com/grafana/grafana 2016-07-07 00:58:26 +02:00
Torkel Ödegaard 60abe75615 Merge branch 'v3.1.x' 2016-07-06 10:10:25 +02:00
Torkel Ödegaard d74eb8c188 fix(login): fixed so that you get redirect back to the page or dashboard you where on when you clicked on sign in link, fixes #3312 2016-07-06 10:09:53 +02:00
Torkel Ödegaard 89c3880a59 Merge branch 'master' of github.com:grafana/grafana 2016-07-06 08:26:24 +02:00
Torkel Ödegaard 7c7e26bc18 feat(templating): refactoring template variable handling for variables that change on time refresh, closes #5021 2016-07-06 08:25:46 +02:00
Torkel Ödegaard 069100099d Merge branch 'reflect_panel_repeat_when_time_range_changed' of https://github.com/mtanda/grafana 2016-07-06 07:40:51 +02:00
Adrián López 65aa6df45c Warn user if there are no mappings (#5246) 2016-07-06 07:31:42 +02:00
Torkel Ödegaard aad76d9220 Merge branch 'master' of github.com:grafana/grafana 2016-07-06 07:23:20 +02:00
Torkel Ödegaard 9088023116 fix(error handling): improved dashboard init error handling and notifications 2016-07-06 07:23:09 +02:00
Torkel Ödegaard ad1d7f0ffb Update package.json 2016-07-06 07:22:29 +02:00
Torkel Ödegaard 41bffd503d Update CHANGELOG.md 2016-07-06 07:22:03 +02:00
Torkel Ödegaard b4493155fc fix(error handling): improved dashboard init error handling and notifications 2016-07-06 07:18:58 +02:00
Torkel Ödegaard c1b7bd0f1b Merge branch 'notify_migration_error' of https://github.com/mtanda/grafana 2016-07-06 06:34:17 +02:00
Torkel Ödegaard 6a8c774dcc fix(graph): show graph panel render errors as panel errors, fixes #5414 2016-07-06 06:31:32 +02:00
Torkel Ödegaard 435aa88c05 Merge branch 'issue_5372' of https://github.com/kipe/grafana into kipe-issue_5372 2016-07-06 06:05:50 +02:00
Torkel Ödegaard 782427b5f2 Update latest.json 2016-07-06 05:28:49 +02:00
herver 9c73b2fa1c Support data units for both IEC (Binary) and Metric (Decimal) variants (#5473) 2016-07-06 05:27:35 +02:00
Torkel Ödegaard 53f110c942 Merge branch 'master' of github.com:grafana/grafana 2016-07-05 18:02:23 +02:00
Torkel Ödegaard fd5f7c2e34 fix(): updated changelog 2016-07-05 18:02:10 +02:00
Torkel Ödegaard 5595fc2683 refactor(): refactored date handling and locale handling in #5517 2016-07-05 17:59:43 +02:00
Torkel Ödegaard f31960d325 Update latest.json 2016-07-05 16:39:36 +02:00
Torkel Ödegaard c029e47a12 Merge branch 'moment-locale' of https://github.com/gofore/grafana into gofore-moment-locale 2016-07-05 16:22:33 +02:00
Joona Romppanen 438a73c58a Added moment.js locales. Set locale from window.navigator at app init(). Use firstDayOfWeek on time picker 2016-07-05 17:08:44 +03:00
Torkel Ödegaard 460820a117 conf(): updated sample config and root_url to better explain it 2016-07-05 14:10:23 +02:00
Carl Bergquist 9312a13e6e Merge pull request #5496 from joemiller/doc-update
grammar fix in docs
2016-07-03 09:44:00 -07:00
Torkel Ödegaard 8bd6b953b8 fix(elasticsearch): fix json escape logic when doing terms template value lookup, fixes #5485 2016-07-02 12:01:04 -04:00
joe miller a6554a85c0 grammar fix in docs 2016-07-02 08:27:31 -07:00
Carl Bergquist c047dacf18 Merge pull request #5442 from mtanda/snapshot_orig_url
(snapshot) save original url
2016-07-01 13:09:34 -07:00
Mitsuhiro Tanda 630d0d0793 (snapshot) add open original dashboard button 2016-07-02 02:26:27 +09:00
Kimmo Huoman 522a3408e9 Export CSV in the same format as presented in Table panel. Fixes issue #5372.
The data is exported in the same exact format as presented in the table panel.
This is achieved by using the same renderer as the UI uses.
2016-07-01 20:21:53 +03:00
Mitsuhiro Tanda cc519adcfc (snapshot) restrict saving original url for local snapshot 2016-07-02 02:16:23 +09:00
Mitsuhiro Tanda 7aaa15ad95 (snapshot) save original url 2016-07-02 02:16:23 +09:00
bergquist 07e522bb64 Merge branch 'influxdb_stop_hidden_queries' 2016-07-01 02:09:40 +02:00
bergquist 22ba51a631 Merge branch 'master' into influxdb_stop_hidden_queries 2016-07-01 02:09:10 +02:00
bergquist b47a307106 Merge branch 'master' into influxdb_stop_hidden_queries 2016-07-01 02:06:19 +02:00
Andris Raugulis 1c293781e3 Log to default log directory, only if custom configuration failed. (#5393) 2016-06-30 16:37:06 -07:00
Kevin Fitzpatrick f2baa5b210 Make Generic OAuth Configs ENV VARS-friendly
Use underscores instead of dashes.
2016-06-30 15:07:55 -07:00
Kevin Fitzpatrick b4646b6c3a Allow users to use a generic oauth that conforms to the github style.
Enables users to set their own link text.
2016-06-30 15:07:55 -07:00
Carl Bergquist 603e5fe0bf Merge pull request #5469 from stuartnelson3/create-unique-prometheus-req-id
[prometheus] Use `panelId` and `target.refId` for requestId
2016-06-30 13:13:01 -07:00
stuart nelson 0590c51524 [prometheus] Use panelId and target.refId for requestId
Using these two values ties requests to a
particular query position within a panel, ensuring
that requests are canceled if:

- Duplicate requests with the same query are sent
- Requests from the same query position (but a
different query) are sent

The last point is important as it identifies
queries by a physical location in the dashboard
instead of with the query expression.  If a
different query from the same position in a panel
is sent, the previous request should be canceled.
2016-06-30 11:29:02 +02:00
Torkel Ödegaard 5676a35d9a fix(css): added responsive media query for phones that fix header wrap 2016-06-29 14:35:58 -07:00
Torkel Ödegaard ae8fabdad3 fix(modal): fixed duplicate confirm modal issue 2016-06-29 14:26:21 -07:00
Carl Bergquist b289497db6 Merge pull request #5455 from rakotomandimby/patch-1
Update debian.md to Debian Jessie
2016-06-29 12:35:32 -07:00
Carl Bergquist fe7438c7ff Merge pull request #5461 from mtanda/pr_cloudwatch_add_metrics
(cloudwatch) add metrics
2016-06-29 12:08:44 -07:00
Carl Bergquist 7b84c4b4dc Merge pull request #5465 from tmc/patch-1
properly quote font-family on singlestat
2016-06-29 12:07:53 -07:00
Travis Cline bca6101609 properly quote font-family on singlestat 2016-06-29 11:03:07 -07:00
Soulou aa064b18e8 Test environment override for secret and url with credentials 2016-06-29 13:49:41 +02:00
Mitsuhiro Tanda 9ca5ba96be reorder metrics/dimensions 2016-06-29 14:11:01 +09:00
Mitsuhiro Tanda 511f8d3213 add cloudwatch metrics and dimensions 2016-06-29 13:55:16 +09:00
bergquist 4fc16c36ed feat(alerting): saves new state when alert updates 2016-06-29 00:05:48 +02:00
Torkel Ödegaard 5a65dc5d23 Merge branch 'alerting' of github.com:grafana/grafana into alerting 2016-06-28 14:04:38 -07:00
Torkel Ödegaard 9b4c0cca07 fix(flot): fixed flot issue introduced in alerting branch 2016-06-28 14:04:29 -07:00
Carl Bergquist 3460c12491 Merge pull request #5454 from Scalingo/node_version_package_json
Fix node version in package.json
2016-06-28 14:26:30 -04:00
Soulou e2c5fac9df Predefine url to let the environment variable overrider do its job 2016-06-28 17:45:55 +02:00
Soulou 03d0f11407 Accept URL parameter [database] config 2016-06-28 15:31:34 +02:00
Rakotomandimby Mihamina 16e2c660ac Update debian.md 2016-06-28 15:58:00 +03:00
Soulou 122b0d20a9 Fix node version in package.json
Value was incoherent since
https://github.com/grafana/grafana/commit/1900c81d9f9507ed4dbd18e95569480dfd0922f7
2016-06-28 14:36:15 +02:00
Othyus f3a6848710 feat(sidemenu): add style(margin and witdh) for the input and label filter 2016-06-28 08:30:36 +02:00
Othyus 31317abbeb feat(sidemenu): add limit for shown organizations 2016-06-28 08:11:37 +02:00
bergquist 6bf42dde18 tech(alerting): remove some logging 2016-06-27 01:27:30 +02:00
Mitsuhiro Tanda 8af3bb739c refactor 2016-06-26 22:39:34 +09:00
bergquist 4ed6b99d9a Merge branch 'alerting_notifications' into alerting 2016-06-26 04:05:56 +02:00
bergquist af216ecf83 tech(cli): remove loop and head straight for plugindir 2016-06-26 03:47:15 +02:00
bergquist 07be2c89a3 tech(cli): lets use the fact that we have a compiler 2016-06-26 03:47:15 +02:00
bergquist 88e208bddf feat(gf-form): add support for small input fields 2016-06-25 23:30:51 +02:00
Carl Bergquist 92835f0a04 Merge pull request #5434 from saboorian/master
Escape html chararcters in singlestat renderer
2016-06-25 20:49:16 +02:00
bergquist aecd487775 Merge branch 'f1yegor-master' 2016-06-25 20:42:38 +02:00
bergquist 241b9ee329 fix(kbn): add calculator for opn,rpm and wpm 2016-06-25 20:42:24 +02:00
bergquist 4cbde7e747 Merge branch 'master' of https://github.com/f1yegor/grafana into f1yegor-master 2016-06-25 20:38:43 +02:00
bergquist 12570bb959 feat(singlestat): add serie name as an value option
closes #4740
2016-06-25 20:17:23 +02:00
bergquist 8b8bfa8a17 fix(singlestat): rename seriename scoped var 2016-06-25 20:17:05 +02:00
Torkel Ödegaard b31fccb889 Merge branch 'master' of github.com:grafana/grafana 2016-06-25 17:53:42 +02:00
Carl Bergquist ab104bcfd7 Merge pull request #5401 from alexanderzobnin/issue-4740
Issue #4740 - able to use $SeriesName variable in prefix of postfix.
2016-06-25 17:49:44 +02:00
Torkel Ödegaard 35f135f6c2 Merge branch 'master' of github.com:grafana/grafana 2016-06-25 17:46:07 +02:00
Torkel Ödegaard 6dad6241ed docs(): updated changelog 2016-06-25 17:45:39 +02:00
Carl Bergquist 2d4cb50490 Merge pull request #5394 from hailthemelody/master
fix z-index order in Series Overrides
2016-06-25 17:43:47 +02:00
Torkel Ödegaard 0d6222c803 Merge branch 'master' of github.com:grafana/grafana 2016-06-25 17:43:22 +02:00
Torkel Ödegaard b275fa8109 fix(alerts): fixed login and other alert popups not showing, fixes #5435 2016-06-25 17:42:08 +02:00
Carl Bergquist c223994155 Merge pull request #5411 from mtanda/pr_dynamodb_add_metrics
add cloudwatch metrics
2016-06-25 17:36:50 +02:00
bergquist ff15a90e6d fix(login): fixes broken validation for login 2016-06-25 17:34:47 +02:00
bergquist 638a8a1528 docs(changelog): add note about closing #4674
closes #4674
2016-06-25 16:37:28 +02:00
bergquist 16fa631ea0 tech(tests): remove unused code that breaks gorename 2016-06-25 16:34:42 +02:00
bergquist c2689b0c2b Merge branch 'kfitzpatrick-recreate-4675' 2016-06-25 16:31:11 +02:00
bergquist 690a74c6b7 feat(login): invert naming for dissallow user pass login 2016-06-25 16:30:41 +02:00
Torkel Ödegaard 346ca3fc89 Merge branch 'master' into alerting 2016-06-25 09:56:57 -04:00
bergquist 092b6517dc Merge branch 'recreate-4675' of https://github.com/kfitzpatrick/grafana into kfitzpatrick-recreate-4675 2016-06-25 15:53:42 +02:00
Mohammad Mehdi Saboorian 1e486398cc Escape html chararcters in singlestat renderer 2016-06-25 13:43:58 +04:30
Torkel Ödegaard 23345c563c changed version in master to 3.2-pre 2016-06-24 16:51:55 +02:00
Torkel Ödegaard 60f45c965c Merge branch 'master' of github.com:grafana/grafana 2016-06-24 10:25:44 +02:00
Mitsuhiro Tanda 6ef27a87e4 fix catch clause 2016-06-24 13:44:10 +09:00
Kevin Fitzpatrick 040586604b Allow configuration to disable the username and password login interface.
Used for when admins only want users to login via OAuth.
2016-06-23 10:09:13 -07:00
Alexander Zobnin e593cc3e9f Issue #4740 - change variable $SeriesName to $seriesName. 2016-06-23 19:35:50 +03:00
Torkel Ödegaard efad4bcb56 docs(): updated changelog 2016-06-23 17:45:29 +02:00
Torkel Ödegaard 9435e70b37 docs(): spelling fix 2016-06-23 17:31:22 +02:00
bergquist 48e1a17ac2 feat(alerting): remove dummie values from email notifier 2016-06-23 16:30:12 +02:00
bergquist 6121d15ba7 feat(alerting): more aggressive requirements for parsing alertrules 2016-06-23 16:08:18 +02:00
bergquist 8b05af2f90 feat(alerting): add exeuction time to alertResult 2016-06-23 15:52:45 +02:00
bergquist 2063fee4fe docs(changelog): add note about cli fix #5410 2016-06-23 15:16:26 +02:00
Torkel Ödegaard c3e1955792 docs(): updated export docs 2016-06-23 13:21:30 +02:00
bergquist 6af2d99862 style(light-theme): make text-color-weak a little bit darker
otherwise its not possible to see which queries are disabled
in the query editor
2016-06-23 13:17:53 +02:00
Emmanuel Quentin 6487814007 Avoid to request influxdb when query is hidden 2016-06-23 13:11:16 +02:00
bergquist f95be63c43 feat(alerting): move response handling to seperate file 2016-06-23 12:57:10 +02:00
bergquist 67197d54f9 feat(alerting): add triggeredAlerts as json to alert_state 2016-06-23 11:14:40 +02:00
bergquist 488b42377b feat(alerting): update state if not been updated for 15min 2016-06-23 11:03:27 +02:00
Torkel Ödegaard 838284c09f docs(): updated changelog 2016-06-23 10:38:11 +02:00
Torkel Ödegaard 1d35b90484 docs(): updated download links 2016-06-23 10:35:47 +02:00
Mitsuhiro Tanda 44b2a292eb notify dashboard migration fail 2016-06-23 16:56:18 +09:00
Torkel Ödegaard f3c1a894de changed version to 3.1-beta1 2016-06-23 09:12:17 +02:00
bergquist eb54fbaef5 docs(changelog): add note about cli fix #5410 2016-06-23 08:41:25 +02:00
bergquist af1c8dc5d9 feat(cli): adds support for dist/plugin.json location for plugins
ref #5410
2016-06-23 08:35:40 +02:00
bergquist 2123fbdf9b feat(cli): make remove command an alias for uninstall 2016-06-23 08:21:55 +02:00
Mitsuhiro Tanda 16dc095329 (templating) support asc/desc sort 2016-06-23 11:26:41 +09:00
Mitsuhiro Tanda 8987cfe0a2 (templating) add sort order option 2016-06-23 11:26:41 +09:00
Mitsuhiro Tanda 09f7222e79 add cloudwatch metrics 2016-06-23 11:24:21 +09:00
bergquist 14169c5092 tech(docker): add memcached exporter target for prom 2016-06-22 17:36:22 +02:00
bergquist 925806df87 tech(alerting): add recovery logging 2016-06-22 13:43:11 +02:00
Othyus e204c308bf feat(sidemenu): filtering organizations by an input, issue #2609 2016-06-22 13:04:38 +02:00
Torkel Ödegaard 0555525f97 tech(): updated list of docker stuff 2016-06-22 11:01:11 +02:00
bergquist 7952723b71 feat(alerting): add warn/crit filter 2016-06-22 08:09:45 +02:00
bergquist b5a29b6246 test(alerting): add tests for when to send notifcations 2016-06-22 07:58:30 +02:00
bergquist 6edae37ac9 feat(alerting): rename state response method 2016-06-22 07:23:31 +02:00
Torkel Ödegaard 24a54cd95b feat(units): refactoring #5404 2016-06-21 21:08:07 +02:00
Torkel Ödegaard a7a5f36b49 Merge branch 'issue-2971' of https://github.com/alexanderzobnin/grafana into alexanderzobnin-issue-2971 2016-06-21 21:00:00 +02:00
Alexander Zobnin ab0155c861 Issue #2971 - add time units for use in singlestat panel. 2016-06-21 20:56:34 +03:00
Torkel Ödegaard 53c424caf8 docs(): title change 2016-06-21 18:25:24 +02:00
Torkel Ödegaard 23cfbac4ec feat(docs): updated import / export docs 2016-06-21 18:24:25 +02:00
Torkel Ödegaard f23d72001d fix(dashboard): fixed issue triggering refresh after leaving fullscreen/edit mode with time range change 2016-06-21 17:21:45 +02:00
Torkel Ödegaard 302ad5f1f9 Merge branch 'master' of github.com:grafana/grafana 2016-06-21 17:08:16 +02:00
Torkel Ödegaard 257e6c469e feat(collectd): updated collectd config 2016-06-21 17:07:01 +02:00
bergquist ef9766eb96 docs(3.1): initial post about whats new in 3.1 2016-06-21 16:29:17 +02:00
Alexander Zobnin cc433c1fbd Issue #4740 - able to use $SeriesName variable in prefix of postfix. 2016-06-21 15:48:18 +03:00
bergquist aa9e524e73 tech(docker): add node exporter to prometheus 2016-06-21 11:46:08 +02:00
Carl Bergquist 3b1ae3f7d2 Merge pull request #5396 from hailthemelody/fix_issue_template_typos
fix typos in GitHub Issue Template
2016-06-21 10:27:41 +02:00
hailthemelody cccfe47bf0 fix typos in GitHub Issue Template 2016-06-20 21:39:11 -04:00
hailthemelody 13d1fec2cb fix z-index order in Series Overrides 2016-06-20 20:54:01 -04:00
Carl Bergquist 87ab97b5ed Merge pull request #5391 from wkruse/prometheus-annotations-doc
Add Prometheus annotations doc
2016-06-20 18:49:00 +02:00
Wadim Kruse 3b47b1ecbd Add Prometheus annotations doc 2016-06-20 18:36:05 +02:00
bergquist 403fdebca3 docs(alerting): rewrite alert docs 2016-06-20 17:05:16 +02:00
bergquist 5d62c84a19 feat(alerting): adds default checkbox to ui 2016-06-20 16:19:15 +02:00
bergquist f5297db8f3 tech(alerting): remove console log that spams tests 2016-06-20 15:30:00 +02:00
bergquist fa309ec925 feat(alerting): add default notification group 2016-06-20 15:24:48 +02:00
bergquist 0a85efbf18 feat(alerting): add datasource type to settings 2016-06-20 11:44:06 +02:00
bergquist a18506e2e4 feat(alerting): changing notifications should require org admin 2016-06-20 11:32:55 +02:00
bergquist 0c5da9155f feat(alerting): only expose DTO info when requesting all notifications 2016-06-20 11:31:20 +02:00
bergquist 12706fd6db Revert "docs(changelog): add note about singlestat to datetime func"
This reverts commit 8efa94e42a.
2016-06-20 11:04:01 +02:00
Carl Bergquist d8be2f1ecc Merge pull request #5389 from grafana/revert-5383-issue-4747
Revert "issue #4747 - add date and time units to singlestat panel."
2016-06-20 11:02:43 +02:00
Carl Bergquist b6f9d9feb0 Revert "issue #4747 - add date and time units to singlestat panel." 2016-06-20 11:02:29 +02:00
bergquist 8efa94e42a docs(changelog): add note about singlestat to datetime func 2016-06-20 10:59:47 +02:00
Carl Bergquist b94527f661 Merge pull request #5383 from alexanderzobnin/issue-4747
issue #4747 - add date and time units to singlestat panel.
2016-06-20 10:57:08 +02:00
bergquist 96e5ad3f5c Merge branch 'alerting' into alerting_notifications 2016-06-20 10:45:05 +02:00
bergquist dd8c3d0355 Merge branch 'master' into alerting 2016-06-20 10:44:48 +02:00
bergquist 3adee1eda0 tech(sass): sasslint fixes for css3
Pseudo-elements must start with double colons pseudo-element
2016-06-20 10:37:47 +02:00
bergquist 7c09a140c7 test(alerting): fixes broken tests for alerting thresholds 2016-06-20 10:06:18 +02:00
bergquist 4c4164bb40 test(alerting): adds test email creater 2016-06-20 07:49:08 +02:00
Leandro Piccilli 2205ce5354 Add some tests for ES 5.x 2016-06-20 00:40:16 +02:00
Alexander Zobnin 398e9f5195 issue #4747 - add date and time units to singlestat panel. 2016-06-17 22:51:08 +03:00
bergquist adea539b8d feat(alerting): add link to panel png 2016-06-17 16:43:14 +02:00
bergquist ea4b14ac22 feat(alerting): rename critical -> crit 2016-06-17 16:40:48 +02:00
bergquist 212fd27252 feat(alerting): add support for email notifications 2016-06-17 15:30:17 +02:00
bergquist 774add94c1 feat(alerting): skip warn check if crit is triggered 2016-06-17 15:24:17 +02:00
Torkel Ödegaard 90c063060a fix(png): fixed phantomjs rendering issue with graph and y-axis label rotation, fixes #5220 2016-06-17 14:36:10 +02:00
Torkel Ödegaard 3bcda9268a feat(styleguide): removed unused/empty tabs 2016-06-17 14:18:24 +02:00
Torkel Ödegaard e2b398a6bf Merge branch 'master' of github.com:grafana/grafana 2016-06-17 14:16:25 +02:00
Torkel Ödegaard fa10fc994a fix(graph): remove panel width cache, causing issues, does not handle window resize and fullscreen to dashboard, #5297 2016-06-17 14:16:01 +02:00
Drew Farris cb2b8dea96 OpenTSDB: consistent options for http requests (#5233)
* OpenTSDB: consistent options for http requests

 . the get function wasn't using the same request options wrt to credentials/auth as
   the timeseries http request

* OpenTSDB: `_get` `_performTimeSeriesQuery` refactor copied code
2016-06-17 14:04:40 +02:00
Torkel Ödegaard 9bcd5de8ff fix(share): fixed PNG render link generated from share modal when opened from edit mode, fixes #5295 2016-06-17 14:03:59 +02:00
Torkel Ödegaard 9f9fca1e76 feat(datasource): added suggest urls for each data source, #4577 2016-06-17 13:35:29 +02:00
Alexander Zobnin fdf46c6a10 Issue 4577 (#5379)
* Add default-url property for datasource-http-settings directive.
This will allow to set default url for datasource.

* Fixed spelling.

* Use typeahead for url suggestion.
2016-06-17 13:18:00 +02:00
Torkel Ödegaard 305a6ae110 feat(dashboards): dashboard sharing fixes 2016-06-17 11:36:35 +02:00
Torkel Ödegaard 10daf1d63a Revert "Enable the "limit" param in /api/search"
This reverts commit 3d77685108.
2016-06-17 11:22:39 +02:00
bergquist 90e3d8afda Merge branch 'alerting' into alerting_notifications 2016-06-17 09:55:58 +02:00
bergquist c96108226c fix(alerting): use alert frequency 2016-06-17 09:55:42 +02:00
bergquist 764c58ba8d Merge branch 'alerting' into alerting_notifications 2016-06-17 09:54:38 +02:00
bergquist 9481fcb830 fix(alerting): use alert frequency 2016-06-17 09:54:11 +02:00
Torkel Ödegaard 23aa614baf feat(rendering): fixed issue with png rendering, recently introduced by profiler refactoring 2016-06-17 08:49:11 +02:00
bergquist ebada26b85 Merge branch 'alerting' into alerting_notifications 2016-06-17 08:27:58 +02:00
bergquist e8a324c7f5 feat(alerting): add frequency back to alert model 2016-06-17 08:27:38 +02:00
Torkel Ödegaard 5c35fac8fe fix(dataproxy): removed accidental debug code 2016-06-17 08:11:37 +02:00
bergquist 946dc0ecf3 Merge branch 'alerting' into alerting_notifications 2016-06-17 07:44:39 +02:00
bergquist 1771ab032e Merge branch 'master' into alerting 2016-06-17 07:44:21 +02:00
bergquist 8b2f6fffc9 test(dashboards): comment code in broken tests 2016-06-17 07:43:57 +02:00
Torkel Ödegaard 32479503bd fix(build): another windows build issue 2016-06-16 21:10:30 +02:00
Torkel Ödegaard b06ec734f1 fix(build): windows, another windows build fix, #5370 2016-06-16 18:21:12 +02:00
bergquist b035074613 tech(alerting): disable update state api 2016-06-16 17:02:45 +02:00
bergquist a0418da160 Merge branch 'alerting' into alerting_notifications 2016-06-16 16:49:16 +02:00
bergquist 8ec311ade4 Merge branch 'master' into alerting 2016-06-16 16:29:41 +02:00
bergquist 3c4d2b8ca1 feat(alerting): add basic body for webhooks 2016-06-16 16:25:23 +02:00
bergquist 6705efef6f feat(alerting): make some settings properties required 2016-06-16 16:18:40 +02:00
bergquist f3009dc23b fix(alerting): broken link 2016-06-16 16:06:40 +02:00
bergquist b907ce341c feat(alerting): enables deletes for alert notifications 2016-06-16 15:21:44 +02:00
bergquist 149c2ae913 feat(alerting): add submenu for alerting 2016-06-16 15:21:23 +02:00
Torkel Ödegaard b039a81375 feat(build): fixing windows build issue, #5370 2016-06-16 14:36:19 +02:00
bergquist 7f767224af feat(alerting): basic support for creating and updating notifications 2016-06-16 14:29:20 +02:00
Joel Smith 46fe9a167e Update file_export.ts (#5325)
Prepended first line to export file containing
`sep=;\n`
which I believe should be all that is required for Excel to interpret the CSV file as semicolon delimited.
2016-06-16 14:27:00 +02:00
Torkel Ödegaard 79eb971fad docs(): updated changelog 2016-06-16 10:49:40 +02:00
Torkel Ödegaard 81e9aa4de4 feat(datasource): cancel in flight data source requests, refeatoring #5321 2016-06-16 10:48:26 +02:00
bergquist c51facfaef style(alerting): move filter below HR 2016-06-16 09:23:53 +02:00
bergquist 00fc2e2593 test(alerting): fixes broken unittest 2016-06-16 09:09:09 +02:00
Torkel Ödegaard 6d3521c240 Merge branch 'cancel-in-flight-repeats' of https://github.com/stuartnelson3/grafana into stuartnelson3-cancel-in-flight-repeats 2016-06-16 08:57:31 +02:00
bergquist 72e23bca5f tech(alerting): improve/cleanup logging 2016-06-16 08:56:19 +02:00
Torkel Ödegaard 23e0240410 fix(build): removed logging call that caused wrong dependency to be used 2016-06-16 08:55:36 +02:00
bergquist 4d03e04172 feat(alerting): enable email notifiter 2016-06-16 08:29:49 +02:00
Torkel Ödegaard 1ae24b366f feat(profiler): fixed issues with frontend perf profiler 2016-06-16 08:28:50 +02:00
bergquist 2e809cae05 tech(alerting): enforce POST for webhooks 2016-06-16 08:16:16 +02:00
bergquist efea3bc9cb feat(alerting): skeleton commit for webhook 2016-06-16 08:16:16 +02:00
bergquist a3b7ea7704 feat(alerting): skeleton for alert notification configuration page 2016-06-16 08:16:16 +02:00
bergquist 4c5d2d6079 style(alerting): remove unused code 2016-06-16 08:16:16 +02:00
bergquist b9b65cf2d4 tech(alerting): add logging about failed notifications 2016-06-16 08:16:16 +02:00
bergquist 9a8416416d feat(alerting): converter for db model to notification 2016-06-16 08:16:16 +02:00
bergquist 6eca26e8ec style(alerting): improve formating 2016-06-16 08:16:16 +02:00
bergquist dbf3795aaf feat(alerting): add sql layer for alert notifications 2016-06-16 08:16:16 +02:00
bergquist 8b91e57ef6 feat(alerting): notification query 2016-06-16 08:16:16 +02:00
Torkel Ödegaard 2ceb58d0c4 feat(elasticsearch): removed dashboard import migration 2016-06-16 08:11:40 +02:00
Torkel Ödegaard e1f63a3346 docs(): updated changelog 2016-06-16 08:10:15 +02:00
Torkel Ödegaard ec0b09450c Merge branch 'export-dashboard'
Conflicts:
	conf/defaults.ini
	pkg/setting/setting.go
	public/app/core/components/grafana_app.ts
	public/app/core/core.ts
	public/app/features/dashboard/dashboardCtrl.js
2016-06-16 08:06:43 +02:00
Torkel Ödegaard 4b78ab5bcd feat(graph): graph tooltip sort order PR refactored/changed #4944, changed the layout graph display options, #4944 2016-06-15 17:20:55 +02:00
Torkel Ödegaard ae554a736b change(graphite): removed graphite png option in graph panel, closes #5367 2016-06-15 14:20:44 +02:00
bergquist 779ea55ee0 style(alerting): rename executor -> handler 2016-06-15 11:49:20 +02:00
bergquist 777ca4cd7d style(alerting): rename level.level to level.value 2016-06-15 11:39:25 +02:00
Torkel Ödegaard a893152141 feat(alerting): thesholds unification 2016-06-15 10:41:21 +02:00
Torkel Ödegaard f03e8292a2 feat(alerting): progress on threshold unification 2016-06-14 17:00:51 +02:00
Torkel Ödegaard ed7a539ddb feat(alerting): thresholds rethink 2016-06-14 16:45:51 +02:00
Carl Bergquist f842e28b85 Merge pull request #5343 from utkarshcmu/opentsdb-template
Implemented nested template variables functionality for Opentsdb
2016-06-14 07:43:41 +02:00
utkarshcmu 33aa3f0fc5 Made tag_values query more robust 2016-06-13 14:21:46 -07:00
Torkel Ödegaard dac8b35a1a feat(alerting): renamed scheduler to handler 2016-06-13 15:58:22 +02:00
bergquist 7f22b9eb6e tech(alerting): expression -> settings 2016-06-13 15:18:19 +02:00
bergquist bb6888885e fix(alerting): makes valid to save more explicit 2016-06-13 15:01:07 +02:00
bergquist 0d60b042c8 style(alerting): revemo commented code 2016-06-13 14:57:24 +02:00
bergquist ca33622698 style(alerting): rename max retries 2016-06-13 14:54:06 +02:00
bergquist 3ad90c389c style(alerting): improve naming 2016-06-13 14:01:57 +02:00
utkarshcmu e4e042e389 CHANGELOG entry 2016-06-13 04:53:21 -07:00
bergquist 04436c8a52 test(alerting): make sure the worst state is captured 2016-06-13 13:45:26 +02:00
utkarshcmu f3003a97ef Added required documentation 2016-06-13 04:34:23 -07:00
utkarshcmu 6550bc97ba Added unit tests 2016-06-13 04:24:27 -07:00
utkarshcmu 862de3a9dc Added templated dependency in Opentsdb 2016-06-13 03:59:12 -07:00
bergquist 6cb4bdd6cb feat(alerting): adds a result list to alertresult
Since one query can return multiple series we might be
interested in getting the result for each serie
2016-06-13 11:44:47 +02:00
bergquist a77824939f chore(alerting): remove alerting model.json 2016-06-13 11:10:28 +02:00
bergquist 1e41eb8c97 tech(alerting): remove frequency from alert model 2016-06-13 10:42:36 +02:00
bergquist 94f059838c feat(alerting): implemention duration parser 2016-06-13 10:40:46 +02:00
bergquist 2cf72715fb test(alerting): fixes broken unit tests 2016-06-13 09:33:14 +02:00
bergquist d52fc8d0ad Merge branch 'alert_ui_take2' into alerting 2016-06-13 09:20:00 +02:00
Torkel Ödegaard 9216492d55 Merge branch 'alert_handles' into alert_ui_take2
Conflicts:
	pkg/services/alerting/commands.go
2016-06-13 07:53:13 +02:00
bergquist 77746f277d chore(alerting): move transformers to seperate package 2016-06-13 07:46:54 +02:00
bergquist 22407fc897 fix(metrics): 64bit aligns standardcounter
Due to a bug in golang the 64bit variable i
need to come first to be 64bit aligned.
https://golang.org/pkg/sync/atomic/#pkg-note-BUG

closes #5341
2016-06-13 06:56:16 +02:00
Carl Bergquist dba6fe8af3 Merge pull request #5340 from hailthemelody/master
update pricing to include 1 million free API requests per month
2016-06-13 06:54:00 +02:00
hailthemelody ef9500a8f0 update pricing to include 1 million free API requests per month 2016-06-12 11:41:43 -04:00
Torkel Ödegaard e3b281dbac feat(alerting): more work on alerting thresholds 2016-06-12 11:43:18 +02:00
Torkel Ödegaard 5b6fb3b124 feat(alerting): level handle progress 2016-06-11 23:52:25 +02:00
Torkel Ödegaard ec640bd5da feat(alerting): more work on alerting ui 2016-06-11 23:31:49 +02:00
Torkel Ödegaard 1500c0e954 feat(alerting): alert threshold handles progress 2016-06-11 22:33:02 +02:00
Torkel Ödegaard f387e39b67 mend 2016-06-11 14:37:52 +02:00
Torkel Ödegaard 0b919c752b feat(alerting): poc of dragable alert handles 2016-06-11 14:37:33 +02:00
Torkel Ödegaard 66c2594262 feat(alerting): sql update fixes 2016-06-11 14:08:55 +02:00
Torkel Ödegaard 71c1c0ab65 feat(alerting): trying to get things to work with new model 2016-06-11 13:49:11 +02:00
Torkel Ödegaard 0ef6801117 Merge branch 'master' into alert_ui_take2 2016-06-11 12:17:14 +02:00
Torkel Ödegaard bf1ea560e9 feat(logging): error logging improvements 2016-06-11 12:16:33 +02:00
Torkel Ödegaard 77a5e3f14d feat(alerting): minor fixes 2016-06-11 11:54:46 +02:00
Torkel Ödegaard 086b59483e feat(loggin): disable logging by default so unit tests are not full of logging 2016-06-11 11:38:25 +02:00
Torkel Ödegaard 382f396247 feat(alerting): more model changes 2016-06-11 10:54:24 +02:00
Torkel Ödegaard a362984c57 feat(alerting): renamed AlertRuleModel to just Alert, think making a distinction between an Alert and an Alert Rule is just confusing and was a mistake on my part 2016-06-11 10:26:48 +02:00
Torkel Ödegaard 2b4a9954b1 feat(alerting): progress on alerting UI and model, refactoring of dashboard parser and tests into extractor component, moved tests from sqlstore to alerting package 2016-06-11 10:13:33 +02:00
bergquist 1fa9ae810b test(alerting): enable disabled tests 2016-06-10 15:49:23 +02:00
bergquist 83c422e6ef feat(alerting): implement transform objects 2016-06-10 15:31:17 +02:00
Torkel Ödegaard c18017381b Merge branch 'alert_ui_take2' of github.com:grafana/grafana into alert_ui_take2
Conflicts:
	public/app/plugins/panel/graph/alert_tab_ctrl.ts
2016-06-10 14:52:17 +02:00
Torkel Ödegaard 48cbeb96bf feat(alerting): updated rule model and UI 2016-06-10 14:49:54 +02:00
bergquist ea8fb66f73 test(alerting): fixes broken unittests 2016-06-10 13:47:54 +02:00
bergquist 3c0b5fe78e tech(alerting): add graphite dateformat replacer 2016-06-10 13:26:19 +02:00
bergquist 8cd1d17916 feat(alerting): new alerting model\ 2016-06-10 13:15:16 +02:00
bergquist 0c69c5afb1 test(alerting): fixes broken unittests 2016-06-10 11:37:03 +02:00
bergquist ef35184a80 feat(alerting): rename alertrule model to alertruleDAO 2016-06-10 10:00:00 +02:00
bergquist b17298c97c test(alerting): remove unused code to enable gorename 2016-06-10 07:11:14 +02:00
bergquist fdf051ad5a feat(alerting): begin alert rule storage refactoring 2016-06-09 22:21:28 +02:00
stuart nelson 048bcf19f6 Use panel+ref for unique id
Previously, if a user changed the query between
requests, the previous query would not be
canceled. This handles that edge-case.
2016-06-09 15:17:17 +02:00
stuart nelson 8797be9f89 Add existence check for canceler. 2016-06-09 15:16:53 +02:00
bergquist 3898f427f5 feat(alerting): update the ux model 2016-06-09 15:10:50 +02:00
bergquist 1e4761854e Merge branch 'alerting_definitions' into alert_ui_take2 2016-06-09 13:03:40 +02:00
stuart nelson cc64d65c2f Rename cacheKey to exprID/requestID
Depending on context in the code, rename cacheKey
to exprID when it identifies a unique expression,
and rename cacheKey to requestID when it is
identifying a request.
2016-06-09 12:57:55 +02:00
Torkel Ödegaard 55af988e02 feat(alerting): mocking with new alert rule model 2016-06-09 12:14:50 +02:00
stuart nelson efdb990e56 Return an error for a canceled request.
Allow the datasource to decide how to handle a
canceled request.
2016-06-09 12:13:17 +02:00
stuart nelson bc7c2cd3f5 Create cacheKey at top-level
Responsibility is now to pass the cacheKey through
to `datasourceRequest` in each datasources'
implementation of `query`.
2016-06-09 11:36:46 +02:00
bergquist 66d47a9303 tech(alerting): go vet fix 2016-06-09 10:49:25 +02:00
Torkel Ödegaard c85bb47675 Merge branch 'alerting_definitions' into alert_ui_take2 2016-06-09 10:46:03 +02:00
Torkel Ödegaard dee5f582d7 Merge branch 'master' into alerting_definitions 2016-06-09 10:45:16 +02:00
Torkel Ödegaard 1584dac00a Merge branch 'master' of github.com:grafana/grafana 2016-06-09 10:43:46 +02:00
Torkel Ödegaard 79986e5593 Merge branch 'query-part-refactor'
Conflicts:
	public/app/plugins/datasource/influxdb/query_part.ts
2016-06-09 10:43:07 +02:00
Torkel Ödegaard b8aa8b3079 feat(prometheus): restore old prometheus query editor, revert this commit in prometheus query editor v2 branch 2016-06-09 10:37:33 +02:00
bergquist 544073b7e1 feat(alerting): make sure saved alerts are valid 2016-06-09 10:27:23 +02:00
Torkel Ödegaard 071c16b73c feat(alerting): start on new ui 2016-06-09 10:13:34 +02:00
bergquist a1f97e0b77 feat(alerting): add heartbeat writer 2016-06-09 10:00:34 +02:00
Mark Baas ced3bafa99 returns correct index (#5275) 2016-06-09 08:13:31 +02:00
Mukesh 755ec552de Bugfix: org select btn was not working on profile (#5317) 2016-06-09 00:43:38 +02:00
stuart nelson 18f9f6c159 Add in-flight identifier for Prometheus requests
Repeat Prometheus requests with the same query
will cancel preceding requests.
2016-06-08 18:05:46 +02:00
stuart nelson 6da7ed9706 Add support for canceling in-flight requests
Repeat requests, if they already exist in the
in-flight request map, will cause the previous
request to cancel.

The implementation of the unique key is the
responsibility of individual datasources.
2016-06-08 18:04:31 +02:00
Torkel Ödegaard a66027830b Merge branch 'alerting_definitions' of github.com:grafana/grafana into alerting_definitions 2016-06-08 09:42:31 +02:00
Torkel Ödegaard 26d93d7130 Merge branch 'master' into alerting_definitions 2016-06-08 09:36:50 +02:00
bergquist ffac5c1299 docs(changelog): add note about changelog 2016-06-08 09:35:34 +02:00
Carl Bergquist fe5673134f Merge pull request #5292 from Thib17/master
Enable the "limit" param in /api/search
2016-06-08 09:19:58 +02:00
bergquist 366fb11416 style(alerting): add fmt fixes 2016-06-08 08:50:11 +02:00
Torkel Ödegaard 1d8fdc09e7 feat(logging): added log format option, #4590 2016-06-08 08:48:46 +02:00
Torkel Ödegaard 7d6cda4916 Merge branch 'master' of github.com:grafana/grafana 2016-06-08 08:10:22 +02:00
Torkel Ödegaard b25cb60259 Merge branch 'new-logger'
Conflicts:
	CHANGELOG.md
2016-06-08 08:09:59 +02:00
Torkel Ödegaard 87e98f01cd feat(logging): updated syslog writer to work with log15 log interface, closes #4590 2016-06-08 08:09:29 +02:00
Karl 22cda198ae Apply EscapeFilter to username to address grafana/grafana#5121 (#5279) 2016-06-08 07:28:16 +02:00
Tom Hukins d1c06a93df Fix a typo (#5306) 2016-06-08 07:27:52 +02:00
Torkel Ödegaard eed0d9c8d2 feat(graph performance): graph performance tweaks, refactoring #5297 2016-06-08 07:23:44 +02:00
Torkel Ödegaard bf82fdb678 Merge branch 'perf_graph_js' of https://github.com/mtanda/grafana into mtanda-perf_graph_js 2016-06-08 06:53:28 +02:00
Torkel Ödegaard e1e7fbf83d Merge branch 'master' of github.com:grafana/grafana 2016-06-08 06:51:43 +02:00
Torkel Ödegaard c739428c30 feat(profiling): refactorign profiling code, #5286 2016-06-08 06:51:10 +02:00
Torkel Ödegaard 2a7d2ffccb Merge branch 'profiling_in_dev' of https://github.com/mtanda/grafana into mtanda-profiling_in_dev 2016-06-08 05:47:30 +02:00
Zdenek Styblik 5eceabf810 fix(): Check Organization exists before User is added (#5302)
Commit adds a check whether Organization exists before User is added to
the organization.

Fixes #3151.
2016-06-08 05:46:21 +02:00
Torkel Ödegaard 67ad903556 feat(test metrics): fixed issue with built in Grafana test data source, fixes #5299 2016-06-08 05:45:13 +02:00
Torkel Ödegaard 36b0802789 fix(png): fixed issue with png rendering, fixes #5274 2016-06-08 05:29:38 +02:00
Torkel Ödegaard 93fdc18fd4 feat(logging): fixed dependencies 2016-06-07 15:59:50 +02:00
bergquist 8d4aa5d114 test(alerting): update dashboard json 2016-06-07 15:52:33 +02:00
Torkel Ödegaard e4ea24dfc4 Merge branch 'new-logger' into alerting_definitions
Conflicts:
	pkg/services/sqlstore/migrations/migrations_test.go
2016-06-07 15:51:22 +02:00
Torkel Ödegaard 73b0e6c37b feat(logging): disable migrator logging during test 2016-06-07 15:50:16 +02:00
Torkel Ödegaard d7c03359ea feat(alerting): fixed test issues 2016-06-07 14:54:30 +02:00
Torkel Ödegaard 3289225b77 feat(alerting): fixed test issues 2016-06-07 14:51:53 +02:00
Torkel Ödegaard 8105ec4660 feat(alerting): fixed test issues 2016-06-07 14:27:56 +02:00
Torkel Ödegaard 461e6ae4ac feat(alerting): added missing godep libs 2016-06-07 13:50:55 +02:00
Torkel Ödegaard 0d9c9526b9 feat(alerting): fixed graphite log issue 2016-06-07 13:47:22 +02:00
Torkel Ödegaard 0667d73660 Merge branch 'new-logger' into alerting_definitions
Conflicts:
	pkg/api/api.go
	pkg/setting/setting.go
2016-06-07 13:31:56 +02:00
Torkel Ödegaard 65aad44464 feat(logging): added uname to context logger 2016-06-07 12:20:46 +02:00
Torkel Ödegaard a02cf5beb7 feat(logging): added loging filters 2016-06-07 12:11:41 +02:00
bergquist b76b42f209 docs(changelog): add note about deb post install script 2016-06-07 12:09:56 +02:00
Carl Bergquist ee88b0dc35 Merge pull request #5282 from nazco/patch-1
restart grafana after upgrade
2016-06-07 12:03:42 +02:00
Torkel Ödegaard 3dc7706c45 feat(loggin): improved http request panic handling 2016-06-07 10:05:10 +02:00
Torkel Ödegaard 9741af2031 feat(logging): progress on new logging #4590 2016-06-07 09:29:47 +02:00
Mitsuhiro Tanda 487b2089a9 cache label width 2016-06-07 14:28:08 +09:00
Mitsuhiro Tanda b28368c859 cache panel width 2016-06-07 14:04:06 +09:00
Torkel Ödegaard 22778e6efd feat(logging): a lot of progress on moving to new logging lib, #4590 2016-06-06 23:06:44 +02:00
Thibault Chataigner 3d77685108 Enable the "limit" param in /api/search 2016-06-06 16:15:20 +00:00
Mitsuhiro Tanda 25899b72d2 use applyAsync for compile (#5287) 2016-06-06 17:18:18 +02:00
Mitsuhiro Tanda f877afb74d use async apply (#5258) 2016-06-06 17:18:10 +02:00
Torkel Ödegaard 34e17f7282 feat(alerting): requests looks to be working again 2016-06-06 17:11:46 +02:00
Torkel Ödegaard d1acfb4494 feat(alerting): minor progress 2016-06-06 14:24:14 +02:00
Torkel Ödegaard 7a34c129fe feat(alerting): things are compiling and tests pass 2016-06-06 13:50:47 +02:00
Torkel Ödegaard 0cbf4ae773 feat(alerting): began work on splitting scheduler into scheduler and engine 2016-06-06 11:56:58 +02:00
Mitsuhiro Tanda 83c76981b2 fix profiling code 2016-06-06 17:42:11 +09:00
Mitsuhiro Tanda 975b53b318 enable profiling in development mode 2016-06-06 17:42:11 +09:00
Torkel Ödegaard a191b9b1cf feat(alerting): moved alerting models back to alerting package, models is more for storage dtos 2016-06-06 10:31:21 +02:00
Torkel Ödegaard 70cb8400c3 feat(alerting): changed name of root Alerts nav item and page from Alerts to Alerting 2016-06-06 09:17:29 +02:00
Torkel Ödegaard f36a44c49a Merge branch 'master' into alerting_definitions
Conflicts:
	conf/defaults.ini
	pkg/api/dashboard.go
2016-06-06 08:43:01 +02:00
Karl 2f5ae85d33 Initial patch for grafana/grafana#4267 (#5280) 2016-06-06 07:15:37 +02:00
Ben Oswald 51878aeca8 change start to restart also for systemctl
I've forgotten to update the systemctl start to restart in my first commit
2016-06-05 16:27:57 +02:00
Ben Oswald 1d2eb0f903 restart grafana after upgrade
The current script only tries to start the already running grafana process after an upgrade. This leads to errors due to changed js and css hashes while grafana is delivering the old ones. To load the new sources we need to restart grafana after an upgrade.
2016-06-05 16:19:53 +02:00
f1 d002cab28f add reads/min and etc to unitFormats 2016-06-05 00:57:04 +02:00
Torkel Ödegaard 7cbaf06097 feat(instrumentation): check if enabled in http api metrics route 2016-06-03 21:22:34 +02:00
Torkel Ödegaard 1059a35bbc feat(instrumentation): documented instrumentation options, closes #4696 2016-06-03 18:38:19 +02:00
Torkel Ödegaard 064e474b0a Merge branch 'metrics_reporting' 2016-06-03 18:06:41 +02:00
Torkel Ödegaard aef2b6b45f feat(instrumentation): finial polish 2016-06-03 17:15:17 +02:00
Torkel Ödegaard 35a7a3a52b feat(instrumentation): added some more timers 2016-06-03 17:00:39 +02:00
Torkel Ödegaard e0c6048820 feat(instrumentation): added gauge and http endpoint 2016-06-03 16:15:36 +02:00
Torkel Ödegaard ffb12d122f Update ISSUE_TEMPLATE.md 2016-06-03 15:34:08 +02:00
bergquist 6a49d4ed6b feat(alerting): remove orgid from alertrule query 2016-06-03 15:24:53 +02:00
bergquist b08f8bab71 Merge branch 'dakerfp-patch-3' 2016-06-03 15:09:18 +02:00
Torkel Ödegaard 1a05ae2eaa feat(instrumentation): more work 2016-06-03 15:06:57 +02:00
bergquist 961c31a747 test(util): add unit test for string util 2016-06-03 15:06:54 +02:00
bergquist d1a345bb03 Merge branch 'patch-3' of https://github.com/dakerfp/grafana into dakerfp-patch-3 2016-06-03 15:02:46 +02:00
bergquist 2cf797b567 tech(alerting): minor refactoring and code style 2016-06-03 15:01:42 +02:00
Carl Bergquist 236aed112f Merge pull request #5255 from dakerfp/patch-1
Unify signal registration in a single syscall.
2016-06-03 14:59:42 +02:00
bergquist 65eb373808 Merge branch 'master' into alerting_definitions 2016-06-03 13:48:36 +02:00
bergquist 3d7facf6ee fix(cli): fixes broken import 2016-06-03 13:40:48 +02:00
Torkel Ödegaard eee49a4995 feat(instrumentation): added meter, histogram and new timer, timer now send p25, p75, p90, p99 percentiles in 1000 sample exp decaying sample 2016-06-03 12:50:51 +02:00
bergquist 6de1399cf0 fix(cli): fixes broken import 2016-06-03 12:35:17 +02:00
bergquist d0ac258474 Merge branch 'master' into alerting_definitions 2016-06-03 12:22:46 +02:00
bergquist 15aeb4aec2 tech(cli): rename log to logger to separate from server logger 2016-06-03 12:22:30 +02:00
bergquist 5bbfe39f84 tech(alerting): replace goreq with native http 2016-06-03 11:38:56 +02:00
bergquist 9c7e6a2133 feat(alerting): add basic auth support for graphite 2016-06-03 11:07:55 +02:00
Torkel Ödegaard 86f0007768 feat(instrumentation): added influxdb client 2016-06-03 09:18:21 +02:00
Torkel Ödegaard 3065d10931 feat(timing): timing is now working with graphite and influxdb 2016-06-03 09:17:36 +02:00
bergquist eab81a7781 style(alerting): go lint fixes 2016-06-03 09:11:20 +02:00
bergquist 50d98b161c feat(alerting): adds support for retries 2016-06-03 09:04:20 +02:00
bergquist 68f01d57d3 tech(alerting): use range in loops when possible 2016-06-03 08:44:22 +02:00
Torkel Ödegaard 4c4189d631 Update ISSUE_TEMPLATE.md 2016-06-03 08:38:48 +02:00
Torkel Ödegaard 015b409f2f Update ISSUE_TEMPLATE.md 2016-06-03 08:38:07 +02:00
bergquist cc65dd8bcf tech(alerting): use pointers for updating alertjobs 2016-06-03 08:33:53 +02:00
bergquist 910253bc42 tech(alerting): remove datasource ref from alertjob 2016-06-03 07:40:47 +02:00
Torkel Ödegaard e2c794ff31 feat(instrumentation): lots of refactoring to support tag based backend, #4696 2016-06-02 21:06:49 +02:00
Torkel Ödegaard 2a9b51d836 feat(instrumentation): influxdb is working, now need to find a way to better support tags, #4696 2016-06-02 16:56:07 +02:00
bergquist 0bea0cc5b9 feat(alerting): add interface for alert backend 2016-06-02 16:34:25 +02:00
bergquist 510360a509 docs(elastic): updates readme 2016-06-02 14:56:31 +02:00
Torkel Ödegaard 6b2a4fe8e8 feat(instrumentation): work on settings model for internal metrics publishing, #4696 2016-06-02 14:32:17 +02:00
Torkel Ödegaard 49fe90874a Merge branch 'v3.0.x' 2016-06-02 12:09:10 +02:00
Torkel Ödegaard acbaef1907 fix(influxdb): fixed issue with backslash escaping in tag filter, fixes #5249 2016-06-02 12:08:13 +02:00
Torkel Ödegaard 74101eaf7c feat(instrumentation): changed name to senders 2016-06-02 12:04:50 +02:00
Torkel Ödegaard 8ab324988c Merge branch 'v3.0.x' 2016-06-02 09:57:20 +02:00
Torkel Ödegaard 1283461b89 fix(gzip): add plugin proxy to gzip exclusion, fixes #5237 2016-06-02 09:56:53 +02:00
Torkel Ödegaard 38790e2c4b fix(elasticsearch): fixed templating lucene / json escaping issue, fixes #5228, fixes #5227 2016-06-02 09:54:28 +02:00
Carl Bergquist aa718b4dce Merge pull request #5253 from minkikim89/fix_seperate_typo
fixed separate typo
2016-06-02 07:42:04 +02:00
Daker Fernandes Pinheiro 2d09dfd34f Using variadic argument to StringFallback implementation 2016-06-02 01:46:18 -03:00
Daker Fernandes Pinheiro 48e4de823a Unify signal registration in a single syscall. 2016-06-02 01:34:37 -03:00
bergquist 65d8403a04 fix(metrics_reporting): adds missing formating varialbe 2016-06-01 15:16:17 +02:00
bergquist a8ac37f517 feat(usage_metrics): add timer metrics 2016-06-01 15:04:58 +02:00
bergquist b2c0679a7f feat(metrics): initial graphite metrics writer for internal stats 2016-06-01 13:31:11 +02:00
bergquist 69229211b2 fix(alerting): move backend to seperate file 2016-06-01 11:25:29 +02:00
bergquist 4e1f801f6c feat(alerting): add serie name to failed alert description 2016-05-31 21:02:26 +02:00
bergquist 76758d270f feat(alerting): set basic description text of status ok 2016-05-31 20:03:15 +02:00
Carl Bergquist 8db00073b4 Merge pull request #5232 from peggyl/peggyl/fix-tags-popover-text
Fix wording of the dashboard tags popover text
2016-05-31 19:47:24 +02:00
Peggy Li d36c1769e0 Fix wording of the dashboard tags popover text 2016-05-31 17:29:31 +00:00
bergquist 68f148880d feat(alerting): add alert info at log page 2016-05-31 16:26:06 +02:00
bergquist 7c3dbe2a38 chore(alerting): move aggregations into alerting package 2016-05-31 15:29:56 +02:00
bergquist 7224ea5229 chore(alerting): convert alert levels to float 2016-05-31 14:18:12 +02:00
bergquist 338fdcb576 feat(alerting): add copy of AlertRule to AlertResult 2016-05-31 13:27:12 +02:00
bergquist 1ded0b30c2 fix(alerting): fix broken model bind in alerting tab 2016-05-31 13:12:05 +02:00
Carl Bergquist 53ecb4c1ae Merge pull request #5222 from akiomik/patch-1
Fixed assets urls in 500.html
2016-05-31 07:59:24 +02:00
Akiomi KAMAKURA 616dd5c4a5 Fixed assets urls in 500.html 2016-05-31 14:26:13 +09:00
bergquist d1daa2c817 style(alerting): give better info about actual value 2016-05-30 19:21:28 +02:00
bergquist b75631e021 chore(alerting): move alert result to models 2016-05-30 19:08:04 +02:00
bergquist 1498db11a9 feat(alerting): extracts alert rule reading 2016-05-30 18:52:38 +02:00
bergquist c5c261e955 feat(alerting): improve spacing in alerting tab 2016-05-30 17:50:35 +02:00
bergquist 3d5c27df91 test(alerting): add tests for multi serie checks 2016-05-30 14:58:32 +02:00
bergquist 411568351d feat(alerting): revert operand positions 2016-05-30 14:47:59 +02:00
bergquist 2edb0ad94d feat(influxdb): adds spread functionallity
closes #5211
2016-05-30 14:23:24 +02:00
bergquist 077be210da tech(alerting): change interval -> frequency 2016-05-30 09:31:05 +02:00
bergquist 16a9e56eca tech(alerting): change queryrange to int from str 2016-05-30 09:18:22 +02:00
bergquist 51511dd654 feat(alerting): save alert state 2016-05-30 09:03:14 +02:00
bergquist 1686d86c3b Merge branch 'master' into alerting_definitions 2016-05-30 08:26:08 +02:00
Carl Bergquist f8a535c6e8 Merge pull request #5195 from matschaffer/cloudwatch_metric_update_elasticbeanstalk
Add metrics for AWS/ElasticBeanstalk
2016-05-30 08:05:09 +02:00
Carl Bergquist f1bd614770 Merge pull request #5183 from nfnty/master
package.json: Upgrade grunt-contrib-compress, Fixes #5071
2016-05-30 08:02:00 +02:00
Torkel Ödegaard c8965d0f9a feat(export): export will add templatize constant variables 2016-05-28 20:27:44 +02:00
Torkel Ödegaard 53bb264375 Merge branch 'master' into export-dashboard 2016-05-28 17:17:51 +02:00
Torkel Ödegaard 1ea54049d0 feat(templating): added new template variable type constant 2016-05-28 16:59:29 +02:00
Torkel Ödegaard ca8543348b docker(): added collectd system metrics collector that writes to graphite, just for testing 2016-05-28 10:13:51 +02:00
hc4 cf87e8ecf5 Fix parsing of intervals. defined in ms (#5151)
* Fix parsing of intervals. defined in ms

Fix parsing of intervals. defined in ms.
Increase accuracy for sub-second inrevals.
Closes #5008

* Tests for sub-ms intervals

Unit test for https://github.com/grafana/grafana/commit/2034d4b9710b0cb9fd0cdf14aa9981cd0417eda4
2016-05-27 17:26:20 +02:00
Carl Bergquist a6afd85526 Merge pull request #5197 from minkikim89/fixtypo
Fixed type
2016-05-27 16:57:07 +02:00
Torkel Ödegaard 0d4c76a029 feat(import): save gnetId for dashbards imported from grafana.net 2016-05-27 16:42:32 +02:00
Torkel Ödegaard c3708b3096 feat(import): import directly from grafana.net id/url now works 2016-05-27 16:11:05 +02:00
bergquist e80000ce94 tech(alerting): skip if operator does not exist 2016-05-27 15:53:18 +02:00
bergquist 1f990da5c3 tech(alerting): use the timeseries ctor function 2016-05-27 15:51:34 +02:00
bergquist 5f2447976c style(alerting): add note about making timeseries model safer 2016-05-27 15:28:47 +02:00
bergquist 22d8723c1d feat(alerting): generelize aggregator functions 2016-05-27 15:17:48 +02:00
bergquist abc1ae3956 feat(alerting): add timeserie aggregation functions 2016-05-27 14:59:13 +02:00
Torkel Ödegaard 22a7eaf2e7 Merge branch 'master' into export-dashboard 2016-05-27 13:52:53 +02:00
Torkel Ödegaard 540def2c39 feat(import): working on unit tests for import ctrl 2016-05-27 13:52:19 +02:00
bergquist 205afd7212 style(alerting): remove some logging 2016-05-27 12:13:09 +02:00
bergquist 422234d03a feat(alerting): abstract graphite from executor 2016-05-27 12:06:41 +02:00
bergquist 3d66ec816d chore(alerting): minor refactoring 2016-05-27 10:34:44 +02:00
Torkel Ödegaard bf90fbc678 fix(templating): fixed failing templating unit test 2016-05-27 09:23:08 +02:00
Tim Bielawa 2b9d260686 docs(rebuild): Include new http api preferences docs in menus (#5194)
This updates the mkdocs.yml source file such that the HTTP Preferences
API is included in the website navigation bar and in the HTTP API
overview page.

This commit also refreshes the docs/README.md file with more verbose
instructions for building and viewing the documentation locally.

* Original issue: #5069 Document org & user preferences HTTP docs
* Original PR: #5087

Closes #5193
2016-05-27 08:58:42 +02:00
Torkel Ödegaard f6633c8189 feat(export): minor dupe fix 2016-05-27 08:34:12 +02:00
Mat Schaffer 18f704533f Add enhanced elasticbeanstalk metrics 2016-05-27 11:47:53 +09:00
Mat Schaffer aedba5411c Add basic metrics for AWS/ElasticBeanstalk 2016-05-27 11:30:16 +09:00
Torkel Ödegaard e83d13848e Merge branch 'master' into export-dashboard
Conflicts:
	public/app/features/dashboard/submenu/submenu.ts
2016-05-26 14:22:22 +02:00
Torkel Ödegaard 696fad702f Merge branch 'v3.0.x'
Conflicts:
	public/app/features/templating/templateValuesSrv.js
2016-05-26 14:21:17 +02:00
Torkel Ödegaard 724a511995 fix(templating): fixed issue with value being shown instead of it's text representation, fixes #5172 2016-05-26 13:18:02 +02:00
Torkel Ödegaard 90c9c70416 fix(): another fix for panel image rendering 2016-05-26 08:49:55 +02:00
Torkel Ödegaard f8a4661d05 Merge branch 'master' of github.com:grafana/grafana 2016-05-26 08:37:19 +02:00
Torkel Ödegaard dd494e648a fix(rendering): fixed issue with phantomjs panel rendering 2016-05-26 07:45:53 +02:00
bergquist 8ac635b631 style(alerting): change const names 2016-05-26 07:41:23 +02:00
Jared Wiltshire c9d6321f38 Allow for proxying Authorization header and automatically convert (#4832)
Authorization header to X-DS-Authorization in backend_srv.js
2016-05-26 07:13:29 +02:00
Mukesh 4038b4d17e Set active org through admin api (#5179) 2016-05-26 06:51:23 +02:00
nfnty 46551e9d65 package.json: Upgrade grunt-contrib-compress, Fixes #5071 2016-05-26 01:03:22 +02:00
bergquist 957cb407c5 feat(alerting): naiv graphite executor 2016-05-25 17:21:20 +02:00
Torkel Ödegaard 1060eeb197 feat(dashboard): include org id query parameter in dashboard url, #1613 2016-05-25 17:06:41 +02:00
Torkel Ödegaard 201d30a944 fix(export): style fixes and markup fixes for share modal 2016-05-25 13:01:40 +02:00
bergquist b2a4d8083e feat(alerting): add datasource ref to alert rule 2016-05-25 12:57:49 +02:00
Torkel Ödegaard fc2a069180 feat(export): fixed refactoring issue with dynamic dashbord srv 2016-05-25 12:45:52 +02:00
Torkel Ödegaard 392407136d Merge branch 'export-dashboard' of github.com:grafana/grafana into export-dashboard 2016-05-25 12:33:30 +02:00
Torkel Ödegaard ba6573af61 Merge branch 'master' into export-dashboard
Conflicts:
	public/app/features/dashboard/submenu/submenu.ts
2016-05-25 12:32:56 +02:00
Matt Toback 8d988f9582 Export dashboard bulletfactory (#5160)
* create descriptions and styles for share dropdown

* Updating actual modal layout for Sharing

* Updated the modals to follow the new styles, fixed the wrapping issue on the main menu. Standardized buttons.
2016-05-25 12:30:27 +02:00
Torkel Ödegaard f923edc424 Merge branch 'v3.0.x' 2016-05-25 12:29:35 +02:00
Torkel Ödegaard 2712d9ae8b Update latest.json 2016-05-25 12:23:32 +02:00
Torkel Ödegaard 3312a042dd docs(): updated download links 2016-05-25 11:50:00 +02:00
Torkel Ödegaard 5040570ea9 docs(): updated changelog 2016-05-25 11:07:29 +02:00
Torkel Ödegaard f5c5d1b1da Merge branch 'master' of github.com:grafana/grafana 2016-05-25 11:04:27 +02:00
Torkel Ödegaard 2cd6c2e7e0 Merge branch 'v3.0.x' 2016-05-25 11:04:12 +02:00
Torkel Ödegaard 0daadc954c fix(templating): fixed issue with detecting data source variable in other template variable definition, fixes #5165 2016-05-25 10:46:55 +02:00
bergquist ec98b7d672 docs(changelog): add note about fix for 5167 2016-05-25 10:01:49 +02:00
bergquist 8c2b6b532d fix(preferences): fixes broken default home dashboard
closes #5167
2016-05-25 09:56:45 +02:00
Torkel Ödegaard 71d62012e1 fix(panel): fixed issue with fullscreen panel view and switching to another dashboard, fixes #5163 2016-05-25 09:46:15 +02:00
Torkel Ödegaard 41deea90ee feat(dashboard): template variable changes updates url, closes #5002 2016-05-24 16:34:17 +02:00
Torkel Ödegaard a81806d3d0 feat(dashboard): sync time range with url, closes #458 2016-05-24 16:32:28 +02:00
bergquist 0f58f8a679 feat(alerting): add timeout handler for check execution 2016-05-24 10:30:39 +02:00
Torkel Ödegaard 5607a114f9 updated changelog 2016-05-24 09:53:28 +02:00
Torkel Ödegaard e81614b9e9 Merge branch 'v3.0.x' 2016-05-24 09:50:41 +02:00
Torkel Ödegaard 6f094ef215 fix(templating): fixed issue with nested template variables and multi select, the child variable selection state is now updated like single select variables, so if none matches the first option is selected, fixes #4861 2016-05-24 09:50:23 +02:00
Torkel Ödegaard 366baea099 docs(): updated changelog 2016-05-24 08:14:40 +02:00
Torkel Ödegaard dc9dcd045d Merge branch 'master' of github.com:grafana/grafana 2016-05-24 08:11:52 +02:00
Torkel Ödegaard 10c47ee27c feat(footer): some minor changes to footer to make it look good in light theme, closes #4889 2016-05-24 08:11:28 +02:00
Torkel Ödegaard 8f0240a295 Merge branch 'footer' 2016-05-24 07:53:13 +02:00
Torkel Ödegaard fd08c821f9 Merge branch 'v3.0.x'
Conflicts:
	package.json
2016-05-24 07:52:27 +02:00
Torkel Ödegaard c41c771e9a fix(home dashboard): fixed handling error when default dashboard is not found, fixes #5141 2016-05-24 07:39:58 +02:00
bergquist 448ee5812c feat(alerting): make sure the map contains the responding alert 2016-05-24 07:24:45 +02:00
Zdenek Styblik fff5aa3020 Add missing option Read-Only Editor to auto_assign_org_role description (#5139)
Commit adds missing option `Read-Only Editor` to `auto_assign_org_role` description.
2016-05-23 21:24:23 +02:00
Torkel Ödegaard f1ec270e3e bumped version to 3.0.4 2016-05-23 21:24:02 +02:00
Torkel Ödegaard a3f2f574c6 fix(singlestat): fixed Gauge positioning issue, fixes #5143 2016-05-23 21:23:31 +02:00
Utkarsh Bhatnagar ec19a97156 [Bug Fix] #5136 (#5142) 2016-05-23 21:00:06 +02:00
Torkel Ödegaard 9a7817a271 Merge branch 'master' into footer
Conflicts:
	pkg/api/frontendsettings.go
2016-05-23 20:59:23 +02:00
Utkarsh Bhatnagar 8a0d5aa38d [Bug Fix] #5136 (#5142) 2016-05-23 20:58:21 +02:00
Trent White a52869507e hide footer on non-dashboard pages 2016-05-23 12:46:13 -04:00
Torkel Ödegaard c77d72b29f feat(prometheus): progress on new prometheus query editor, #5117 2016-05-23 18:03:17 +02:00
Trent White 76d18e7156 remove height: 100% on .main-view 2016-05-23 11:45:54 -04:00
bergquist 7229fb7a76 tech(alerting): change from array to map 2016-05-23 17:04:57 +02:00
bergquist 77ec575b46 tech(alerting): fixes broken unit-tests 2016-05-23 14:51:41 +02:00
bergquist 9d500df2bb chore(alerting): remove redundant code 2016-05-23 14:36:24 +02:00
bergquist 9f8c67e352 feat(alerting): only start unfinnished jobs 2016-05-23 14:14:02 +02:00
Torkel Ödegaard 9e6056551d docs(): updated download links 2016-05-23 14:13:30 +02:00
Torkel Ödegaard bbea698af3 Update latest.json 2016-05-23 12:30:46 +02:00
bergquist cb21bf41b0 tech(alerting): split code into different files 2016-05-23 12:15:36 +02:00
bergquist b496b6a252 test(alerting): add test for alertjob selection 2016-05-23 12:04:34 +02:00
Torkel Ödegaard 9eec68985d docs(): updated download links 2016-05-23 11:49:07 +02:00
bergquist 4fce82344e feat(alerting): async exeuction on a shoestring 2016-05-23 11:47:41 +02:00
bergquist f95fa51322 feat(alerting): make rule execution async 2016-05-23 11:17:07 +02:00
Torkel Ödegaard cd82f579bd docs(): updated changelog 2016-05-23 11:08:08 +02:00
Torkel Ödegaard 93665f49b1 Merge branch 'v3.0.x' 2016-05-23 11:06:53 +02:00
bergquist a7fcb3a2cc feat(alerting): add dummie executor 2016-05-23 10:59:28 +02:00
Torkel Ödegaard dc77d555f9 fix(elasticsearch): fixed templating issue with elasticsearch, fixes #5135 2016-05-23 10:58:31 +02:00
Torkel Ödegaard dfe3806d01 fix(elasticsearch): fixed query editor issue with elasticsearch 2016-05-23 10:14:40 +02:00
bergquist f05cae23d2 feat(alerting): alert rule selector 2016-05-23 10:07:04 +02:00
Torkel Ödegaard cfc7710205 docs(): changelog updated 2016-05-23 09:31:52 +02:00
Torkel Ödegaard c60d737928 Merge branch 'v3.0.x'
Conflicts:
	package.json
2016-05-23 09:29:14 +02:00
Torkel Ödegaard 1da149d9e1 feat(annotations): annotations can now use a template variable as data source, closes #5054 2016-05-23 09:28:14 +02:00
bergquist 411178d384 tech(alerting): disable feature toggle
this feature toggle caused migration tests to fail
2016-05-23 08:24:10 +02:00
bergquist 45b2b4bc52 feat(alerting): add feature toggles for alerting functions 2016-05-23 08:00:42 +02:00
Torkel Ödegaard 43ba563a1c fix(logging): change log level to trace for plugin proxy logging call, fixes #5126 2016-05-23 07:55:55 +02:00
minki 05cb6048ae fixed separate typo 2016-05-23 09:32:18 +09:00
minki 70d6b32e14 Fixed type 2016-05-22 05:38:57 +09:00
Trent White 75940c1f5d turn watch all back on 2016-05-21 13:21:31 -04:00
Mitsuhiro Tanda 1d27a7f93d (cloudwatch) fix wrong cache key of credentials (#5124) 2016-05-21 09:02:04 +02:00
Trent White cffcc4c7a5 make footer unordered list. add new icons. 2016-05-20 16:44:19 -04:00
Trent White c727c3c441 resize and color of links 2016-05-20 15:58:14 -04:00
Torkel Ödegaard fb4dc77f36 docs(): updated changelog with 3.0.3 fixes 2016-05-20 15:26:19 +02:00
Torkel Ödegaard 9eb7b192b8 Merge branch 'master' of github.com:grafana/grafana 2016-05-20 15:16:05 +02:00
Torkel Ödegaard 06d63dda6e Merge branch 'v3.0.x' 2016-05-20 15:15:30 +02:00
Torkel Ödegaard e6f251011f fix(panel span): fixed issue setting panel span while in fullscren and also an issue when changing repeat variable while in fullscreen view, fixes #4957 2016-05-20 15:15:02 +02:00
Torkel Ödegaard 6a813aa33d fix(export): better error handling 2016-05-20 14:45:22 +02:00
bergquist 9d016a2756 feat(alerting): add migration for create and update 2016-05-20 14:23:24 +02:00
David J. Felix 441682b598 Fix linking for /dashboard-solo/ proxy prefix (#5116)
Fixes #5109
2016-05-20 14:01:12 +02:00
Mitsuhiro Tanda 9c672f6ec1 (prometheus) support new legend format (with backward compatibility) (#5096)
* (prometheus) support new legend format (with backward compatibility)

* (prometheus) use regex replace for legend format

* (prometheus) allow white space
2016-05-20 12:29:10 +02:00
Torkel Ödegaard 35c05463e7 Merge branch 'v3.0.x' 2016-05-20 12:23:50 +02:00
Torkel Ödegaard f00cbc0aeb fix(panel height): fixed issue with singlestat height, fixes #4679, fixes #4894, fixes #5113 2016-05-20 12:23:26 +02:00
Torkel Ödegaard ee86d24797 fix(elasticsearch): minor editor layout fix 2016-05-20 10:31:22 +02:00
Torkel Ödegaard 58a9324db0 Merge branch 'v3.0.x' 2016-05-20 10:24:54 +02:00
Torkel Ödegaard e0e8fd6637 fix(templating): fixed handling of numeric values in tempalting query results, fixes #5097 2016-05-20 10:24:24 +02:00
Torkel Ödegaard 2416ee04c8 fix(templating): fixed detection of nested template variables, fixes #5103 2016-05-20 09:58:07 +02:00
Torkel Ödegaard 91c6ebb06c Merge branch 'v3.0.x' 2016-05-20 09:06:39 +02:00
Torkel Ödegaard df0ddc0b50 fix(prometheus): fixed bug in prometheus query editor, fixes #5107 2016-05-20 09:03:52 +02:00
Torkel Ödegaard 2e02abffc0 fix(render): fixed issue with image renderer caused by disabling angular debug info 2016-05-20 08:34:35 +02:00
Torkel Ödegaard e47957ce6d Merge branch 'master' of github.com:grafana/grafana 2016-05-20 08:32:40 +02:00
Torkel Ödegaard c54e688272 Merge branch 'v3.0.x' 2016-05-20 08:31:51 +02:00
Torkel Ödegaard 37821e6d63 fix(share modal): fixed link in share modal when sub app url is /dashboard/, fixes #5109 2016-05-20 08:31:27 +02:00
Torkel Ödegaard a3ee388b66 Merge branch 'master' into query-part-refactor 2016-05-19 14:52:18 +02:00
Torkel Ödegaard 855e913bbd feat(dashboards): began work on dashboard list 2016-05-19 11:03:10 +02:00
Richard Hartmann 78360ece8a ISSUE_TEMPLATE.md: Improve wording and fix typos (#5101) 2016-05-19 10:59:38 +02:00
Richard Hartmann 7c46423727 ISSUE_TEMPLATE.md: Fix typo (#5099) 2016-05-19 10:34:12 +02:00
Torkel Ödegaard fb74d10573 feat(export): added grafana version to requires array, #5084 2016-05-19 10:21:16 +02:00
Torkel Ödegaard 430bcf192f feat(export): templetize annotations and template vars, #5084 2016-05-19 10:01:31 +02:00
Torkel Ödegaard cac723dab3 Merge branch 'master' into export-dashboard 2016-05-19 08:48:24 +02:00
bergquist 402499c071 Merge branch 'master' into alerting_definitions 2016-05-19 08:47:34 +02:00
bergquist 617d18e587 feat(panel): active tab is now placed in querystring aswell 2016-05-19 08:42:21 +02:00
bergquist a379b0057a feat(alerting): link to dashboard goes directly to alerting tab 2016-05-19 08:13:20 +02:00
bergquist ef4f5147be Merge branch 'master' into alerting_definitions 2016-05-19 08:05:35 +02:00
bergquist 2b06ceda71 feat(panels): adds queryparameter for choose active tab in edit mode 2016-05-19 08:00:48 +02:00
Torkel Ödegaard 1bb4ca22e7 fix(test): fixed failing unsaved changes test 2016-05-19 07:58:44 +02:00
Tim Bielawa 24a410ae8f docs(preferences): Document user and org preferences (#5087)
closes #5069
2016-05-18 18:31:59 +02:00
Torkel Ödegaard 673984a7db feat(export): more export stuff 2016-05-18 15:53:13 +02:00
Torkel Ödegaard 10339090b8 fix(annotations): fixed annotation error handling, fixes #5077 2016-05-18 15:22:40 +02:00
Torkel Ödegaard b6dcf6bd02 Merge branch 'v3.0.x' 2016-05-18 14:23:59 +02:00
Torkel Ödegaard 280e7bb04d Merge branch 'master' of github.com:grafana/grafana 2016-05-18 14:23:41 +02:00
Torkel Ödegaard 03551a5961 Merge remote-tracking branch 'origin/development' 2016-05-18 14:23:21 +02:00
Torkel Ödegaard d474eba53a fix(logging): fixed reading config level from config file, fixes #5079 2016-05-18 14:18:08 +02:00
Mitsuhiro Tanda 392cb2a714 (cloudwatch) update changelog (#5080)
* update cloudwatch.md

* update changelog
2016-05-18 13:27:19 +02:00
bergquist 92ac370415 tech(docker): rename fake data writers 2016-05-18 12:29:37 +02:00
Torkel Ödegaard c41e3dcb91 updated changelog 2016-05-18 12:04:37 +02:00
Torkel Ödegaard 602d1a5fbc Merge branch 'v3.0.x' 2016-05-18 12:02:53 +02:00
Torkel Ödegaard cd80884b76 fix(dashboard timepicker): fixed issue with time picker and UTC when reading time from url, fixes #5078 2016-05-18 12:01:11 +02:00
Torkel Ödegaard bfadc932d7 Merge branch 'master' of github.com:grafana/grafana 2016-05-18 11:50:56 +02:00
Torkel Ödegaard 0cd2e150d5 feat(snapshots): performance improvements to deep clone, makes snapshot's a lot quicker for big dashboards with a lot of panels and data 2016-05-18 11:50:40 +02:00
Carl Bergquist 5aaaeb05a0 Merge pull request #5075 from mtanda/prometheus_templating_fix
(prometheus) fix metric find query
2016-05-18 11:40:33 +02:00
Torkel Ödegaard 26ea0bc360 feat(export): work on export 2016-05-18 11:11:53 +02:00
Mitsuhiro Tanda a86d218891 (prometheus) fix metric find query 2016-05-18 16:36:57 +09:00
Torkel Ödegaard 6632f883c0 Merge branch 'master' into export-dashboard
Conflicts:
	.floo
	.flooignore
2016-05-18 08:08:15 +02:00
Mitsuhiro Tanda 66bcae353c (prometheus) pass dashboard time range to template query (#5007)
* (prometheus) pass dashboard time range to template query

* (prometheus) add passing time test of templating
2016-05-18 07:56:23 +02:00
Mitsuhiro Tanda 07d355851e (cloudwatch) assume role support (#5065)
* (cloudwatch) assume role support

* save godep

* (cloudwatch) add assumeRoleArn field

* (cloudwatch) set cred provider for sts

* (cloudwatch) fix test
2016-05-18 07:54:24 +02:00
Mitsuhiro Tanda 8d2f350ad1 (prometheus) fix prometheus link 2016-05-18 07:50:30 +02:00
Mitsuhiro Tanda fc1891320e (prometheus) fix prometheus link (#5074) 2016-05-18 07:49:32 +02:00
Utkarsh Bhatnagar 8a9455d901 Fixed singlestat mapping typo (#5070) 2016-05-18 07:44:01 +02:00
Torkel Ödegaard 46b6ab7db7 Merge branch 'master' of github.com:grafana/grafana 2016-05-17 21:51:31 +02:00
Torkel Ödegaard 958f97232f fix(pluginlist): fixed issue with plugin list, fixes #5068 2016-05-17 21:51:19 +02:00
Torkel Ödegaard 05d064ca8d export(): moved to share modal 2016-05-17 21:18:47 +02:00
Carl Bergquist 47f88346d2 Merge pull request #5058 from hijklmno/master
Add dBm as an option in energy units
2016-05-17 15:57:05 +02:00
bergquist b5fc12fb80 docs(opentsdb): add working image of add datasource for opentsdb
closes #4984
2016-05-17 15:32:33 +02:00
Torkel Ödegaard 83f5080274 feat(angular): disable debug in production for angular compiler 2016-05-17 15:00:48 +02:00
Torkel Ödegaard c133a00125 feat(alerting): minor progress on scheduler 2016-05-17 14:31:52 +02:00
Torkel Ödegaard df50fa2332 feat(export): export dashboard modal 2016-05-17 11:17:11 +02:00
Torkel Ödegaard ad7a1e15b4 feat(export): began working on export modal 2016-05-17 10:29:57 +02:00
bergquist efe6fd154b tech(docker): add default writer for influxdb 2016-05-17 09:03:52 +02:00
bergquist fb8296524e tech(docker): add default fake-data-gen for prometheus 2016-05-17 09:03:52 +02:00
Torkel Ödegaard 00957a42d4 Merge branch 'v3.0.x' 2016-05-17 08:40:28 +02:00
Torkel Ödegaard 99db89067e fix(): reverted RESTART_ON_UPGRADE change 2016-05-17 08:34:34 +02:00
hijklmno f1b5a265ab fix trailing whitespace in kbn.js 2016-05-16 15:35:42 -07:00
hijklmno 451e917e7d Add dBm as an option in energy units 2016-05-16 15:24:31 -07:00
Torkel Ödegaard d443079cf6 fix(): fixed sass issue 2016-05-16 18:48:13 +02:00
Torkel Ödegaard 163e55c0eb Update latest.json 2016-05-16 18:07:42 +02:00
bergquist fa19e0d9c6 style(modal): use standard valid styles 2016-05-16 17:03:01 +02:00
bergquist 6435fa6b99 fix(modal): add undefined check 2016-05-16 16:48:28 +02:00
bergquist 8dbb5bad4b test(alerting): fix broken unit tests 2016-05-16 16:20:28 +02:00
Torkel Ödegaard 77b7cdfadb feat(alerting): added few fields to alert rule 2016-05-16 15:39:09 +02:00
bergquist 2ce9d4571c fix(alerting): fix spacing 2016-05-16 14:29:54 +02:00
Torkel Ödegaard 495404ef73 Merge branch 'master' into alerting_definitions 2016-05-16 14:12:56 +02:00
Torkel Ödegaard 09f11cf66e updated 2016-05-16 14:11:55 +02:00
Torkel Ödegaard 4ea3002572 added floobits stuff 2016-05-16 14:02:34 +02:00
Torkel Ödegaard 840cd7b2e1 doc(): updated changelog 2016-05-16 13:58:38 +02:00
Torkel Ödegaard 0760528f4a Merge branch 'v3.0.x' 2016-05-16 13:57:44 +02:00
Torkel Ödegaard 7f0fe31881 docs(): updated download links 2016-05-16 13:41:50 +02:00
Mitsuhiro Tanda f585d22ce7 (templating) update dynamic dashboard only if variable is changed 2016-05-16 19:26:24 +09:00
bergquist 80f7fe8646 feat(alerting): add confirm text dialog when deleting dashboards with alerts 2016-05-16 11:54:28 +02:00
Torkel Ödegaard 2be8658034 Merge remote-tracking branch 'origin/development' 2016-05-16 11:40:12 +02:00
Torkel Ödegaard 494bee1d6b bumped version 2016-05-16 11:39:16 +02:00
bergquist 31698a1c55 Merge branch 'master' into alerting_definitions 2016-05-16 09:28:14 +02:00
Torkel Ödegaard 7cd663bbe8 feat(import): more import work 2016-05-14 10:00:43 +02:00
Torkel Ödegaard d9d46096dd feat(import): lots of work on dashboard import 2016-05-13 17:39:22 +02:00
bergquist da68f7d31a feat(docker): fake data writer for opentsdb 2016-05-13 16:53:28 +02:00
bergquist 41ed0e670a feat(docker): fake data writer for graphite 2016-05-13 16:25:03 +02:00
bergquist 579b36754a Merge branch 'master' into development 2016-05-13 14:30:47 +02:00
bergquist 9e5a8c3fc8 docs(changelog): add info about configurable theme 2016-05-13 11:38:54 +02:00
Carl Bergquist 83707f7b35 Merge pull request #5011 from acmnu/default_theme
Add new parameter to config: default_theme.
2016-05-13 11:36:32 +02:00
Torkel Ödegaard ca8df67947 feat(import): things are starting to work 2016-05-13 11:26:02 +02:00
Mitsuhiro Tanda 3b85901b95 reflect panel repeat status when variable updated 2016-05-13 16:29:11 +09:00
Anton Chevychalov c6744925c4 Add new parameter to config: default_theme. 2016-05-12 18:21:11 +03:00
bergquist 88b2f48493 Merge branch 'master' into development 2016-05-12 16:22:18 +02:00
Torkel Ödegaard 0d3e06e68a feat(wizard): merged wizard poc 2016-05-12 14:45:32 +02:00
Torkel Ödegaard bf890719ff Merge remote-tracking branch 'origin/wizard' into export-dashboard2 2016-05-12 10:52:24 +02:00
Torkel Ödegaard 28eae1e7ff Merge branch 'master' into export-dashboard
Conflicts:
	packaging/publish/publish.sh
	public/app/features/dashboard/dynamicDashboardSrv.js
	public/test/specs/dynamicDashboardSrv-specs.js
2016-05-12 10:50:37 +02:00
Torkel Ödegaard 2c7447eaca feat(): started work on new import system 2016-05-11 16:18:52 +02:00
Torkel Ödegaard b170b6ec8b feat(query part): moved query part editor from influxdb to core 2016-05-11 14:52:44 +02:00
bergquist e69658128c docs(alerting): change api url layout 2016-05-11 14:08:45 +02:00
bergquist c76c2f30a8 tech(alerting): add default values for alerts 2016-05-11 13:04:03 +02:00
bergquist b58be91e71 feat(alerting): add delete button for removing alerts 2016-05-11 11:11:45 +02:00
bergquist 18bf2b2391 docs(alerting): add syles for optional params 2016-05-11 10:47:51 +02:00
Torkel Ödegaard 5b42753b8b feat(export): progress on dashboard export 2016-05-10 21:09:15 +02:00
Torkel Ödegaard 79a8017fe9 feat(export): more progress on dashboard export 2016-05-10 20:31:47 +02:00
Leandro Piccilli 0d34740a62 Add support to ElasticSearch 5.0 2016-05-10 19:38:22 +02:00
Torkel Ödegaard db664c61a4 Merge branch 'master' into export-dashboard 2016-05-10 16:46:58 +02:00
bergquist dd47f7382a docs(alerting): initial info 2016-05-10 16:40:46 +02:00
bergquist 33108df13f docs(conf): add warning about alerting in conf file 2016-05-10 16:32:20 +02:00
Torkel Ödegaard cca37caf33 feat(prometheus): began work on prometheus query model 2016-05-10 15:48:07 +02:00
bergquist 1fe2055743 tech(alerting): disable DEL for alert rules in the api 2016-05-10 15:02:11 +02:00
Torkel Ödegaard 4358687bfa Merge branch 'master' into query-part-refactor 2016-05-10 14:38:49 +02:00
Torkel Ödegaard d3bbc245c9 feat(query_part): began query part refactor to be able to reuse it in prometheus query editor 2016-05-10 14:32:25 +02:00
bergquist 5ee1b6ca97 docs(changelog): add note about merged PR 2016-05-10 12:54:25 +02:00
Carl Bergquist c522341136 Merge pull request #4944 from Gueust/optional_tooltip_ordering
Add optional tooltip ordering (against the development branch)
2016-05-10 12:51:44 +02:00
bergquist 2cebe151f2 Merge branch 'master' into development 2016-05-10 12:40:17 +02:00
bergquist 1bb8bc58b8 feat(alerting): add parameteters for filtering alerts 2016-05-10 09:45:56 +02:00
bergquist b8421a478f feat(alerting): move state filter to the right 2016-05-10 08:26:40 +02:00
bergquist 2ddffc8234 feat(alerting): add support for multiple state in ui 2016-05-09 16:32:35 +02:00
bergquist b2cf2e877a test(alerting): improve unit test 2016-05-09 15:19:11 +02:00
bergquist 9da2e6e907 feat(alerting): update path 2016-05-09 15:17:26 +02:00
bergquist 1be513fabd feat(alerting): add support for alert page filter 2016-05-09 14:44:44 +02:00
bergquist 3e462f2914 chore(alerting): style refactoring 2016-05-09 12:10:53 +02:00
bergquist 35c73902da Merge branch 'master' into alerting_definitions 2016-05-09 11:34:56 +02:00
bergquist 47070f2d1f chore(alerting): struct names and url refactoring 2016-05-09 11:25:21 +02:00
bergquist 74d5410a38 feat(alerting): add inital doc page 2016-05-06 15:59:38 +02:00
bergquist 27274f37e8 feat(alerting): update paths for alert state 2016-05-06 14:37:41 +02:00
bergquist 26941284da feat(alerting): add limit and since id options for alert logs 2016-05-04 09:57:53 +02:00
bergquist 7757d6d636 feat(alerting): set default title for alerts 2016-05-04 08:22:44 +02:00
bergquist 2ccb3956a6 feat(alerting): set default value for query 2016-05-03 17:55:41 +02:00
bergquist 1624dc9dfd feat(alerting): separate operator and level 2016-05-03 17:31:04 +02:00
bergquist 27c34745a6 feat(alerting): add link to alerts in side menu 2016-05-03 16:46:10 +02:00
Torkel Ödegaard bb6f4fff87 feat(export/import): minor progress 2016-05-03 16:40:21 +02:00
bergquist 4ea0e6ca93 feat(alerting): remove delete option from alerts page 2016-05-03 16:39:52 +02:00
bergquist 3c7e793c1f feat(alerting): add color to alert state icons 2016-05-03 16:36:49 +02:00
bergquist b0a16a9e6b Merge branch 'master' into alerting_definitions 2016-05-03 14:32:31 +02:00
bergquist 02ae1f79f7 docs(changelog): add node about range to text mappings in singlestat 2016-05-03 10:42:01 +02:00
Torkel Ödegaard f42b47e65b Merge branch 'master' into export-dashboard
Conflicts:
	public/app/features/dashboard/dashnav/dashnav.ts
2016-05-03 10:26:40 +02:00
Torkel Ödegaard de26a17dc7 feat(footer): began work on page footer 2016-05-03 09:00:58 +02:00
bergquist 1c082670c4 feat(alerting): make alertname link to status page 2016-05-02 18:06:17 +02:00
bergquist 7c5c7c6f32 feat(alerting): renames go to dashboard -> edit 2016-05-02 18:02:33 +02:00
bergquist bac89775e2 tech(alerting): fixes broken refactoring 2016-05-02 18:00:10 +02:00
bergquist 9083392341 feat(alerting): to straight for panel in alert link 2016-05-02 17:37:08 +02:00
bergquist b606d9b7da test(alerting): fixes broken test 2016-05-02 16:27:02 +02:00
bergquist 743a6fa37c feat(alerting): add support for deleting alert rules 2016-05-02 16:07:19 +02:00
bergquist a573d2504c feat(alerting): pixels have been pushed 2016-05-02 15:37:18 +02:00
bergquist 05459de344 feat(alerting): add gf icons for alerts page 2016-05-02 15:31:40 +02:00
bergquist 3eab0cde70 feat(alerting): add gf icons for alert state page 2016-05-02 15:20:58 +02:00
bergquist 9c5b4e6f25 feat(alerting): auto convert thresholds if existing 2016-05-02 14:41:29 +02:00
bergquist bc892789c1 feat(alerting): change state from ALERT to CRITICAL 2016-05-02 14:33:38 +02:00
bergquist ca959d1ab0 Merge branch 'master' into alerting_definitions 2016-05-02 13:22:58 +02:00
bergquist de5a39f320 Revert "Revert "Merge branch 'utkarshcmu-rangeMaps'""
This reverts commit 58b91befde.
2016-05-02 13:17:57 +02:00
Jean-Baptiste Lespiau c555bbce3d Add optional tooltip ordering 2016-05-01 01:32:36 +02:00
bergquist de7544fabd fix(alerting): set alertin enabled to false 2016-04-29 15:40:16 +02:00
Torkel Ödegaard f8b4fcdc42 Merge branch 'master' into export-dashboard
Conflicts:
	packaging/publish/publish.sh
2016-04-29 15:01:47 +02:00
Torkel Ödegaard 2546ec062b Merge branch 'master' into dash-edit-mode
Conflicts:
	public/app/features/dashboard/partials/settings.html
2016-04-29 14:50:17 +02:00
bergquist 6d66d9f42d feat(alerting): adds fearture toogle for alerting 2016-04-29 14:35:58 +02:00
Lucas Costa 9b84b88518 Add support to Elasticsearch precision_threshold 2016-04-28 19:23:45 -03:00
bergquist bd30a4d23e Merge branch 'master' into alerting_definitions 2016-04-28 16:04:28 +02:00
bergquist 16cede30f6 feat(alerting): move alertingtab to seperate directive 2016-04-28 16:03:14 +02:00
bergquist f442adca47 feat(alerting): adds api endpoints for alerts per dashboard and panel 2016-04-28 15:13:42 +02:00
bergquist 1f414c1372 test(alerting): add test that validates rule updates do not change state 2016-04-28 11:47:14 +02:00
bergquist ecfbc2edca feat(alerting): adds alert history page 2016-04-28 11:42:03 +02:00
bergquist 5bc3672296 Merge branch 'master' into alerting_definitions 2016-04-28 11:03:33 +02:00
bergquist 0f0fa0c257 feat(alerting): adds endpoint for getting alert states log 2016-04-28 10:59:46 +02:00
bergquist 3ecc13506c feat(alerting): adds alert state go ui 2016-04-28 08:53:34 +02:00
bergquist 1631673485 feat(alerting): dont change state when updating alert definitions 2016-04-28 08:42:51 +02:00
bergquist e7be7d2835 feat(alerting): add api endpoint for alert state 2016-04-28 08:23:50 +02:00
bergquist 6a5ecb3fca feat(alerting): adds basic page for listing alerts 2016-04-27 13:02:28 +02:00
bergquist 3cf6532515 feat(alerting): add json encoding name for properties 2016-04-27 11:44:04 +02:00
bergquist 44dd98e277 tech(alerting): rename alerting sql server 2016-04-27 09:25:11 +02:00
bergquist 7041169ffb feat(alerting): add datasource name field 2016-04-27 09:06:19 +02:00
bergquist 973db1ac38 feat(alerting): add api route for alert changes 2016-04-27 08:59:33 +02:00
bergquist 2e097f4af1 Merge branch 'master' into alerting_definitions 2016-04-26 17:38:29 +02:00
bergquist 9b50313f11 feat(alerting): add api endpoints for listing alerts 2016-04-26 17:36:50 +02:00
bergquist 996eec3ce2 tech(alerting): refactored save alerts code 2016-04-26 16:31:13 +02:00
bergquist 55e83a3d62 feat(alerting): rename alerting dashboard names 2016-04-26 16:06:29 +02:00
bergquist 3ef2be13df feat(alerting): move alert deletion to alert code 2016-04-26 15:48:29 +02:00
bergquist bb42579b0f Merge branch 'master' into alerting_definitions 2016-04-25 16:42:33 +02:00
bergquist ddd826616b feat(alerting): serialize whole target obj from dashboard 2016-04-25 16:38:27 +02:00
bergquist 25f6ec8b53 feat(alerting): add support for alert_rule updates 2016-04-25 16:18:28 +02:00
bergquist c83af353b2 feat(alerting): renames alert table to alert_rule 2016-04-25 14:42:24 +02:00
bergquist 8ca7ccae38 feat(alerting): add functionallity for converting tresholds to alerts 2016-04-25 14:18:45 +02:00
bergquist f167ce19ab test(alerting): add test for deleting alerts 2016-04-25 13:00:05 +02:00
bergquist bdd3e2ad73 Merge branch 'master' into alerting_definitions 2016-04-25 11:22:35 +02:00
bergquist 5d5999561a test(dashboard): add failing test for deleting dashboards 2016-04-25 08:46:15 +02:00
bergquist 44310921b5 test(alerting): add commented failed test 2016-04-25 08:34:48 +02:00
bergquist 03e6fc951f feat(alerting): delete alerts when dashboard gets deleted 2016-04-23 14:14:18 +02:00
bergquist ec6dbe3067 tests(alerting): connect alerts to dashboard 2016-04-23 10:41:50 +02:00
bergquist 84115c8038 feat(alerting): delete alerts when panels are removed 2016-04-22 17:49:50 +02:00
bergquist 8bb62a79d0 feat(alerting): excisting alerts are now updated 2016-04-22 16:51:24 +02:00
bergquist ba5978abd3 Merge branch 'master' into alerting_definitions 2016-04-22 15:52:56 +02:00
bergquist d21f97e69b feat(alerting): adds basic alerting tab 2016-04-21 11:47:30 +02:00
bergquist 96e88ee84d refactor(alerting): changes interval to string from int 2016-04-20 16:57:03 +02:00
bergquist 262821e7e7 feat(alerting): tests that alertes can be read from db 2016-04-20 16:46:24 +02:00
bergquist ef92fd4ebc feat(alerting): renames error_level to crit_level 2016-04-20 15:02:49 +02:00
bergquist 7860a2a1b8 feat(alerting): make sure dashboard id exists 2016-04-20 09:55:32 +02:00
Mitsuhiro Tanda ab9abee67b (cloudwatch) add test for interval variable 2016-04-20 01:27:44 +09:00
bergquist ca3ad7d17c tests(alerting): add tests for saving alerts 2016-04-19 16:52:20 +02:00
Mitsuhiro Tanda 2e5a1328a8 (cloudwatch) support interval template variable 2016-04-19 22:57:34 +09:00
bergquist 832e38af34 feat(alerting): limit alerts to one per panel 2016-04-19 15:34:23 +02:00
bergquist daa5468801 feat(alerting): parses dashboard alerts 2016-04-18 14:15:03 +02:00
bergquist 769016783f feat(alerting): add aggregator field 2016-04-18 11:10:52 +02:00
bergquist bcf10a6483 Merge branch 'master' into alerting_definitions 2016-04-18 10:28:40 +02:00
Matt Toback a7e8e64d78 The beginnings of the build mode and rows 2016-04-15 19:52:18 -04:00
Torkel Ödegaard 5f6ecac3f9 poc(editmode): experimental edit mode 2016-04-15 15:11:40 -04:00
Torkel Ödegaard 0f71838fdf feat(dash export): dashboard export can now replace datasource names with variable and add inputs section 2016-04-14 21:13:01 -04:00
Torkel Ödegaard 4d0b14fbb4 feat(exporter): stared work on dashboard exporter that cleans up repeated panels etc 2016-04-14 17:31:34 -04:00
Torkel Ödegaard 1f9922a5aa refactor(): moved dashboard_srv and DashboardCtrl to typescript 2016-04-14 16:53:19 -04:00
bergquist 91a1a823e2 feat(alerting): add basic tables for alerting definitions 2016-04-13 10:33:45 +02:00
Torkel Ödegaard 75649c49d5 Merge branch 'master' into wizard 2016-04-11 18:18:09 -04:00
Adrian Lopez 9fbb1214ae Allow to show multiple tags with annotations with InfluxDB datasource 2016-04-04 16:57:34 +02:00
Valeriy Simonov 8bf4d3fb7f Merge remote-tracking branch 'refs/remotes/grafana/master' 2016-03-31 15:54:00 +05:00
Torkel Ödegaard 437b880b3e feat(plugins): work on setup wizard started 2016-03-25 22:14:29 +01:00
Shani Elharrar f121e8309d ElasticSearch Terms & Date Histogram: Support 'missing' setting 2016-03-03 22:34:28 +02:00
3223 changed files with 327193 additions and 113023 deletions
+1 -1
View File
@@ -2,7 +2,7 @@
root = true
[*.go]
indent_style = tabs
indent_style = tab
indent_size = 2
charset = utf-8
trim_trailing_whitespace = true
+3
View File
@@ -0,0 +1,3 @@
{
"url": "https://floobits.com/raintank/grafana"
}
+12
View File
@@ -0,0 +1,12 @@
#*
*.o
*.pyc
*.pyo
*~
extern/
node_modules/
tmp/
data/
vendor/
public_gen/
dist/
+3 -3
View File
@@ -12,11 +12,11 @@ grunt karma:dev
### Run tests for backend assets before commit
```
test -z "$(gofmt -s -l . | grep -v Godeps/_workspace/src/ | tee /dev/stderr)"
test -z "$(gofmt -s -l . | grep -v -E 'vendor/(github.com|golang.org|gopkg.in)' | tee /dev/stderr)"
```
### Run tests for frontend assets before commit
```
grunt test
godep go test -v ./pkg/...
npm test
go test -v ./pkg/...
```
+10 -12
View File
@@ -1,20 +1,18 @@
Thank you! For helping us make Grafana even better.
Please prefix your title with [Bug] or [Feature request]
For question please check [Support Options](http://grafana.org/support/). **Do not** open a github issue
To help us respond to your issues faster, please make sure to add as much information as possible.
If this issue is about a plugin, please open the issue in that repository.
Start your issues title with [Feature Request] / [Bug] / [Question] or no tag if your unsure. Also, please be aware that GitHub now supports uploading of screenshots; look at the bottom of this input field.
Please include some basic information:
- What grafana version are you using?
Please include this information:
- What Grafana version are you using?
- What datasource are you using?
- What OS are you running grafana on?
- What did you do?
- What was the expected result?
- What happenend instead?
- What happened instead?
If you question/bug relates to a metric query / unexpected data visualization, please include:
**IMPORTANT**
If it relates to *metric data viz*:
- An image or text representation of your metric query
- The raw query and response from your data source (check this in chrome dev tools network tab)
- The raw query and response for the network request (check this in chrome dev tools network tab, here you can see metric requests and other request, please include the request body and request response)
If it relates to *alerting*
- An image of the test execution data fully expanded.
+3 -1
View File
@@ -1,2 +1,4 @@
* Link the PR to an issue for new features
* Rebase your PR if it gets out of sync with master
* Rebase your PR if it gets out of sync with master
**REMOVE THE TEXT ABOVE BEFORE CREATING THE PULL REQUEST**
+2 -1
View File
@@ -25,6 +25,7 @@ public/css/*.min.css
*.swp
.idea/
*.iml
.vscode/
/data/*
/bin/*
@@ -37,4 +38,4 @@ profile.cov
.notouch
/pkg/cmd/grafana-cli/grafana-cli
/pkg/cmd/grafana-server/grafana-server
/examples/*/dist
/examples/*/dist
+1 -1
View File
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
test -z "$(gofmt -s -l . | grep -v Godeps/_workspace/src/ | tee /dev/stderr)"
test -z "$(gofmt -s -l . | grep -v vendor/src/ | tee /dev/stderr)"
if [ $? -gt 0 ]; then
echo "Some files aren't formatted, please run 'go fmt ./pkg/...' to format your source code before committing"
exit 1
+1 -1
View File
@@ -10,4 +10,4 @@
"disallowSpacesInsideArrayBrackets": true,
"disallowSpacesInsideParentheses": true,
"validateIndentation": 2
}
}
+266 -1
View File
@@ -1,4 +1,268 @@
# 3.0.2 Stable (unreleased)
# 4.2.0 (unreleased)
## Enhancements
* **Telegram**: Added Telegram alert notifier [#7098](https://github.com/grafana/grafana/pull/7098), thx [@leonoff](https://github.com/leonoff)
* **Templating**: Make $__interval and $__interval_ms global built in variables that can be used in by any datasource (in panel queries), closes [#7190](https://github.com/grafana/grafana/issues/7190), closes [#6582](https://github.com/grafana/grafana/issues/6582)
* **S3 Image Store**: External s3 image store (used in alert notifications) now support AWS IAM Roles, closes [#6985](https://github.com/grafana/grafana/issues/6985), [#7058](https://github.com/grafana/grafana/issues/7058) thx [@mtanda](https://github.com/mtanda)
* **SingleStat**: Implements diff aggregation method for singlestat [#7234](https://github.com/grafana/grafana/issues/7234), thx [@oliverpool](https://github.com/oliverpool)
* **Dataproxy**: Added setting to enable more verbose logging in dataproxy [#7209](https://github.com/grafana/grafana/pull/7209), thx [@Ricky-N](https://github.com/Ricky-N)
* **Alerting**: Better information about why an alert triggered [#7035](https://github.com/grafana/grafana/issues/7035)
* **LINE**: Add LINE as alerting notification channel [#7301](https://github.com/grafana/grafana/pull/7301), thx [@huydx](https://github.com/huydx)
* **LINE**: Adds image to notification message [#7417](https://github.com/grafana/grafana/pull/7417), thx [@Erliz](https://github.com/Erliz)
* **Hipchat**: Adds support for sending alert notifications to hipchat [#6451](https://github.com/grafana/grafana/issues/6451), thx [@jregovic](https://github.com/jregovic)
* **Alerting**: Uploading images for alert notifications is now optional [#7419](https://github.com/grafana/grafana/issues/7419)
* **Dashboard**: Adds shortcut for collapsing/expanding all rows [#552](https://github.com/grafana/grafana/issues/552), thx [@mtanda](https://github.com/mtanda)
* **Alerting**: Adds de duping of alert notifications [#7632](https://github.com/grafana/grafana/pull/7632)
* **Orgs**: Sharing dashboards using Grafana share feature will not redirect to correct org. [#1613](https://github.com/grafana/grafana/issues/1613)
* **Pushover**: Add Pushover alert notifications [#7526](https://github.com/grafana/grafana/pull/7526) thx [@devkid](https://github.com/devkid)
* **Threema**: Add Threema Gateway alert notification integration [#7482](https://github.com/grafana/grafana/pull/7482) thx [@dbrgn](https://github.com/dbrgn)
## Minor Enhancements
* **Optimzation**: Never issue refresh event when Grafana tab is not visible [#7218](https://github.com/grafana/grafana/issues/7218), thx [@mtanda](https://github.com/mtanda)
* **Browser History**: Browser back/forward now works time ranges / zoom, [#7259](https://github.com/grafana/grafana/issues/7259)
* **Elasticsearch**: Support for Min Doc Count options in Terms aggregation [#7324](https://github.com/grafana/grafana/pull/7324), thx [@lpic10](https://github.com/lpic10)
* **Elasticsearch**: Term aggregation limit can now be changed in template queries [#7112](https://github.com/grafana/grafana/issues/7112), thx [@FFalcon](https://github.com/FFalcon)
* **Elasticsearch**: Ad-hoc filters now support all operators [#7612](https://github.com/grafana/grafana/issues/7612), thx [@tamayika](https://github.com/tamayika)
* **Graph**: Add full series name as title for legends. [#7493](https://github.com/grafana/grafana/pull/7493), thx [@kolobaev](https://github.com/kolobaev)
* **Table**: Add a message when queries returns no data. [#6109](https://github.com/grafana/grafana/issues/6109), thx [@xginn8](https://github.com/xginn8)
* **Graph**: Set max width for series names in legend tables. [#2385](https://github.com/grafana/grafana/issues/2385), thx [@kolobaev](https://github.com/kolobaev)
* **Database**: Allow max db connection pool configuration [#7427](https://github.com/grafana/grafana/issues/7427), thx [@huydx](https://github.com/huydx)
* **Datasources** Delete datsource by name [#7476](https://github.com/grafana/grafana/issues/7476), thx [@huydx](https://github.com/huydx)
* **Dataproxy**: Only allow get that begins with api/ to access Prometheus [#7459](https://github.com/grafana/grafana/pull/7459), thx [@mtanda](https://github.com/mtanda)
* **Snapshot**: Make timeout for snapshot creation configurable [#7449](https://github.com/grafana/grafana/pull/7449) thx [@ryu1-sakai](https://github.com/ryu1-sakai)
* **Panels**: Add more physics units [#7554](https://github.com/grafana/grafana/pull/7554) thx [@ryantxu](https://github.com/ryantxu)
* **Email**: Add sender's name on email [#2131](https://github.com/grafana/grafana/issues/2131) thx [@jacobbednarz](https://github.com/jacobbednarz)
* **HTTPS**: Set tls 1.2 as lowest tls version. [#7347](https://github.com/grafana/grafana/pull/7347) thx [@roman-vynar](https://github.com/roman-vynar)
* **Table**: Added suppressing of empty results to table plugin. [#7602](https://github.com/grafana/grafana/pull/7602) thx [@LLIyRiK](https://github.com/LLIyRiK)
## Tech
* **Library Upgrade**: Upgraded angularjs from 1.5.8 to 1.6.1 [#7274](https://github.com/grafana/grafana/issues/7274)
* **Backend**: Grafana is now built using golang 1.8
## Bugfixes
* **Alerting**: Fixes missing support for no_data and execution error when testing alerts [#7149](https://github.com/grafana/grafana/issues/7149)
* **Dashboard**: Avoid duplicate data in dashboard json for panels with alerts [#7256](https://github.com/grafana/grafana/pull/7256)
* **Alertlist**: Only show scrollbar when required [#7269](https://github.com/grafana/grafana/issues/7269)
* **SMTP**: Set LocalName to hostname [#7223](https://github.com/grafana/grafana/issues/7223)
* **Sidemenu**: Disable sign out in sidemenu for AuthProxyEnabled [#7377](https://github.com/grafana/grafana/pull/7377), thx [@solugebefola](https://github.com/solugebefola)
* **Prometheus**: Add support for basic auth in Prometheus tsdb package [#6799](https://github.com/grafana/grafana/issues/6799), thx [@hagen1778](https://github.com/hagen1778)
* **OAuth**: Redirect to original page when logging in with OAuth [#7513](https://github.com/grafana/grafana/issues/7513)
* **Annotations**: Wrap text in annotations tooltip [#7542](https://github.com/grafana/grafana/pull/7542), thx [@xginn8](https://github.com/xginn8)
* **Templating**: Fixes error when using numeric sort on empty strings [#7382](https://github.com/grafana/grafana/issues/7382)
* **Templating**: Fixed issue detecting template variable dependency [#7354](https://github.com/grafana/grafana/issues/7354)
# 4.1.2 (2017-02-13)
### Bugfixes
* **Table**: Fixes broken annotation rendering mode in the table panel [#7268](https://github.com/grafana/grafana/issues/7268)
* **Data Sources**: Sorting for lists of data sources in UI is now case insensitive [#7491](https://github.com/grafana/grafana/issues/7491)
* **Admin**: Support more then 1000 users in global users list [#7469](https://github.com/grafana/grafana/issues/7469)
# 4.1.1 (2017-01-11)
### Bugfixes
* **Graph Panel**: Fixed issue with legend height in table mode [#7221](https://github.com/grafana/grafana/issues/7221)
# 4.1.0 (2017-01-11)
### Bugfixes
* **Server side PNG rendering**: Fixed issue with y-axis label rotation in phantomjs rendered images [#6924](https://github.com/grafana/grafana/issues/6924)
* **Graph**: Fixed centering of y-axis label [#7099](https://github.com/grafana/grafana/issues/7099)
* **Graph**: Fixed graph legend table mode and always visible scrollbar [#6828](https://github.com/grafana/grafana/issues/6828)
* **Templating**: Fixed template variable value groups/tags feature [#6752](https://github.com/grafana/grafana/issues/6752)
* **Webhook**: Fixed webhook username mismatch [#7195](https://github.com/grafana/grafana/pull/7195), thx [@theisenmark](https://github.com/theisenmark)
* **Influxdb**: Handles time(auto) the same way as time($interval) [#6997](https://github.com/grafana/grafana/issues/6997)
## Enhancements
* **Elasticsearch**: Added support for all moving average options [#7154](https://github.com/grafana/grafana/pull/7154), thx [@vaibhavinbayarea](https://github.com/vaibhavinbayarea)
# 4.1-beta1 (2016-12-21)
### Enhancements
* **Postgres**: Add support for Certs for Postgres database [#6655](https://github.com/grafana/grafana/issues/6655)
* **Victorops**: Add VictorOps notification integration [#6411](https://github.com/grafana/grafana/issues/6411), thx [@ichekrygin](https://github.com/ichekrygin)
* **Opsgenie**: Add OpsGenie notification integratiion [#6687](https://github.com/grafana/grafana/issues/6687), thx [@kylemcc](https://github.com/kylemcc)
* **Singlestat**: New aggregation on singlestat panel [#6740](https://github.com/grafana/grafana/pull/6740), thx [@dirk-leroux](https://github.com/dirk-leroux)
* **Cloudwatch**: Make it possible to specify access and secret key on the data source config page [#6697](https://github.com/grafana/grafana/issues/6697)
* **Table**: Added Hidden Column Style for Table Panel [#5677](https://github.com/grafana/grafana/pull/5677), thx [@bmundt](https://github.com/bmundt)
* **Graph**: Shared crosshair option renamed to shared tooltip, shows tooltip on all graphs as you hover over one graph. [#1578](https://github.com/grafana/grafana/pull/1578), [#6274](https://github.com/grafana/grafana/pull/6274)
* **Elasticsearch**: Added support for Missing option (bucket) for terms aggregation [#4244](https://github.com/grafana/grafana/pull/4244), thx [@shanielh](https://github.com/shanielh)
* **Elasticsearch**: Added support for Elasticsearch 5.x [#5740](https://github.com/grafana/grafana/issues/5740), thx [@lpic10](https://github.com/lpic10)
* **CLI**: Make it possible to reset the admin password using the grafana-cli. [#5479](https://github.com/grafana/grafana/issues/5479)
* **Influxdb**: Support multiple tags in InfluxDB annotations. [#4550](https://github.com/grafana/grafana/pull/4550), thx [@adrianlzt](https://github.com/adrianlzt)
* **LDAP**: Basic Auth now supports LDAP username and password, [#6940](https://github.com/grafana/grafana/pull/6940), thx [@utkarshcmu](https://github.com/utkarshcmu)
* **LDAP**: Now works with Auth Proxy, role and organisation mapping & sync will regularly be performed. [#6895](https://github.com/grafana/grafana/pull/6895), thx [@Seuf](https://github.com/seuf)
* **Alerting**: Adds OK as no data option. [#6866](https://github.com/grafana/grafana/issues/6866)
* **Alert list**: Order alerts based on state. [#6676](https://github.com/grafana/grafana/issues/6676)
* **Alerting**: Add api endpoint for pausing all alerts. [#6589](https://github.com/grafana/grafana/issues/6589)
* **Panel**: Added help text for panels. [#4079](https://github.com/grafana/grafana/issues/4079), thx [@utkarshcmu](https://github.com/utkarshcmu)
### Bugfixes
* **API**: HTTP API for deleting org returning incorrect message for a non-existing org [#6679](https://github.com/grafana/grafana/issues/6679)
* **Dashboard**: Posting empty dashboard result in corrupted dashboard [#5443](https://github.com/grafana/grafana/issues/5443)
* **Logging**: Fixed logging level confing issue [#6978](https://github.com/grafana/grafana/issues/6978)
* **Notifications**: Remove html escaping the email subject. [#6905](https://github.com/grafana/grafana/issues/6905)
* **Influxdb**: Fixes broken field dropdown when using template vars as measurement. [#6473](https://github.com/grafana/grafana/issues/6473)
# 4.0.2 (2016-12-08)
### Enhancements
* **Playlist**: Add support for kiosk mode [#6727](https://github.com/grafana/grafana/issues/6727)
### Bugfixes
* **Alerting**: Add alert message to webhook notifications [#6807](https://github.com/grafana/grafana/issues/6807)
* **Alerting**: Fixes a bug where avg() reducer treated null as zero. [#6879](https://github.com/grafana/grafana/issues/6879)
* **PNG Rendering**: Fix for server side rendering when using non default http addr bind and domain setting [#6813](https://github.com/grafana/grafana/issues/6813)
* **PNG Rendering**: Fix for server side rendering when setting enforce_domain to true [#6769](https://github.com/grafana/grafana/issues/6769)
* **Webhooks**: Add content type json to outgoing webhooks [#6822](https://github.com/grafana/grafana/issues/6822)
* **Keyboard shortcut**: Fixed zoom out shortcut [#6837](https://github.com/grafana/grafana/issues/6837)
* **Webdav**: Adds basic auth headers to webdav uploader [#6779](https://github.com/grafana/grafana/issues/6779)
# 4.0.1 (2016-12-02)
> **Notice**
4.0.0 had serious connection pooling issue when using a data source in proxy access. This bug caused lots of resource issues
due to too many connections/file handles on the data source backend. This problem is fixed in this release.
### Bugfixes
* **Metrics**: Fixes nil pointer dereference on my arm build [#6749](https://github.com/grafana/grafana/issues/6749)
* **Data proxy**: Fixes a tcp pooling issue in the datasource reverse proxy [#6759](https://github.com/grafana/grafana/issues/6759)
# 4.0-stable (2016-11-29)
### Bugfixes
* **Server-side rendering**: Fixed address used when rendering panel via phantomjs and using non default http_addr config [#6660](https://github.com/grafana/grafana/issues/6660)
* **Graph panel**: Fixed graph panel tooltip sort order issue [#6648](https://github.com/grafana/grafana/issues/6648)
* **Unsaved changes**: You now navigate to the intended page after saving in the unsaved changes dialog [#6675](https://github.com/grafana/grafana/issues/6675)
* **TLS Client Auth**: Support for TLS client authentication for datasource proxies [#2316](https://github.com/grafana/grafana/issues/2316)
* **Alerts out of sync**: Saving dashboards with broken alerts causes sync problem[#6576](https://github.com/grafana/grafana/issues/6576)
* **Alerting**: Saving an alert with condition "HAS NO DATA" throws an error[#6701](https://github.com/grafana/grafana/issues/6701)
* **Config**: Improve error message when parsing broken config file [#6731](https://github.com/grafana/grafana/issues/6731)
* **Table**: Render empty dates as - instead of current date [#6728](https://github.com/grafana/grafana/issues/6728)
# 4.0-beta2 (2016-11-21)
### Bugfixes
* **Graph Panel**: Log base scale on right Y-axis had no effect, max value calc was not applied, [#6534](https://github.com/grafana/grafana/issues/6534)
* **Graph Panel**: Bar width if bars was only used in series override, [#6528](https://github.com/grafana/grafana/issues/6528)
* **UI/Browser**: Fixed issue with page/view header gradient border not showing in Safari, [#6530](https://github.com/grafana/grafana/issues/6530)
* **Cloudwatch**: Fixed cloudwatch datasource requesting to many datapoints, [#6544](https://github.com/grafana/grafana/issues/6544)
* **UX**: Panel Drop zone visible after duplicating panel, and when entering fullscreen/edit view, [#6598](https://github.com/grafana/grafana/issues/6598)
* **Templating**: Newly added variable was not visible directly only after dashboard reload, [#6622](https://github.com/grafana/grafana/issues/6622)
### Enhancements
* **Singlestat**: Support repeated template variables in prefix/postfix [#6595](https://github.com/grafana/grafana/issues/6595)
* **Templating**: Don't persist variable options with refresh option [#6586](https://github.com/grafana/grafana/issues/6586)
* **Alerting**: Add ability to have OR conditions (and mixing AND & OR) [#6579](https://github.com/grafana/grafana/issues/6579)
* **InfluxDB**: Fix for Ad-Hoc Filters variable & changing dashboards [#6821](https://github.com/grafana/grafana/issues/6821)
# 4.0-beta1 (2016-11-09)
### Enhancements
* **Login**: Adds option to disable username/password logins, closes [#4674](https://github.com/grafana/grafana/issues/4674)
* **SingleStat**: Add seriename as option in singlestat panel, closes [#4740](https://github.com/grafana/grafana/issues/4740)
* **Localization**: Week start day now dependant on browser locale setting, closes [#3003](https://github.com/grafana/grafana/issues/3003)
* **Templating**: Update panel repeats for variables that change on time refresh, closes [#5021](https://github.com/grafana/grafana/issues/5021)
* **Templating**: Add support for numeric and alphabetical sorting of variable values, closes [#2839](https://github.com/grafana/grafana/issues/2839)
* **Elasticsearch**: Support to set Precision Threshold for Unique Count metric, closes [#4689](https://github.com/grafana/grafana/issues/4689)
* **Navigation**: Add search to org swithcer, closes [#2609](https://github.com/grafana/grafana/issues/2609)
* **Database**: Allow database config using one propertie, closes [#5456](https://github.com/grafana/grafana/pull/5456)
* **Graphite**: Add support for groupByNodes, closes [#5613](https://github.com/grafana/grafana/pull/5613)
* **Influxdb**: Add support for elapsed(), closes [#5827](https://github.com/grafana/grafana/pull/5827)
* **OpenTSDB**: Add support for explicitTags for OpenTSDB>=2.3, closes [#6360](https://github.com/grafana/grafana/pull/6361)
* **OAuth**: Add support for generic oauth, closes [#4718](https://github.com/grafana/grafana/pull/4718)
* **Cloudwatch**: Add support to expand multi select template variable, closes [#5003](https://github.com/grafana/grafana/pull/5003)
* **Background Tasks**: Now support automatic purging of old snapshots, closes [#4087](https://github.com/grafana/grafana/issues/4087)
* **Background Tasks**: Now support automatic purging of old rendered images, closes [#2172](https://github.com/grafana/grafana/issues/2172)
* **Dashboard**: After inactivity hide nav/row actions, fade to nice clean view, can be toggled with `d v`, also added kiosk mode, toggled via `d k` [#6476](https://github.com/grafana/grafana/issues/6476)
* **Dashboard**: Improved dashboard row menu & add panel UX [#6442](https://github.com/grafana/grafana/issues/6442)
* **Graph Panel**: Support for stacking null values [#2912](https://github.com/grafana/grafana/issues/2912), [#6287](https://github.com/grafana/grafana/issues/6287), thanks @benrubson!
### Breaking changes
* **SystemD**: Change systemd description, closes [#5971](https://github.com/grafana/grafana/pull/5971)
* **lodash upgrade**: Upgraded lodash from 2.4.2 to 4.15.0, this contains a number of breaking changes that could effect plugins. closes [#6021](https://github.com/grafana/grafana/pull/6021)
### Bug fixes
* **Table Panel**: Fixed problem when switching to Mixed datasource in metrics tab, fixes [#5999](https://github.com/grafana/grafana/pull/5999)
* **Playlist**: Fixed problem with play order not matching order defined in playlist, fixes [#5467](https://github.com/grafana/grafana/pull/5467)
* **Graph panel**: Fixed problem with auto decimals on y axis when datamin=datamax, fixes [#6070](https://github.com/grafana/grafana/pull/6070)
* **Snapshot**: Can view embedded panels/png rendered panels in snapshots without login, fixes [#3769](https://github.com/grafana/grafana/pull/3769)
* **Elasticsearch**: Fix for query template variable when looking up terms without query, no longer relies on elasticsearch default field, fixes [#3887](https://github.com/grafana/grafana/pull/3887)
* **Elasticsearch**: Fix for displaying IP address used in terms aggregations, fixes [#4393](https://github.com/grafana/grafana/pull/4393)
* **PNG Rendering**: Fix for server side rendering when using auth proxy, fixes [#5906](https://github.com/grafana/grafana/pull/5906)
* **OpenTSDB**: Fixed multi-value nested templating for opentsdb, fixes [#6455](https://github.com/grafana/grafana/pull/6455)
* **Playlist**: Remove playlist items when dashboard is removed, fixes [#6292](https://github.com/grafana/grafana/issues/6292)
# 3.1.2 (unreleased)
* **Templating**: Fixed issue when combining row & panel repeats, fixes [#5790](https://github.com/grafana/grafana/issues/5790)
* **Drag&Drop**: Fixed issue with drag and drop in latest Chrome(51+), fixes [#5767](https://github.com/grafana/grafana/issues/5767)
* **Internal Metrics**: Fixed issue with dots in instance_name when sending internal metrics to Graphite, fixes [#5739](https://github.com/grafana/grafana/issues/5739)
* **Grafana-CLI**: Add default plugin path for MAC OS, fixes [#5806](https://github.com/grafana/grafana/issues/5806)
* **Grafana-CLI**: Improve error message for upgrade-all command, fixes [#5885](https://github.com/grafana/grafana/issues/5885)
# 3.1.1 (2016-08-01)
* **IFrame embedding**: Fixed issue of using full iframe height, fixes [#5605](https://github.com/grafana/grafana/issues/5606)
* **Panel PNG rendering**: Fixed issue detecting render completion, fixes [#5605](https://github.com/grafana/grafana/issues/5606)
* **Elasticsearch**: Fixed issue with templating query and json parse error, fixes [#5615](https://github.com/grafana/grafana/issues/5615)
* **Tech**: Upgraded JQuery to 2.2.4 to fix Security vulnerabilitie in 2.1.4, fixes [#5627](https://github.com/grafana/grafana/issues/5627)
* **Graphite**: Fixed issue with mixed data sources and Graphite, fixes [#5617](https://github.com/grafana/grafana/issues/5617)
* **Templating**: Fixed issue with template variable query was issued multiple times during dashboard load, fixes [#5637](https://github.com/grafana/grafana/issues/5637)
* **Zoom**: Fixed issues with zoom in and out on embedded (iframed) panel, fixes [#4489](https://github.com/grafana/grafana/issues/4489), [#5666](https://github.com/grafana/grafana/issues/5666)
# 3.1.0 stable (2016-07-12)
### Bugfixes & Enhancements,
* **User Alert Notices**: Backend error alert popups did not show properly, fixes [#5435](https://github.com/grafana/grafana/issues/5435)
* **Table**: Added sanitize HTML option to allow links in table cells, fixes [#4596](https://github.com/grafana/grafana/issues/4596)
* **Apps**: App dashboards are automatically synced to DB at startup after plugin update, fixes [#5529](https://github.com/grafana/grafana/issues/5529)
# 3.1.0-beta1 (2016-06-23)
### Enhancements
* **Dashboard Export/Import**: Dashboard export now templetize data sources and constant variables, users pick these on import, closes [#5084](https://github.com/grafana/grafana/issues/5084)
* **Dashboard Url**: Time range changes updates url, closes [#458](https://github.com/grafana/grafana/issues/458)
* **Dashboard Url**: Template variable change updates url, closes [#5002](https://github.com/grafana/grafana/issues/5002)
* **Singlestat**: Add support for range to text mappings, closes [#1319](https://github.com/grafana/grafana/issues/1319)
* **Graph**: Adds sort order options for graph tooltip, closes [#1189](https://github.com/grafana/grafana/issues/1189)
* **Theme**: Add default theme to config file [#5011](https://github.com/grafana/grafana/pull/5011)
* **Page Footer**: Added page footer with links to docs, shows Grafana version and info if new version is available, closes [#4889](https://github.com/grafana/grafana/pull/4889)
* **InfluxDB**: Add spread function, closes [#5211](https://github.com/grafana/grafana/issues/5211)
* **Scripts**: Use restart instead of start for deb package script, closes [#5282](https://github.com/grafana/grafana/pull/5282)
* **Logging**: Moved to structured logging lib, and moved to component specific level filters via config file, closes [#4590](https://github.com/grafana/grafana/issues/4590)
* **OpenTSDB**: Support nested template variables in tag_values function, closes [#4398](https://github.com/grafana/grafana/issues/4398)
* **Datasource**: Pending data source requests are cancelled before new ones are issues (Graphite & Prometheus), closes [#5321](https://github.com/grafana/grafana/issues/5321)
### Breaking changes
* **Logging** : Changed default logging output format (now structured into message, and key value pairs, with logger key acting as component). You can also no change in config to json log ouput.
* **Graphite** : The Graph panel no longer have a Graphite PNG option. closes [#5367](https://github.com/grafana/grafana/issues/5367)
### Bug fixes
* **PNG rendering**: Fixed phantomjs rendering and y-axis label rotation. fixes [#5220](https://github.com/grafana/grafana/issues/5220)
* **CLI**: The cli tool now supports reading plugin.json from dist/plugin.json. fixes [#5410](https://github.com/grafana/grafana/issues/5410)
# 3.0.4 Patch release (2016-05-25)
* **Panel**: Fixed blank dashboard issue when switching to other dashboard while in fullscreen edit mode, fixes [#5163](https://github.com/grafana/grafana/pull/5163)
* **Templating**: Fixed issue with nested multi select variables and cascading and updating child variable selection state, fixes [#4861](https://github.com/grafana/grafana/pull/4861)
* **Templating**: Fixed issue with using templated data source in another template variable query, fixes [#5165](https://github.com/grafana/grafana/pull/5165)
* **Singlestat gauge**: Fixed issue with gauge render position, fixes [#5143](https://github.com/grafana/grafana/pull/5143)
* **Home dashboard**: Fixes broken home dashboard api, fixes [#5167](https://github.com/grafana/grafana/issues/5167)
# 3.0.3 Patch release (2016-05-23)
* **Annotations**: Annotations can now use a template variable as data source, closes [#5054](https://github.com/grafana/grafana/issues/5054)
* **Time picker**: Fixed issue timepicker and UTC when reading time from URL, fixes [#5078](https://github.com/grafana/grafana/issues/5078)
* **CloudWatch**: Support for Multiple Account by AssumeRole, closes [#3522](https://github.com/grafana/grafana/issues/3522)
* **Singlestat**: Fixed alignment and minium height issue, fixes [#5113](https://github.com/grafana/grafana/issues/5113), fixes [#4679](https://github.com/grafana/grafana/issues/4679)
* **Share modal**: Fixed link when using grafana under dashboard sub url, fixes [#5109](https://github.com/grafana/grafana/issues/5109)
* **Prometheus**: Fixed bug in query editor that caused it not to load when reloading page, fixes [#5107](https://github.com/grafana/grafana/issues/5107)
* **Elasticsearch**: Fixed bug when template variable query returns numeric values, fixes [#5097](https://github.com/grafana/grafana/issues/5097), fixes [#5088](https://github.com/grafana/grafana/issues/5088)
* **Logging**: Fixed issue with reading logging level value, fixes [#5079](https://github.com/grafana/grafana/issues/5079)
* **Timepicker**: Fixed issue with timepicker and UTC when reading time from URL, fixes [#5078](https://github.com/grafana/grafana/issues/5078)
* **Docs**: Added docs for org & user preferences HTTP API, closes [#5069](https://github.com/grafana/grafana/issues/5069)
* **Plugin list panel**: Now shows correct enable state for apps when not enabled, fixes [#5068](https://github.com/grafana/grafana/issues/5068)
* **Elasticsearch**: Templating & Annotation queries that use template variables are now formatted correctly, fixes [#5135](https://github.com/grafana/grafana/issues/5135)
# 3.0.2 Patch release (2016-05-16)
* **Templating**: Fixed issue mixing row repeat and panel repeats, fixes [#4988](https://github.com/grafana/grafana/issues/4988)
* **Templating**: Fixed issue detecting dependencies in nested variables, fixes [#4987](https://github.com/grafana/grafana/issues/4987), fixes [#4986](https://github.com/grafana/grafana/issues/4986)
@@ -9,6 +273,7 @@
# 3.0.1 Stable (2016-05-11)
### Bug fixes
* **Templating**: Fixed issue with new data source variable not persisting current selected value, fixes [#4934](https://github.com/grafana/grafana/issues/4934)
# 3.0.0-beta7 (2016-05-02)
-351
View File
@@ -1,351 +0,0 @@
{
"ImportPath": "github.com/grafana/grafana",
"GoVersion": "go1.5.1",
"Packages": [
"./pkg/..."
],
"Deps": [
{
"ImportPath": "github.com/BurntSushi/toml",
"Comment": "v0.1.0-21-g056c9bc",
"Rev": "056c9bc7be7190eaa7715723883caffa5f8fa3e4"
},
{
"ImportPath": "github.com/Unknwon/com",
"Rev": "d9bcf409c8a368d06c9b347705c381e7c12d54df"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/aws",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/aws/awserr",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/aws/awsutil",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/aws/client",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/aws/client/metadata",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/aws/corehandlers",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/aws/credentials",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/aws/defaults",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/aws/ec2metadata",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/aws/request",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/aws/session",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/private/endpoints",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/private/protocol/ec2query",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/private/protocol/query",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/private/protocol/query/queryutil",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/private/protocol/rest",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/private/signer/v4",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/private/waiter",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/service/cloudwatch",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/aws/aws-sdk-go/service/ec2",
"Comment": "v1.0.0",
"Rev": "abb928e07c4108683d6b4d0b6ca08fe6bc0eee5f"
},
{
"ImportPath": "github.com/bmizerany/assert",
"Comment": "release.r60-6-ge17e998",
"Rev": "e17e99893cb6509f428e1728281c2ad60a6b31e3"
},
{
"ImportPath": "github.com/bradfitz/gomemcache/memcache",
"Comment": "release.r60-40-g72a6864",
"Rev": "72a68649ba712ee7c4b5b4a943a626bcd7d90eb8"
},
{
"ImportPath": "github.com/codegangsta/cli",
"Comment": "1.2.0-187-gc31a797",
"Rev": "c31a7975863e7810c92e2e288a9ab074f9a88f29"
},
{
"ImportPath": "github.com/davecgh/go-spew/spew",
"Rev": "2df174808ee097f90d259e432cc04442cf60be21"
},
{
"ImportPath": "github.com/fatih/color",
"Comment": "v0.1-16-g4f7bcef",
"Rev": "4f7bcef27eec7925456d0c30c5e7b0408b3339be"
},
{
"ImportPath": "github.com/franela/goreq",
"Rev": "3ddeded65be21dacb5a2e2d0b95af9ff6862a2b5"
},
{
"ImportPath": "github.com/go-ini/ini",
"Comment": "v0-48-g060d7da",
"Rev": "060d7da055ba6ec5ea7a31f116332fe5efa04ce0"
},
{
"ImportPath": "github.com/go-ldap/ldap",
"Comment": "v2.2.1",
"Rev": "07a7330929b9ee80495c88a4439657d89c7dbd87"
},
{
"ImportPath": "github.com/go-macaron/binding",
"Rev": "2502aaf4bce3a4e6451b4610847bfb8dffdb6266"
},
{
"ImportPath": "github.com/go-macaron/gzip",
"Rev": "4938e9be6b279d8426cb1c89a6bcf7af70b0c21d"
},
{
"ImportPath": "github.com/go-macaron/inject",
"Rev": "c5ab7bf3a307593cd44cb272d1a5beea473dd072"
},
{
"ImportPath": "github.com/go-macaron/session",
"Rev": "66031fcb37a0fff002a1f028eb0b3a815c78306b"
},
{
"ImportPath": "github.com/go-macaron/session/memcache",
"Rev": "66031fcb37a0fff002a1f028eb0b3a815c78306b"
},
{
"ImportPath": "github.com/go-macaron/session/mysql",
"Rev": "66031fcb37a0fff002a1f028eb0b3a815c78306b"
},
{
"ImportPath": "github.com/go-macaron/session/postgres",
"Rev": "66031fcb37a0fff002a1f028eb0b3a815c78306b"
},
{
"ImportPath": "github.com/go-macaron/session/redis",
"Rev": "66031fcb37a0fff002a1f028eb0b3a815c78306b"
},
{
"ImportPath": "github.com/go-sql-driver/mysql",
"Comment": "v1.2-171-g267b128",
"Rev": "267b128680c46286b9ca13475c3cca5de8f79bd7"
},
{
"ImportPath": "github.com/go-xorm/core",
"Comment": "v0.4.4-7-g9e608f7",
"Rev": "9e608f7330b9d16fe2818cfe731128b3f156cb9a"
},
{
"ImportPath": "github.com/go-xorm/xorm",
"Comment": "v0.4.4-44-gf561133",
"Rev": "f56113384f2c63dfe4cd8e768e349f1c35122b58"
},
{
"ImportPath": "github.com/gorilla/websocket",
"Rev": "c45a635370221f34fea2d5163fd156fcb4e38e8a"
},
{
"ImportPath": "github.com/gosimple/slug",
"Rev": "8d258463b4459f161f51d6a357edacd3eef9d663"
},
{
"ImportPath": "github.com/hashicorp/go-version",
"Rev": "7e3c02b30806fa5779d3bdfc152ce4c6f40e7b38"
},
{
"ImportPath": "github.com/jmespath/go-jmespath",
"Comment": "0.2.2",
"Rev": "3433f3ea46d9f8019119e7dd41274e112a2359a9"
},
{
"ImportPath": "github.com/jtolds/gls",
"Rev": "f1ac7f4f24f50328e6bc838ca4437d1612a0243c"
},
{
"ImportPath": "github.com/klauspost/compress/flate",
"Rev": "7b02889a2005228347aef0e76beeaee564d82f8c"
},
{
"ImportPath": "github.com/klauspost/compress/gzip",
"Rev": "7b02889a2005228347aef0e76beeaee564d82f8c"
},
{
"ImportPath": "github.com/klauspost/cpuid",
"Rev": "349c675778172472f5e8f3a3e0fe187e302e5a10"
},
{
"ImportPath": "github.com/klauspost/crc32",
"Rev": "6834731faf32e62a2dd809d99fb24d1e4ae5a92d"
},
{
"ImportPath": "github.com/kr/pretty",
"Comment": "go.weekly.2011-12-22-27-ge6ac2fc",
"Rev": "e6ac2fc51e89a3249e82157fa0bb7a18ef9dd5bb"
},
{
"ImportPath": "github.com/kr/text",
"Rev": "bb797dc4fb8320488f47bf11de07a733d7233e1f"
},
{
"ImportPath": "github.com/lib/pq",
"Comment": "go1.0-cutoff-13-g19eeca3",
"Rev": "19eeca3e30d2577b1761db471ec130810e67f532"
},
{
"ImportPath": "github.com/lib/pq/oid",
"Comment": "go1.0-cutoff-13-g19eeca3",
"Rev": "19eeca3e30d2577b1761db471ec130810e67f532"
},
{
"ImportPath": "github.com/mattn/go-colorable",
"Rev": "9cbef7c35391cca05f15f8181dc0b18bc9736dbb"
},
{
"ImportPath": "github.com/mattn/go-isatty",
"Rev": "56b76bdf51f7708750eac80fa38b952bb9f32639"
},
{
"ImportPath": "github.com/mattn/go-sqlite3",
"Comment": "v1.1.0-67-g7204887",
"Rev": "7204887cf3a42df1cfaa5505dc3a3427f6dded8b"
},
{
"ImportPath": "github.com/rainycape/unidecode",
"Rev": "836ef0a715aedf08a12d595ed73ec8ed5b288cac"
},
{
"ImportPath": "github.com/smartystreets/goconvey/convey",
"Comment": "1.5.0-356-gfbc0a1c",
"Rev": "fbc0a1c888f9f96263f9a559d1769905245f1123"
},
{
"ImportPath": "github.com/smartystreets/goconvey/convey/assertions",
"Comment": "1.5.0-356-gfbc0a1c",
"Rev": "fbc0a1c888f9f96263f9a559d1769905245f1123"
},
{
"ImportPath": "github.com/smartystreets/goconvey/convey/assertions/oglematchers",
"Comment": "1.5.0-356-gfbc0a1c",
"Rev": "fbc0a1c888f9f96263f9a559d1769905245f1123"
},
{
"ImportPath": "github.com/smartystreets/goconvey/convey/gotest",
"Comment": "1.5.0-356-gfbc0a1c",
"Rev": "fbc0a1c888f9f96263f9a559d1769905245f1123"
},
{
"ImportPath": "github.com/smartystreets/goconvey/convey/reporting",
"Comment": "1.5.0-356-gfbc0a1c",
"Rev": "fbc0a1c888f9f96263f9a559d1769905245f1123"
},
{
"ImportPath": "github.com/streadway/amqp",
"Rev": "150b7f24d6ad507e6026c13d85ce1f1391ac7400"
},
{
"ImportPath": "golang.org/x/net/context",
"Rev": "972f0c5fbe4ae29e666c3f78c3ed42ae7a448b0a"
},
{
"ImportPath": "golang.org/x/oauth2",
"Rev": "c58fcf0ffc1c772aa2e1ee4894bc19f2649263b2"
},
{
"ImportPath": "golang.org/x/sys/unix",
"Rev": "7a56174f0086b32866ebd746a794417edbc678a1"
},
{
"ImportPath": "gopkg.in/asn1-ber.v1",
"Comment": "v1",
"Rev": "9eae18c3681ae3d3c677ac2b80a8fe57de45fc09"
},
{
"ImportPath": "gopkg.in/bufio.v1",
"Comment": "v1",
"Rev": "567b2bfa514e796916c4747494d6ff5132a1dfce"
},
{
"ImportPath": "gopkg.in/ini.v1",
"Comment": "v0-16-g1772191",
"Rev": "177219109c97e7920c933e21c9b25f874357b237"
},
{
"ImportPath": "gopkg.in/macaron.v1",
"Rev": "1c6dd87797ae9319b4658cbd48d1d0420b279fd5"
},
{
"ImportPath": "gopkg.in/redis.v2",
"Comment": "v2.3.2",
"Rev": "e6179049628164864e6e84e973cfb56335748dea"
}
]
}
Generated
-5
View File
@@ -1,5 +0,0 @@
This directory tree is generated automatically by godep.
Please do not edit.
See https://github.com/tools/godep for more information.
-2
View File
@@ -1,2 +0,0 @@
/pkg
/bin
@@ -1,233 +0,0 @@
package awsutil_test
import (
"bytes"
"fmt"
"io"
"io/ioutil"
"testing"
"github.com/aws/aws-sdk-go/aws/awsutil"
"github.com/stretchr/testify/assert"
)
func ExampleCopy() {
type Foo struct {
A int
B []*string
}
// Create the initial value
str1 := "hello"
str2 := "bye bye"
f1 := &Foo{A: 1, B: []*string{&str1, &str2}}
// Do the copy
var f2 Foo
awsutil.Copy(&f2, f1)
// Print the result
fmt.Println(awsutil.Prettify(f2))
// Output:
// {
// A: 1,
// B: ["hello","bye bye"]
// }
}
func TestCopy(t *testing.T) {
type Foo struct {
A int
B []*string
C map[string]*int
}
// Create the initial value
str1 := "hello"
str2 := "bye bye"
int1 := 1
int2 := 2
f1 := &Foo{
A: 1,
B: []*string{&str1, &str2},
C: map[string]*int{
"A": &int1,
"B": &int2,
},
}
// Do the copy
var f2 Foo
awsutil.Copy(&f2, f1)
// Values are equal
assert.Equal(t, f2.A, f1.A)
assert.Equal(t, f2.B, f1.B)
assert.Equal(t, f2.C, f1.C)
// But pointers are not!
str3 := "nothello"
int3 := 57
f2.A = 100
f2.B[0] = &str3
f2.C["B"] = &int3
assert.NotEqual(t, f2.A, f1.A)
assert.NotEqual(t, f2.B, f1.B)
assert.NotEqual(t, f2.C, f1.C)
}
func TestCopyNestedWithUnexported(t *testing.T) {
type Bar struct {
a int
B int
}
type Foo struct {
A string
B Bar
}
f1 := &Foo{A: "string", B: Bar{a: 1, B: 2}}
var f2 Foo
awsutil.Copy(&f2, f1)
// Values match
assert.Equal(t, f2.A, f1.A)
assert.NotEqual(t, f2.B, f1.B)
assert.NotEqual(t, f2.B.a, f1.B.a)
assert.Equal(t, f2.B.B, f2.B.B)
}
func TestCopyIgnoreNilMembers(t *testing.T) {
type Foo struct {
A *string
B []string
C map[string]string
}
f := &Foo{}
assert.Nil(t, f.A)
assert.Nil(t, f.B)
assert.Nil(t, f.C)
var f2 Foo
awsutil.Copy(&f2, f)
assert.Nil(t, f2.A)
assert.Nil(t, f2.B)
assert.Nil(t, f2.C)
fcopy := awsutil.CopyOf(f)
f3 := fcopy.(*Foo)
assert.Nil(t, f3.A)
assert.Nil(t, f3.B)
assert.Nil(t, f3.C)
}
func TestCopyPrimitive(t *testing.T) {
str := "hello"
var s string
awsutil.Copy(&s, &str)
assert.Equal(t, "hello", s)
}
func TestCopyNil(t *testing.T) {
var s string
awsutil.Copy(&s, nil)
assert.Equal(t, "", s)
}
func TestCopyReader(t *testing.T) {
var buf io.Reader = bytes.NewReader([]byte("hello world"))
var r io.Reader
awsutil.Copy(&r, buf)
b, err := ioutil.ReadAll(r)
assert.NoError(t, err)
assert.Equal(t, []byte("hello world"), b)
// empty bytes because this is not a deep copy
b, err = ioutil.ReadAll(buf)
assert.NoError(t, err)
assert.Equal(t, []byte(""), b)
}
func TestCopyDifferentStructs(t *testing.T) {
type SrcFoo struct {
A int
B []*string
C map[string]*int
SrcUnique string
SameNameDiffType int
unexportedPtr *int
ExportedPtr *int
}
type DstFoo struct {
A int
B []*string
C map[string]*int
DstUnique int
SameNameDiffType string
unexportedPtr *int
ExportedPtr *int
}
// Create the initial value
str1 := "hello"
str2 := "bye bye"
int1 := 1
int2 := 2
f1 := &SrcFoo{
A: 1,
B: []*string{&str1, &str2},
C: map[string]*int{
"A": &int1,
"B": &int2,
},
SrcUnique: "unique",
SameNameDiffType: 1,
unexportedPtr: &int1,
ExportedPtr: &int2,
}
// Do the copy
var f2 DstFoo
awsutil.Copy(&f2, f1)
// Values are equal
assert.Equal(t, f2.A, f1.A)
assert.Equal(t, f2.B, f1.B)
assert.Equal(t, f2.C, f1.C)
assert.Equal(t, "unique", f1.SrcUnique)
assert.Equal(t, 1, f1.SameNameDiffType)
assert.Equal(t, 0, f2.DstUnique)
assert.Equal(t, "", f2.SameNameDiffType)
assert.Equal(t, int1, *f1.unexportedPtr)
assert.Nil(t, f2.unexportedPtr)
assert.Equal(t, int2, *f1.ExportedPtr)
assert.Equal(t, int2, *f2.ExportedPtr)
}
func ExampleCopyOf() {
type Foo struct {
A int
B []*string
}
// Create the initial value
str1 := "hello"
str2 := "bye bye"
f1 := &Foo{A: 1, B: []*string{&str1, &str2}}
// Do the copy
v := awsutil.CopyOf(f1)
var f2 *Foo = v.(*Foo)
// Print the result
fmt.Println(awsutil.Prettify(f2))
// Output:
// {
// A: 1,
// B: ["hello","bye bye"]
// }
}
@@ -1,29 +0,0 @@
package awsutil_test
import (
"testing"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awsutil"
"github.com/stretchr/testify/assert"
)
func TestDeepEqual(t *testing.T) {
cases := []struct {
a, b interface{}
equal bool
}{
{"a", "a", true},
{"a", "b", false},
{"a", aws.String(""), false},
{"a", nil, false},
{"a", aws.String("a"), true},
{(*bool)(nil), (*bool)(nil), true},
{(*bool)(nil), (*string)(nil), false},
{nil, nil, true},
}
for i, c := range cases {
assert.Equal(t, c.equal, awsutil.DeepEqual(c.a, c.b), "%d, a:%v b:%v, %t", i, c.a, c.b, c.equal)
}
}
@@ -1,142 +0,0 @@
package awsutil_test
import (
"testing"
"github.com/aws/aws-sdk-go/aws/awsutil"
"github.com/stretchr/testify/assert"
)
type Struct struct {
A []Struct
z []Struct
B *Struct
D *Struct
C string
E map[string]string
}
var data = Struct{
A: []Struct{{C: "value1"}, {C: "value2"}, {C: "value3"}},
z: []Struct{{C: "value1"}, {C: "value2"}, {C: "value3"}},
B: &Struct{B: &Struct{C: "terminal"}, D: &Struct{C: "terminal2"}},
C: "initial",
}
var data2 = Struct{A: []Struct{
{A: []Struct{{C: "1"}, {C: "1"}, {C: "1"}, {C: "1"}, {C: "1"}}},
{A: []Struct{{C: "2"}, {C: "2"}, {C: "2"}, {C: "2"}, {C: "2"}}},
}}
func TestValueAtPathSuccess(t *testing.T) {
var testCases = []struct {
expect []interface{}
data interface{}
path string
}{
{[]interface{}{"initial"}, data, "C"},
{[]interface{}{"value1"}, data, "A[0].C"},
{[]interface{}{"value2"}, data, "A[1].C"},
{[]interface{}{"value3"}, data, "A[2].C"},
{[]interface{}{"value3"}, data, "a[2].c"},
{[]interface{}{"value3"}, data, "A[-1].C"},
{[]interface{}{"value1", "value2", "value3"}, data, "A[].C"},
{[]interface{}{"terminal"}, data, "B . B . C"},
{[]interface{}{"initial"}, data, "A.D.X || C"},
{[]interface{}{"initial"}, data, "A[0].B || C"},
{[]interface{}{
Struct{A: []Struct{{C: "1"}, {C: "1"}, {C: "1"}, {C: "1"}, {C: "1"}}},
Struct{A: []Struct{{C: "2"}, {C: "2"}, {C: "2"}, {C: "2"}, {C: "2"}}},
}, data2, "A"},
}
for i, c := range testCases {
v, err := awsutil.ValuesAtPath(c.data, c.path)
assert.NoError(t, err, "case %d, expected no error, %s", i, c.path)
assert.Equal(t, c.expect, v, "case %d, %s", i, c.path)
}
}
func TestValueAtPathFailure(t *testing.T) {
var testCases = []struct {
expect []interface{}
errContains string
data interface{}
path string
}{
{nil, "", data, "C.x"},
{nil, "SyntaxError: Invalid token: tDot", data, ".x"},
{nil, "", data, "X.Y.Z"},
{nil, "", data, "A[100].C"},
{nil, "", data, "A[3].C"},
{nil, "", data, "B.B.C.Z"},
{nil, "", data, "z[-1].C"},
{nil, "", nil, "A.B.C"},
{[]interface{}{}, "", Struct{}, "A"},
{nil, "", data, "A[0].B.C"},
{nil, "", data, "D"},
}
for i, c := range testCases {
v, err := awsutil.ValuesAtPath(c.data, c.path)
if c.errContains != "" {
assert.Contains(t, err.Error(), c.errContains, "case %d, expected error, %s", i, c.path)
continue
} else {
assert.NoError(t, err, "case %d, expected no error, %s", i, c.path)
}
assert.Equal(t, c.expect, v, "case %d, %s", i, c.path)
}
}
func TestSetValueAtPathSuccess(t *testing.T) {
var s Struct
awsutil.SetValueAtPath(&s, "C", "test1")
awsutil.SetValueAtPath(&s, "B.B.C", "test2")
awsutil.SetValueAtPath(&s, "B.D.C", "test3")
assert.Equal(t, "test1", s.C)
assert.Equal(t, "test2", s.B.B.C)
assert.Equal(t, "test3", s.B.D.C)
awsutil.SetValueAtPath(&s, "B.*.C", "test0")
assert.Equal(t, "test0", s.B.B.C)
assert.Equal(t, "test0", s.B.D.C)
var s2 Struct
awsutil.SetValueAtPath(&s2, "b.b.c", "test0")
assert.Equal(t, "test0", s2.B.B.C)
awsutil.SetValueAtPath(&s2, "A", []Struct{{}})
assert.Equal(t, []Struct{{}}, s2.A)
str := "foo"
s3 := Struct{}
awsutil.SetValueAtPath(&s3, "b.b.c", str)
assert.Equal(t, "foo", s3.B.B.C)
s3 = Struct{B: &Struct{B: &Struct{C: str}}}
awsutil.SetValueAtPath(&s3, "b.b.c", nil)
assert.Equal(t, "", s3.B.B.C)
s3 = Struct{}
awsutil.SetValueAtPath(&s3, "b.b.c", nil)
assert.Equal(t, "", s3.B.B.C)
s3 = Struct{}
awsutil.SetValueAtPath(&s3, "b.b.c", &str)
assert.Equal(t, "foo", s3.B.B.C)
var s4 struct{ Name *string }
awsutil.SetValueAtPath(&s4, "Name", str)
assert.Equal(t, str, *s4.Name)
s4 = struct{ Name *string }{}
awsutil.SetValueAtPath(&s4, "Name", nil)
assert.Equal(t, (*string)(nil), s4.Name)
s4 = struct{ Name *string }{Name: &str}
awsutil.SetValueAtPath(&s4, "Name", nil)
assert.Equal(t, (*string)(nil), s4.Name)
s4 = struct{ Name *string }{}
awsutil.SetValueAtPath(&s4, "Name", &str)
assert.Equal(t, str, *s4.Name)
}
@@ -1,45 +0,0 @@
package client
import (
"math"
"math/rand"
"time"
"github.com/aws/aws-sdk-go/aws/request"
)
// DefaultRetryer implements basic retry logic using exponential backoff for
// most services. If you want to implement custom retry logic, implement the
// request.Retryer interface or create a structure type that composes this
// struct and override the specific methods. For example, to override only
// the MaxRetries method:
//
// type retryer struct {
// service.DefaultRetryer
// }
//
// // This implementation always has 100 max retries
// func (d retryer) MaxRetries() uint { return 100 }
type DefaultRetryer struct {
NumMaxRetries int
}
// MaxRetries returns the number of maximum returns the service will use to make
// an individual API request.
func (d DefaultRetryer) MaxRetries() int {
return d.NumMaxRetries
}
// RetryRules returns the delay duration before retrying this request again
func (d DefaultRetryer) RetryRules(r *request.Request) time.Duration {
delay := int(math.Pow(2, float64(r.RetryCount))) * (rand.Intn(30) + 30)
return time.Duration(delay) * time.Millisecond
}
// ShouldRetry returns if the request should be retried.
func (d DefaultRetryer) ShouldRetry(r *request.Request) bool {
if r.HTTPResponse.StatusCode >= 500 {
return true
}
return r.IsErrorRetryable()
}
-86
View File
@@ -1,86 +0,0 @@
package aws
import (
"net/http"
"reflect"
"testing"
"github.com/aws/aws-sdk-go/aws/credentials"
)
var testCredentials = credentials.NewStaticCredentials("AKID", "SECRET", "SESSION")
var copyTestConfig = Config{
Credentials: testCredentials,
Endpoint: String("CopyTestEndpoint"),
Region: String("COPY_TEST_AWS_REGION"),
DisableSSL: Bool(true),
HTTPClient: http.DefaultClient,
LogLevel: LogLevel(LogDebug),
Logger: NewDefaultLogger(),
MaxRetries: Int(3),
DisableParamValidation: Bool(true),
DisableComputeChecksums: Bool(true),
S3ForcePathStyle: Bool(true),
}
func TestCopy(t *testing.T) {
want := copyTestConfig
got := copyTestConfig.Copy()
if !reflect.DeepEqual(*got, want) {
t.Errorf("Copy() = %+v", got)
t.Errorf(" want %+v", want)
}
got.Region = String("other")
if got.Region == want.Region {
t.Errorf("Expect setting copy values not not reflect in source")
}
}
func TestCopyReturnsNewInstance(t *testing.T) {
want := copyTestConfig
got := copyTestConfig.Copy()
if got == &want {
t.Errorf("Copy() = %p; want different instance as source %p", got, &want)
}
}
var mergeTestZeroValueConfig = Config{}
var mergeTestConfig = Config{
Credentials: testCredentials,
Endpoint: String("MergeTestEndpoint"),
Region: String("MERGE_TEST_AWS_REGION"),
DisableSSL: Bool(true),
HTTPClient: http.DefaultClient,
LogLevel: LogLevel(LogDebug),
Logger: NewDefaultLogger(),
MaxRetries: Int(10),
DisableParamValidation: Bool(true),
DisableComputeChecksums: Bool(true),
S3ForcePathStyle: Bool(true),
}
var mergeTests = []struct {
cfg *Config
in *Config
want *Config
}{
{&Config{}, nil, &Config{}},
{&Config{}, &mergeTestZeroValueConfig, &Config{}},
{&Config{}, &mergeTestConfig, &mergeTestConfig},
}
func TestMerge(t *testing.T) {
for i, tt := range mergeTests {
got := tt.cfg.Copy()
got.MergeIn(tt.in)
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("Config %d %+v", i, tt.cfg)
t.Errorf(" Merge(%+v)", tt.in)
t.Errorf(" got %+v", got)
t.Errorf(" want %+v", tt.want)
}
}
}
@@ -1,437 +0,0 @@
package aws
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
)
var testCasesStringSlice = [][]string{
{"a", "b", "c", "d", "e"},
{"a", "b", "", "", "e"},
}
func TestStringSlice(t *testing.T) {
for idx, in := range testCasesStringSlice {
if in == nil {
continue
}
out := StringSlice(in)
assert.Len(t, out, len(in), "Unexpected len at idx %d", idx)
for i := range out {
assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx)
}
out2 := StringValueSlice(out)
assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx)
assert.Equal(t, in, out2, "Unexpected value at idx %d", idx)
}
}
var testCasesStringValueSlice = [][]*string{
{String("a"), String("b"), nil, String("c")},
}
func TestStringValueSlice(t *testing.T) {
for idx, in := range testCasesStringValueSlice {
if in == nil {
continue
}
out := StringValueSlice(in)
assert.Len(t, out, len(in), "Unexpected len at idx %d", idx)
for i := range out {
if in[i] == nil {
assert.Empty(t, out[i], "Unexpected value at idx %d", idx)
} else {
assert.Equal(t, *(in[i]), out[i], "Unexpected value at idx %d", idx)
}
}
out2 := StringSlice(out)
assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx)
for i := range out2 {
if in[i] == nil {
assert.Empty(t, *(out2[i]), "Unexpected value at idx %d", idx)
} else {
assert.Equal(t, in[i], out2[i], "Unexpected value at idx %d", idx)
}
}
}
}
var testCasesStringMap = []map[string]string{
{"a": "1", "b": "2", "c": "3"},
}
func TestStringMap(t *testing.T) {
for idx, in := range testCasesStringMap {
if in == nil {
continue
}
out := StringMap(in)
assert.Len(t, out, len(in), "Unexpected len at idx %d", idx)
for i := range out {
assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx)
}
out2 := StringValueMap(out)
assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx)
assert.Equal(t, in, out2, "Unexpected value at idx %d", idx)
}
}
var testCasesBoolSlice = [][]bool{
{true, true, false, false},
}
func TestBoolSlice(t *testing.T) {
for idx, in := range testCasesBoolSlice {
if in == nil {
continue
}
out := BoolSlice(in)
assert.Len(t, out, len(in), "Unexpected len at idx %d", idx)
for i := range out {
assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx)
}
out2 := BoolValueSlice(out)
assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx)
assert.Equal(t, in, out2, "Unexpected value at idx %d", idx)
}
}
var testCasesBoolValueSlice = [][]*bool{}
func TestBoolValueSlice(t *testing.T) {
for idx, in := range testCasesBoolValueSlice {
if in == nil {
continue
}
out := BoolValueSlice(in)
assert.Len(t, out, len(in), "Unexpected len at idx %d", idx)
for i := range out {
if in[i] == nil {
assert.Empty(t, out[i], "Unexpected value at idx %d", idx)
} else {
assert.Equal(t, *(in[i]), out[i], "Unexpected value at idx %d", idx)
}
}
out2 := BoolSlice(out)
assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx)
for i := range out2 {
if in[i] == nil {
assert.Empty(t, *(out2[i]), "Unexpected value at idx %d", idx)
} else {
assert.Equal(t, in[i], out2[i], "Unexpected value at idx %d", idx)
}
}
}
}
var testCasesBoolMap = []map[string]bool{
{"a": true, "b": false, "c": true},
}
func TestBoolMap(t *testing.T) {
for idx, in := range testCasesBoolMap {
if in == nil {
continue
}
out := BoolMap(in)
assert.Len(t, out, len(in), "Unexpected len at idx %d", idx)
for i := range out {
assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx)
}
out2 := BoolValueMap(out)
assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx)
assert.Equal(t, in, out2, "Unexpected value at idx %d", idx)
}
}
var testCasesIntSlice = [][]int{
{1, 2, 3, 4},
}
func TestIntSlice(t *testing.T) {
for idx, in := range testCasesIntSlice {
if in == nil {
continue
}
out := IntSlice(in)
assert.Len(t, out, len(in), "Unexpected len at idx %d", idx)
for i := range out {
assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx)
}
out2 := IntValueSlice(out)
assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx)
assert.Equal(t, in, out2, "Unexpected value at idx %d", idx)
}
}
var testCasesIntValueSlice = [][]*int{}
func TestIntValueSlice(t *testing.T) {
for idx, in := range testCasesIntValueSlice {
if in == nil {
continue
}
out := IntValueSlice(in)
assert.Len(t, out, len(in), "Unexpected len at idx %d", idx)
for i := range out {
if in[i] == nil {
assert.Empty(t, out[i], "Unexpected value at idx %d", idx)
} else {
assert.Equal(t, *(in[i]), out[i], "Unexpected value at idx %d", idx)
}
}
out2 := IntSlice(out)
assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx)
for i := range out2 {
if in[i] == nil {
assert.Empty(t, *(out2[i]), "Unexpected value at idx %d", idx)
} else {
assert.Equal(t, in[i], out2[i], "Unexpected value at idx %d", idx)
}
}
}
}
var testCasesIntMap = []map[string]int{
{"a": 3, "b": 2, "c": 1},
}
func TestIntMap(t *testing.T) {
for idx, in := range testCasesIntMap {
if in == nil {
continue
}
out := IntMap(in)
assert.Len(t, out, len(in), "Unexpected len at idx %d", idx)
for i := range out {
assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx)
}
out2 := IntValueMap(out)
assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx)
assert.Equal(t, in, out2, "Unexpected value at idx %d", idx)
}
}
var testCasesInt64Slice = [][]int64{
{1, 2, 3, 4},
}
func TestInt64Slice(t *testing.T) {
for idx, in := range testCasesInt64Slice {
if in == nil {
continue
}
out := Int64Slice(in)
assert.Len(t, out, len(in), "Unexpected len at idx %d", idx)
for i := range out {
assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx)
}
out2 := Int64ValueSlice(out)
assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx)
assert.Equal(t, in, out2, "Unexpected value at idx %d", idx)
}
}
var testCasesInt64ValueSlice = [][]*int64{}
func TestInt64ValueSlice(t *testing.T) {
for idx, in := range testCasesInt64ValueSlice {
if in == nil {
continue
}
out := Int64ValueSlice(in)
assert.Len(t, out, len(in), "Unexpected len at idx %d", idx)
for i := range out {
if in[i] == nil {
assert.Empty(t, out[i], "Unexpected value at idx %d", idx)
} else {
assert.Equal(t, *(in[i]), out[i], "Unexpected value at idx %d", idx)
}
}
out2 := Int64Slice(out)
assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx)
for i := range out2 {
if in[i] == nil {
assert.Empty(t, *(out2[i]), "Unexpected value at idx %d", idx)
} else {
assert.Equal(t, in[i], out2[i], "Unexpected value at idx %d", idx)
}
}
}
}
var testCasesInt64Map = []map[string]int64{
{"a": 3, "b": 2, "c": 1},
}
func TestInt64Map(t *testing.T) {
for idx, in := range testCasesInt64Map {
if in == nil {
continue
}
out := Int64Map(in)
assert.Len(t, out, len(in), "Unexpected len at idx %d", idx)
for i := range out {
assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx)
}
out2 := Int64ValueMap(out)
assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx)
assert.Equal(t, in, out2, "Unexpected value at idx %d", idx)
}
}
var testCasesFloat64Slice = [][]float64{
{1, 2, 3, 4},
}
func TestFloat64Slice(t *testing.T) {
for idx, in := range testCasesFloat64Slice {
if in == nil {
continue
}
out := Float64Slice(in)
assert.Len(t, out, len(in), "Unexpected len at idx %d", idx)
for i := range out {
assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx)
}
out2 := Float64ValueSlice(out)
assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx)
assert.Equal(t, in, out2, "Unexpected value at idx %d", idx)
}
}
var testCasesFloat64ValueSlice = [][]*float64{}
func TestFloat64ValueSlice(t *testing.T) {
for idx, in := range testCasesFloat64ValueSlice {
if in == nil {
continue
}
out := Float64ValueSlice(in)
assert.Len(t, out, len(in), "Unexpected len at idx %d", idx)
for i := range out {
if in[i] == nil {
assert.Empty(t, out[i], "Unexpected value at idx %d", idx)
} else {
assert.Equal(t, *(in[i]), out[i], "Unexpected value at idx %d", idx)
}
}
out2 := Float64Slice(out)
assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx)
for i := range out2 {
if in[i] == nil {
assert.Empty(t, *(out2[i]), "Unexpected value at idx %d", idx)
} else {
assert.Equal(t, in[i], out2[i], "Unexpected value at idx %d", idx)
}
}
}
}
var testCasesFloat64Map = []map[string]float64{
{"a": 3, "b": 2, "c": 1},
}
func TestFloat64Map(t *testing.T) {
for idx, in := range testCasesFloat64Map {
if in == nil {
continue
}
out := Float64Map(in)
assert.Len(t, out, len(in), "Unexpected len at idx %d", idx)
for i := range out {
assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx)
}
out2 := Float64ValueMap(out)
assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx)
assert.Equal(t, in, out2, "Unexpected value at idx %d", idx)
}
}
var testCasesTimeSlice = [][]time.Time{
{time.Now(), time.Now().AddDate(100, 0, 0)},
}
func TestTimeSlice(t *testing.T) {
for idx, in := range testCasesTimeSlice {
if in == nil {
continue
}
out := TimeSlice(in)
assert.Len(t, out, len(in), "Unexpected len at idx %d", idx)
for i := range out {
assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx)
}
out2 := TimeValueSlice(out)
assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx)
assert.Equal(t, in, out2, "Unexpected value at idx %d", idx)
}
}
var testCasesTimeValueSlice = [][]*time.Time{}
func TestTimeValueSlice(t *testing.T) {
for idx, in := range testCasesTimeValueSlice {
if in == nil {
continue
}
out := TimeValueSlice(in)
assert.Len(t, out, len(in), "Unexpected len at idx %d", idx)
for i := range out {
if in[i] == nil {
assert.Empty(t, out[i], "Unexpected value at idx %d", idx)
} else {
assert.Equal(t, *(in[i]), out[i], "Unexpected value at idx %d", idx)
}
}
out2 := TimeSlice(out)
assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx)
for i := range out2 {
if in[i] == nil {
assert.Empty(t, *(out2[i]), "Unexpected value at idx %d", idx)
} else {
assert.Equal(t, in[i], out2[i], "Unexpected value at idx %d", idx)
}
}
}
}
var testCasesTimeMap = []map[string]time.Time{
{"a": time.Now().AddDate(-100, 0, 0), "b": time.Now()},
}
func TestTimeMap(t *testing.T) {
for idx, in := range testCasesTimeMap {
if in == nil {
continue
}
out := TimeMap(in)
assert.Len(t, out, len(in), "Unexpected len at idx %d", idx)
for i := range out {
assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx)
}
out2 := TimeValueMap(out)
assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx)
assert.Equal(t, in, out2, "Unexpected value at idx %d", idx)
}
}
@@ -1,113 +0,0 @@
package corehandlers_test
import (
"fmt"
"net/http"
"os"
"testing"
"github.com/stretchr/testify/assert"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/corehandlers"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/request"
"github.com/aws/aws-sdk-go/awstesting"
)
func TestValidateEndpointHandler(t *testing.T) {
os.Clearenv()
svc := awstesting.NewClient(aws.NewConfig().WithRegion("us-west-2"))
svc.Handlers.Clear()
svc.Handlers.Validate.PushBackNamed(corehandlers.ValidateEndpointHandler)
req := svc.NewRequest(&request.Operation{Name: "Operation"}, nil, nil)
err := req.Build()
assert.NoError(t, err)
}
func TestValidateEndpointHandlerErrorRegion(t *testing.T) {
os.Clearenv()
svc := awstesting.NewClient()
svc.Handlers.Clear()
svc.Handlers.Validate.PushBackNamed(corehandlers.ValidateEndpointHandler)
req := svc.NewRequest(&request.Operation{Name: "Operation"}, nil, nil)
err := req.Build()
assert.Error(t, err)
assert.Equal(t, aws.ErrMissingRegion, err)
}
type mockCredsProvider struct {
expired bool
retrieveCalled bool
}
func (m *mockCredsProvider) Retrieve() (credentials.Value, error) {
m.retrieveCalled = true
return credentials.Value{}, nil
}
func (m *mockCredsProvider) IsExpired() bool {
return m.expired
}
func TestAfterRetryRefreshCreds(t *testing.T) {
os.Clearenv()
credProvider := &mockCredsProvider{}
svc := awstesting.NewClient(&aws.Config{
Credentials: credentials.NewCredentials(credProvider),
MaxRetries: aws.Int(1),
})
svc.Handlers.Clear()
svc.Handlers.ValidateResponse.PushBack(func(r *request.Request) {
r.Error = awserr.New("UnknownError", "", nil)
r.HTTPResponse = &http.Response{StatusCode: 400}
})
svc.Handlers.UnmarshalError.PushBack(func(r *request.Request) {
r.Error = awserr.New("ExpiredTokenException", "", nil)
})
svc.Handlers.AfterRetry.PushBackNamed(corehandlers.AfterRetryHandler)
assert.True(t, svc.Config.Credentials.IsExpired(), "Expect to start out expired")
assert.False(t, credProvider.retrieveCalled)
req := svc.NewRequest(&request.Operation{Name: "Operation"}, nil, nil)
req.Send()
assert.True(t, svc.Config.Credentials.IsExpired())
assert.False(t, credProvider.retrieveCalled)
_, err := svc.Config.Credentials.Get()
assert.NoError(t, err)
assert.True(t, credProvider.retrieveCalled)
}
type testSendHandlerTransport struct{}
func (t *testSendHandlerTransport) RoundTrip(r *http.Request) (*http.Response, error) {
return nil, fmt.Errorf("mock error")
}
func TestSendHandlerError(t *testing.T) {
svc := awstesting.NewClient(&aws.Config{
HTTPClient: &http.Client{
Transport: &testSendHandlerTransport{},
},
})
svc.Handlers.Clear()
svc.Handlers.Send.PushBackNamed(corehandlers.SendHandler)
r := svc.NewRequest(&request.Operation{Name: "Operation"}, nil, nil)
r.Send()
assert.Error(t, r.Error)
assert.NotNil(t, r.HTTPResponse)
}
@@ -1,144 +0,0 @@
package corehandlers
import (
"fmt"
"reflect"
"strconv"
"strings"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/request"
)
// ValidateParametersHandler is a request handler to validate the input parameters.
// Validating parameters only has meaning if done prior to the request being sent.
var ValidateParametersHandler = request.NamedHandler{Name: "core.ValidateParametersHandler", Fn: func(r *request.Request) {
if r.ParamsFilled() {
v := validator{errors: []string{}}
v.validateAny(reflect.ValueOf(r.Params), "")
if count := len(v.errors); count > 0 {
format := "%d validation errors:\n- %s"
msg := fmt.Sprintf(format, count, strings.Join(v.errors, "\n- "))
r.Error = awserr.New("InvalidParameter", msg, nil)
}
}
}}
// A validator validates values. Collects validations errors which occurs.
type validator struct {
errors []string
}
// validateAny will validate any struct, slice or map type. All validations
// are also performed recursively for nested types.
func (v *validator) validateAny(value reflect.Value, path string) {
value = reflect.Indirect(value)
if !value.IsValid() {
return
}
switch value.Kind() {
case reflect.Struct:
v.validateStruct(value, path)
case reflect.Slice:
for i := 0; i < value.Len(); i++ {
v.validateAny(value.Index(i), path+fmt.Sprintf("[%d]", i))
}
case reflect.Map:
for _, n := range value.MapKeys() {
v.validateAny(value.MapIndex(n), path+fmt.Sprintf("[%q]", n.String()))
}
}
}
// validateStruct will validate the struct value's fields. If the structure has
// nested types those types will be validated also.
func (v *validator) validateStruct(value reflect.Value, path string) {
prefix := "."
if path == "" {
prefix = ""
}
for i := 0; i < value.Type().NumField(); i++ {
f := value.Type().Field(i)
if strings.ToLower(f.Name[0:1]) == f.Name[0:1] {
continue
}
fvalue := value.FieldByName(f.Name)
err := validateField(f, fvalue, validateFieldRequired, validateFieldMin)
if err != nil {
v.errors = append(v.errors, fmt.Sprintf("%s: %s", err.Error(), path+prefix+f.Name))
continue
}
v.validateAny(fvalue, path+prefix+f.Name)
}
}
type validatorFunc func(f reflect.StructField, fvalue reflect.Value) error
func validateField(f reflect.StructField, fvalue reflect.Value, funcs ...validatorFunc) error {
for _, fn := range funcs {
if err := fn(f, fvalue); err != nil {
return err
}
}
return nil
}
// Validates that a field has a valid value provided for required fields.
func validateFieldRequired(f reflect.StructField, fvalue reflect.Value) error {
if f.Tag.Get("required") == "" {
return nil
}
switch fvalue.Kind() {
case reflect.Ptr, reflect.Slice, reflect.Map:
if fvalue.IsNil() {
return fmt.Errorf("missing required parameter")
}
default:
if !fvalue.IsValid() {
return fmt.Errorf("missing required parameter")
}
}
return nil
}
// Validates that if a value is provided for a field, that value must be at
// least a minimum length.
func validateFieldMin(f reflect.StructField, fvalue reflect.Value) error {
minStr := f.Tag.Get("min")
if minStr == "" {
return nil
}
min, _ := strconv.ParseInt(minStr, 10, 64)
kind := fvalue.Kind()
if kind == reflect.Ptr {
if fvalue.IsNil() {
return nil
}
fvalue = fvalue.Elem()
}
switch fvalue.Kind() {
case reflect.String:
if int64(fvalue.Len()) < min {
return fmt.Errorf("field too short, minimum length %d", min)
}
case reflect.Slice, reflect.Map:
if fvalue.IsNil() {
return nil
}
if int64(fvalue.Len()) < min {
return fmt.Errorf("field too short, minimum length %d", min)
}
// TODO min can also apply to number minimum value.
}
return nil
}
@@ -1,134 +0,0 @@
package corehandlers_test
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/client"
"github.com/aws/aws-sdk-go/aws/client/metadata"
"github.com/aws/aws-sdk-go/aws/corehandlers"
"github.com/aws/aws-sdk-go/aws/request"
"github.com/stretchr/testify/require"
)
var testSvc = func() *client.Client {
s := &client.Client{
Config: aws.Config{},
ClientInfo: metadata.ClientInfo{
ServiceName: "mock-service",
APIVersion: "2015-01-01",
},
}
return s
}()
type StructShape struct {
RequiredList []*ConditionalStructShape `required:"true"`
RequiredMap map[string]*ConditionalStructShape `required:"true"`
RequiredBool *bool `required:"true"`
OptionalStruct *ConditionalStructShape
hiddenParameter *string
metadataStructureShape
}
type metadataStructureShape struct {
SDKShapeTraits bool
}
type ConditionalStructShape struct {
Name *string `required:"true"`
SDKShapeTraits bool
}
func TestNoErrors(t *testing.T) {
input := &StructShape{
RequiredList: []*ConditionalStructShape{},
RequiredMap: map[string]*ConditionalStructShape{
"key1": {Name: aws.String("Name")},
"key2": {Name: aws.String("Name")},
},
RequiredBool: aws.Bool(true),
OptionalStruct: &ConditionalStructShape{Name: aws.String("Name")},
}
req := testSvc.NewRequest(&request.Operation{}, input, nil)
corehandlers.ValidateParametersHandler.Fn(req)
require.NoError(t, req.Error)
}
func TestMissingRequiredParameters(t *testing.T) {
input := &StructShape{}
req := testSvc.NewRequest(&request.Operation{}, input, nil)
corehandlers.ValidateParametersHandler.Fn(req)
require.Error(t, req.Error)
assert.Equal(t, "InvalidParameter", req.Error.(awserr.Error).Code())
assert.Equal(t, "3 validation errors:\n- missing required parameter: RequiredList\n- missing required parameter: RequiredMap\n- missing required parameter: RequiredBool", req.Error.(awserr.Error).Message())
}
func TestNestedMissingRequiredParameters(t *testing.T) {
input := &StructShape{
RequiredList: []*ConditionalStructShape{{}},
RequiredMap: map[string]*ConditionalStructShape{
"key1": {Name: aws.String("Name")},
"key2": {},
},
RequiredBool: aws.Bool(true),
OptionalStruct: &ConditionalStructShape{},
}
req := testSvc.NewRequest(&request.Operation{}, input, nil)
corehandlers.ValidateParametersHandler.Fn(req)
require.Error(t, req.Error)
assert.Equal(t, "InvalidParameter", req.Error.(awserr.Error).Code())
assert.Equal(t, "3 validation errors:\n- missing required parameter: RequiredList[0].Name\n- missing required parameter: RequiredMap[\"key2\"].Name\n- missing required parameter: OptionalStruct.Name", req.Error.(awserr.Error).Message())
}
type testInput struct {
StringField string `min:"5"`
PtrStrField *string `min:"2"`
ListField []string `min:"3"`
MapField map[string]string `min:"4"`
}
var testsFieldMin = []struct {
err awserr.Error
in testInput
}{
{
err: awserr.New("InvalidParameter", "1 validation errors:\n- field too short, minimum length 5: StringField", nil),
in: testInput{StringField: "abcd"},
},
{
err: awserr.New("InvalidParameter", "2 validation errors:\n- field too short, minimum length 5: StringField\n- field too short, minimum length 3: ListField", nil),
in: testInput{StringField: "abcd", ListField: []string{"a", "b"}},
},
{
err: awserr.New("InvalidParameter", "3 validation errors:\n- field too short, minimum length 5: StringField\n- field too short, minimum length 3: ListField\n- field too short, minimum length 4: MapField", nil),
in: testInput{StringField: "abcd", ListField: []string{"a", "b"}, MapField: map[string]string{"a": "a", "b": "b"}},
},
{
err: awserr.New("InvalidParameter", "1 validation errors:\n- field too short, minimum length 2: PtrStrField", nil),
in: testInput{StringField: "abcde", PtrStrField: aws.String("v")},
},
{
err: nil,
in: testInput{StringField: "abcde", PtrStrField: aws.String("value"),
ListField: []string{"a", "b", "c"}, MapField: map[string]string{"a": "a", "b": "b", "c": "c", "d": "d"}},
},
}
func TestValidateFieldMinParameter(t *testing.T) {
for i, c := range testsFieldMin {
req := testSvc.NewRequest(&request.Operation{}, &c.in, nil)
corehandlers.ValidateParametersHandler.Fn(req)
require.Equal(t, c.err, req.Error, "%d case failed", i)
}
}
@@ -1,73 +0,0 @@
package credentials
import (
"testing"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/stretchr/testify/assert"
)
func TestChainProviderGet(t *testing.T) {
p := &ChainProvider{
Providers: []Provider{
&stubProvider{err: awserr.New("FirstError", "first provider error", nil)},
&stubProvider{err: awserr.New("SecondError", "second provider error", nil)},
&stubProvider{
creds: Value{
AccessKeyID: "AKID",
SecretAccessKey: "SECRET",
SessionToken: "",
},
},
},
}
creds, err := p.Retrieve()
assert.Nil(t, err, "Expect no error")
assert.Equal(t, "AKID", creds.AccessKeyID, "Expect access key ID to match")
assert.Equal(t, "SECRET", creds.SecretAccessKey, "Expect secret access key to match")
assert.Empty(t, creds.SessionToken, "Expect session token to be empty")
}
func TestChainProviderIsExpired(t *testing.T) {
stubProvider := &stubProvider{expired: true}
p := &ChainProvider{
Providers: []Provider{
stubProvider,
},
}
assert.True(t, p.IsExpired(), "Expect expired to be true before any Retrieve")
_, err := p.Retrieve()
assert.Nil(t, err, "Expect no error")
assert.False(t, p.IsExpired(), "Expect not expired after retrieve")
stubProvider.expired = true
assert.True(t, p.IsExpired(), "Expect return of expired provider")
_, err = p.Retrieve()
assert.False(t, p.IsExpired(), "Expect not expired after retrieve")
}
func TestChainProviderWithNoProvider(t *testing.T) {
p := &ChainProvider{
Providers: []Provider{},
}
assert.True(t, p.IsExpired(), "Expect expired with no providers")
_, err := p.Retrieve()
assert.Equal(t, ErrNoValidProvidersFoundInChain, err, "Expect no providers error returned")
}
func TestChainProviderWithNoValidProvider(t *testing.T) {
p := &ChainProvider{
Providers: []Provider{
&stubProvider{err: awserr.New("FirstError", "first provider error", nil)},
&stubProvider{err: awserr.New("SecondError", "second provider error", nil)},
},
}
assert.True(t, p.IsExpired(), "Expect expired with no providers")
_, err := p.Retrieve()
assert.Equal(t, ErrNoValidProvidersFoundInChain, err, "Expect no providers error returned")
}
@@ -1,62 +0,0 @@
package credentials
import (
"testing"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/stretchr/testify/assert"
)
type stubProvider struct {
creds Value
expired bool
err error
}
func (s *stubProvider) Retrieve() (Value, error) {
s.expired = false
return s.creds, s.err
}
func (s *stubProvider) IsExpired() bool {
return s.expired
}
func TestCredentialsGet(t *testing.T) {
c := NewCredentials(&stubProvider{
creds: Value{
AccessKeyID: "AKID",
SecretAccessKey: "SECRET",
SessionToken: "",
},
expired: true,
})
creds, err := c.Get()
assert.Nil(t, err, "Expected no error")
assert.Equal(t, "AKID", creds.AccessKeyID, "Expect access key ID to match")
assert.Equal(t, "SECRET", creds.SecretAccessKey, "Expect secret access key to match")
assert.Empty(t, creds.SessionToken, "Expect session token to be empty")
}
func TestCredentialsGetWithError(t *testing.T) {
c := NewCredentials(&stubProvider{err: awserr.New("provider error", "", nil), expired: true})
_, err := c.Get()
assert.Equal(t, "provider error", err.(awserr.Error).Code(), "Expected provider error")
}
func TestCredentialsExpire(t *testing.T) {
stub := &stubProvider{}
c := NewCredentials(stub)
stub.expired = false
assert.True(t, c.IsExpired(), "Expected to start out expired")
c.Expire()
assert.True(t, c.IsExpired(), "Expected to be expired")
c.forceRefresh = false
assert.False(t, c.IsExpired(), "Expected not to be expired")
stub.expired = true
assert.True(t, c.IsExpired(), "Expected to be expired")
}
@@ -1,159 +0,0 @@
package ec2rolecreds_test
import (
"fmt"
"net/http"
"net/http/httptest"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds"
"github.com/aws/aws-sdk-go/aws/ec2metadata"
"github.com/aws/aws-sdk-go/aws/session"
)
const credsRespTmpl = `{
"Code": "Success",
"Type": "AWS-HMAC",
"AccessKeyId" : "accessKey",
"SecretAccessKey" : "secret",
"Token" : "token",
"Expiration" : "%s",
"LastUpdated" : "2009-11-23T0:00:00Z"
}`
const credsFailRespTmpl = `{
"Code": "ErrorCode",
"Message": "ErrorMsg",
"LastUpdated": "2009-11-23T0:00:00Z"
}`
func initTestServer(expireOn string, failAssume bool) *httptest.Server {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/latest/meta-data/iam/security-credentials" {
fmt.Fprintln(w, "RoleName")
} else if r.URL.Path == "/latest/meta-data/iam/security-credentials/RoleName" {
if failAssume {
fmt.Fprintf(w, credsFailRespTmpl)
} else {
fmt.Fprintf(w, credsRespTmpl, expireOn)
}
} else {
http.Error(w, "bad request", http.StatusBadRequest)
}
}))
return server
}
func TestEC2RoleProvider(t *testing.T) {
server := initTestServer("2014-12-16T01:51:37Z", false)
defer server.Close()
p := &ec2rolecreds.EC2RoleProvider{
Client: ec2metadata.New(session.New(), &aws.Config{Endpoint: aws.String(server.URL + "/latest")}),
}
creds, err := p.Retrieve()
assert.Nil(t, err, "Expect no error, %v", err)
assert.Equal(t, "accessKey", creds.AccessKeyID, "Expect access key ID to match")
assert.Equal(t, "secret", creds.SecretAccessKey, "Expect secret access key to match")
assert.Equal(t, "token", creds.SessionToken, "Expect session token to match")
}
func TestEC2RoleProviderFailAssume(t *testing.T) {
server := initTestServer("2014-12-16T01:51:37Z", true)
defer server.Close()
p := &ec2rolecreds.EC2RoleProvider{
Client: ec2metadata.New(session.New(), &aws.Config{Endpoint: aws.String(server.URL + "/latest")}),
}
creds, err := p.Retrieve()
assert.Error(t, err, "Expect error")
e := err.(awserr.Error)
assert.Equal(t, "ErrorCode", e.Code())
assert.Equal(t, "ErrorMsg", e.Message())
assert.Nil(t, e.OrigErr())
assert.Equal(t, "", creds.AccessKeyID, "Expect access key ID to match")
assert.Equal(t, "", creds.SecretAccessKey, "Expect secret access key to match")
assert.Equal(t, "", creds.SessionToken, "Expect session token to match")
}
func TestEC2RoleProviderIsExpired(t *testing.T) {
server := initTestServer("2014-12-16T01:51:37Z", false)
defer server.Close()
p := &ec2rolecreds.EC2RoleProvider{
Client: ec2metadata.New(session.New(), &aws.Config{Endpoint: aws.String(server.URL + "/latest")}),
}
p.CurrentTime = func() time.Time {
return time.Date(2014, 12, 15, 21, 26, 0, 0, time.UTC)
}
assert.True(t, p.IsExpired(), "Expect creds to be expired before retrieve.")
_, err := p.Retrieve()
assert.Nil(t, err, "Expect no error, %v", err)
assert.False(t, p.IsExpired(), "Expect creds to not be expired after retrieve.")
p.CurrentTime = func() time.Time {
return time.Date(3014, 12, 15, 21, 26, 0, 0, time.UTC)
}
assert.True(t, p.IsExpired(), "Expect creds to be expired.")
}
func TestEC2RoleProviderExpiryWindowIsExpired(t *testing.T) {
server := initTestServer("2014-12-16T01:51:37Z", false)
defer server.Close()
p := &ec2rolecreds.EC2RoleProvider{
Client: ec2metadata.New(session.New(), &aws.Config{Endpoint: aws.String(server.URL + "/latest")}),
ExpiryWindow: time.Hour * 1,
}
p.CurrentTime = func() time.Time {
return time.Date(2014, 12, 15, 0, 51, 37, 0, time.UTC)
}
assert.True(t, p.IsExpired(), "Expect creds to be expired before retrieve.")
_, err := p.Retrieve()
assert.Nil(t, err, "Expect no error, %v", err)
assert.False(t, p.IsExpired(), "Expect creds to not be expired after retrieve.")
p.CurrentTime = func() time.Time {
return time.Date(2014, 12, 16, 0, 55, 37, 0, time.UTC)
}
assert.True(t, p.IsExpired(), "Expect creds to be expired.")
}
func BenchmarkEC3RoleProvider(b *testing.B) {
server := initTestServer("2014-12-16T01:51:37Z", false)
defer server.Close()
p := &ec2rolecreds.EC2RoleProvider{
Client: ec2metadata.New(session.New(), &aws.Config{Endpoint: aws.String(server.URL + "/latest")}),
}
_, err := p.Retrieve()
if err != nil {
b.Fatal(err)
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
if _, err := p.Retrieve(); err != nil {
b.Fatal(err)
}
}
}
@@ -1,70 +0,0 @@
package credentials
import (
"github.com/stretchr/testify/assert"
"os"
"testing"
)
func TestEnvProviderRetrieve(t *testing.T) {
os.Clearenv()
os.Setenv("AWS_ACCESS_KEY_ID", "access")
os.Setenv("AWS_SECRET_ACCESS_KEY", "secret")
os.Setenv("AWS_SESSION_TOKEN", "token")
e := EnvProvider{}
creds, err := e.Retrieve()
assert.Nil(t, err, "Expect no error")
assert.Equal(t, "access", creds.AccessKeyID, "Expect access key ID to match")
assert.Equal(t, "secret", creds.SecretAccessKey, "Expect secret access key to match")
assert.Equal(t, "token", creds.SessionToken, "Expect session token to match")
}
func TestEnvProviderIsExpired(t *testing.T) {
os.Clearenv()
os.Setenv("AWS_ACCESS_KEY_ID", "access")
os.Setenv("AWS_SECRET_ACCESS_KEY", "secret")
os.Setenv("AWS_SESSION_TOKEN", "token")
e := EnvProvider{}
assert.True(t, e.IsExpired(), "Expect creds to be expired before retrieve.")
_, err := e.Retrieve()
assert.Nil(t, err, "Expect no error")
assert.False(t, e.IsExpired(), "Expect creds to not be expired after retrieve.")
}
func TestEnvProviderNoAccessKeyID(t *testing.T) {
os.Clearenv()
os.Setenv("AWS_SECRET_ACCESS_KEY", "secret")
e := EnvProvider{}
creds, err := e.Retrieve()
assert.Equal(t, ErrAccessKeyIDNotFound, err, "ErrAccessKeyIDNotFound expected, but was %#v error: %#v", creds, err)
}
func TestEnvProviderNoSecretAccessKey(t *testing.T) {
os.Clearenv()
os.Setenv("AWS_ACCESS_KEY_ID", "access")
e := EnvProvider{}
creds, err := e.Retrieve()
assert.Equal(t, ErrSecretAccessKeyNotFound, err, "ErrSecretAccessKeyNotFound expected, but was %#v error: %#v", creds, err)
}
func TestEnvProviderAlternateNames(t *testing.T) {
os.Clearenv()
os.Setenv("AWS_ACCESS_KEY", "access")
os.Setenv("AWS_SECRET_KEY", "secret")
e := EnvProvider{}
creds, err := e.Retrieve()
assert.Nil(t, err, "Expect no error")
assert.Equal(t, "access", creds.AccessKeyID, "Expected access key ID")
assert.Equal(t, "secret", creds.SecretAccessKey, "Expected secret access key")
assert.Empty(t, creds.SessionToken, "Expected no token")
}
@@ -1,100 +0,0 @@
package credentials
import (
"github.com/stretchr/testify/assert"
"os"
"testing"
)
func TestSharedCredentialsProvider(t *testing.T) {
os.Clearenv()
p := SharedCredentialsProvider{Filename: "example.ini", Profile: ""}
creds, err := p.Retrieve()
assert.Nil(t, err, "Expect no error")
assert.Equal(t, "accessKey", creds.AccessKeyID, "Expect access key ID to match")
assert.Equal(t, "secret", creds.SecretAccessKey, "Expect secret access key to match")
assert.Equal(t, "token", creds.SessionToken, "Expect session token to match")
}
func TestSharedCredentialsProviderIsExpired(t *testing.T) {
os.Clearenv()
p := SharedCredentialsProvider{Filename: "example.ini", Profile: ""}
assert.True(t, p.IsExpired(), "Expect creds to be expired before retrieve")
_, err := p.Retrieve()
assert.Nil(t, err, "Expect no error")
assert.False(t, p.IsExpired(), "Expect creds to not be expired after retrieve")
}
func TestSharedCredentialsProviderWithAWS_SHARED_CREDENTIALS_FILE(t *testing.T) {
os.Clearenv()
os.Setenv("AWS_SHARED_CREDENTIALS_FILE", "example.ini")
p := SharedCredentialsProvider{}
creds, err := p.Retrieve()
assert.Nil(t, err, "Expect no error")
assert.Equal(t, "accessKey", creds.AccessKeyID, "Expect access key ID to match")
assert.Equal(t, "secret", creds.SecretAccessKey, "Expect secret access key to match")
assert.Equal(t, "token", creds.SessionToken, "Expect session token to match")
}
func TestSharedCredentialsProviderWithAWS_PROFILE(t *testing.T) {
os.Clearenv()
os.Setenv("AWS_PROFILE", "no_token")
p := SharedCredentialsProvider{Filename: "example.ini", Profile: ""}
creds, err := p.Retrieve()
assert.Nil(t, err, "Expect no error")
assert.Equal(t, "accessKey", creds.AccessKeyID, "Expect access key ID to match")
assert.Equal(t, "secret", creds.SecretAccessKey, "Expect secret access key to match")
assert.Empty(t, creds.SessionToken, "Expect no token")
}
func TestSharedCredentialsProviderWithoutTokenFromProfile(t *testing.T) {
os.Clearenv()
p := SharedCredentialsProvider{Filename: "example.ini", Profile: "no_token"}
creds, err := p.Retrieve()
assert.Nil(t, err, "Expect no error")
assert.Equal(t, "accessKey", creds.AccessKeyID, "Expect access key ID to match")
assert.Equal(t, "secret", creds.SecretAccessKey, "Expect secret access key to match")
assert.Empty(t, creds.SessionToken, "Expect no token")
}
func TestSharedCredentialsProviderColonInCredFile(t *testing.T) {
os.Clearenv()
p := SharedCredentialsProvider{Filename: "example.ini", Profile: "with_colon"}
creds, err := p.Retrieve()
assert.Nil(t, err, "Expect no error")
assert.Equal(t, "accessKey", creds.AccessKeyID, "Expect access key ID to match")
assert.Equal(t, "secret", creds.SecretAccessKey, "Expect secret access key to match")
assert.Empty(t, creds.SessionToken, "Expect no token")
}
func BenchmarkSharedCredentialsProvider(b *testing.B) {
os.Clearenv()
p := SharedCredentialsProvider{Filename: "example.ini", Profile: ""}
_, err := p.Retrieve()
if err != nil {
b.Fatal(err)
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, err := p.Retrieve()
if err != nil {
b.Fatal(err)
}
}
}
@@ -1,34 +0,0 @@
package credentials
import (
"github.com/stretchr/testify/assert"
"testing"
)
func TestStaticProviderGet(t *testing.T) {
s := StaticProvider{
Value: Value{
AccessKeyID: "AKID",
SecretAccessKey: "SECRET",
SessionToken: "",
},
}
creds, err := s.Retrieve()
assert.Nil(t, err, "Expect no error")
assert.Equal(t, "AKID", creds.AccessKeyID, "Expect access key ID to match")
assert.Equal(t, "SECRET", creds.SecretAccessKey, "Expect secret access key to match")
assert.Empty(t, creds.SessionToken, "Expect no session token")
}
func TestStaticProviderIsExpired(t *testing.T) {
s := StaticProvider{
Value: Value{
AccessKeyID: "AKID",
SecretAccessKey: "SECRET",
SessionToken: "",
},
}
assert.False(t, s.IsExpired(), "Expect static credentials to never expire")
}
@@ -1,56 +0,0 @@
package stscreds
import (
"testing"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/sts"
"github.com/stretchr/testify/assert"
)
type stubSTS struct {
}
func (s *stubSTS) AssumeRole(input *sts.AssumeRoleInput) (*sts.AssumeRoleOutput, error) {
expiry := time.Now().Add(60 * time.Minute)
return &sts.AssumeRoleOutput{
Credentials: &sts.Credentials{
// Just reflect the role arn to the provider.
AccessKeyId: input.RoleArn,
SecretAccessKey: aws.String("assumedSecretAccessKey"),
SessionToken: aws.String("assumedSessionToken"),
Expiration: &expiry,
},
}, nil
}
func TestAssumeRoleProvider(t *testing.T) {
stub := &stubSTS{}
p := &AssumeRoleProvider{
Client: stub,
RoleARN: "roleARN",
}
creds, err := p.Retrieve()
assert.Nil(t, err, "Expect no error")
assert.Equal(t, "roleARN", creds.AccessKeyID, "Expect access key ID to be reflected role ARN")
assert.Equal(t, "assumedSecretAccessKey", creds.SecretAccessKey, "Expect secret access key to match")
assert.Equal(t, "assumedSessionToken", creds.SessionToken, "Expect session token to match")
}
func BenchmarkAssumeRoleProvider(b *testing.B) {
stub := &stubSTS{}
p := &AssumeRoleProvider{
Client: stub,
RoleARN: "roleARN",
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
if _, err := p.Retrieve(); err != nil {
b.Fatal(err)
}
}
}
@@ -1,76 +0,0 @@
// Package defaults is a collection of helpers to retrieve the SDK's default
// configuration and handlers.
package defaults
import (
"net/http"
"os"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/corehandlers"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds"
"github.com/aws/aws-sdk-go/aws/ec2metadata"
"github.com/aws/aws-sdk-go/aws/request"
"github.com/aws/aws-sdk-go/private/endpoints"
)
// A Defaults provides a collection of default values for SDK clients.
type Defaults struct {
Config *aws.Config
Handlers request.Handlers
}
// Get returns the SDK's default values with Config and handlers pre-configured.
func Get() Defaults {
cfg := Config()
handlers := Handlers()
cfg.Credentials = CredChain(cfg, handlers)
return Defaults{
Config: cfg,
Handlers: handlers,
}
}
// Config returns the default configuration.
func Config() *aws.Config {
return aws.NewConfig().
WithCredentials(credentials.AnonymousCredentials).
WithRegion(os.Getenv("AWS_REGION")).
WithHTTPClient(http.DefaultClient).
WithMaxRetries(aws.UseServiceDefaultRetries).
WithLogger(aws.NewDefaultLogger()).
WithLogLevel(aws.LogOff).
WithSleepDelay(time.Sleep)
}
// Handlers returns the default request handlers.
func Handlers() request.Handlers {
var handlers request.Handlers
handlers.Validate.PushBackNamed(corehandlers.ValidateEndpointHandler)
handlers.Build.PushBackNamed(corehandlers.SDKVersionUserAgentHandler)
handlers.Sign.PushBackNamed(corehandlers.BuildContentLengthHandler)
handlers.Send.PushBackNamed(corehandlers.SendHandler)
handlers.AfterRetry.PushBackNamed(corehandlers.AfterRetryHandler)
handlers.ValidateResponse.PushBackNamed(corehandlers.ValidateResponseHandler)
return handlers
}
// CredChain returns the default credential chain.
func CredChain(cfg *aws.Config, handlers request.Handlers) *credentials.Credentials {
endpoint, signingRegion := endpoints.EndpointForRegion(ec2metadata.ServiceName, *cfg.Region, true)
return credentials.NewChainCredentials(
[]credentials.Provider{
&credentials.EnvProvider{},
&credentials.SharedCredentialsProvider{Filename: "", Profile: ""},
&ec2rolecreds.EC2RoleProvider{
Client: ec2metadata.NewClient(*cfg, handlers, endpoint, signingRegion),
ExpiryWindow: 5 * time.Minute,
},
})
}
-43
View File
@@ -1,43 +0,0 @@
package ec2metadata
import (
"path"
"github.com/aws/aws-sdk-go/aws/request"
)
// GetMetadata uses the path provided to request
func (c *EC2Metadata) GetMetadata(p string) (string, error) {
op := &request.Operation{
Name: "GetMetadata",
HTTPMethod: "GET",
HTTPPath: path.Join("/", "meta-data", p),
}
output := &metadataOutput{}
req := c.NewRequest(op, nil, output)
return output.Content, req.Send()
}
// Region returns the region the instance is running in.
func (c *EC2Metadata) Region() (string, error) {
resp, err := c.GetMetadata("placement/availability-zone")
if err != nil {
return "", err
}
// returns region without the suffix. Eg: us-west-2a becomes us-west-2
return resp[:len(resp)-1], nil
}
// Available returns if the application has access to the EC2 Metadata service.
// Can be used to determine if application is running within an EC2 Instance and
// the metadata service is available.
func (c *EC2Metadata) Available() bool {
if _, err := c.GetMetadata("instance-id"); err != nil {
return false
}
return true
}
@@ -1,101 +0,0 @@
package ec2metadata_test
import (
"bytes"
"io/ioutil"
"net/http"
"net/http/httptest"
"path"
"testing"
"github.com/stretchr/testify/assert"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/ec2metadata"
"github.com/aws/aws-sdk-go/aws/request"
"github.com/aws/aws-sdk-go/aws/session"
)
func initTestServer(path string, resp string) *httptest.Server {
return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.RequestURI != path {
http.Error(w, "not found", http.StatusNotFound)
return
}
w.Write([]byte(resp))
}))
}
func TestEndpoint(t *testing.T) {
c := ec2metadata.New(session.New())
op := &request.Operation{
Name: "GetMetadata",
HTTPMethod: "GET",
HTTPPath: path.Join("/", "meta-data", "testpath"),
}
req := c.NewRequest(op, nil, nil)
assert.Equal(t, "http://169.254.169.254/latest", req.ClientInfo.Endpoint)
assert.Equal(t, "http://169.254.169.254/latest/meta-data/testpath", req.HTTPRequest.URL.String())
}
func TestGetMetadata(t *testing.T) {
server := initTestServer(
"/latest/meta-data/some/path",
"success", // real response includes suffix
)
defer server.Close()
c := ec2metadata.New(session.New(), &aws.Config{Endpoint: aws.String(server.URL + "/latest")})
resp, err := c.GetMetadata("some/path")
assert.NoError(t, err)
assert.Equal(t, "success", resp)
}
func TestGetRegion(t *testing.T) {
server := initTestServer(
"/latest/meta-data/placement/availability-zone",
"us-west-2a", // real response includes suffix
)
defer server.Close()
c := ec2metadata.New(session.New(), &aws.Config{Endpoint: aws.String(server.URL + "/latest")})
region, err := c.Region()
assert.NoError(t, err)
assert.Equal(t, "us-west-2", region)
}
func TestMetadataAvailable(t *testing.T) {
server := initTestServer(
"/latest/meta-data/instance-id",
"instance-id",
)
defer server.Close()
c := ec2metadata.New(session.New(), &aws.Config{Endpoint: aws.String(server.URL + "/latest")})
available := c.Available()
assert.True(t, available)
}
func TestMetadataNotAvailable(t *testing.T) {
c := ec2metadata.New(session.New())
c.Handlers.Send.Clear()
c.Handlers.Send.PushBack(func(r *request.Request) {
r.HTTPResponse = &http.Response{
StatusCode: int(0),
Status: http.StatusText(int(0)),
Body: ioutil.NopCloser(bytes.NewReader([]byte{})),
}
r.Error = awserr.New("RequestError", "send request failed", nil)
r.Retryable = aws.Bool(true) // network errors are retryable
})
available := c.Available()
assert.False(t, available)
}
@@ -1,47 +0,0 @@
package request_test
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/request"
)
func TestHandlerList(t *testing.T) {
s := ""
r := &request.Request{}
l := request.HandlerList{}
l.PushBack(func(r *request.Request) {
s += "a"
r.Data = s
})
l.Run(r)
assert.Equal(t, "a", s)
assert.Equal(t, "a", r.Data)
}
func TestMultipleHandlers(t *testing.T) {
r := &request.Request{}
l := request.HandlerList{}
l.PushBack(func(r *request.Request) { r.Data = nil })
l.PushFront(func(r *request.Request) { r.Data = aws.Bool(true) })
l.Run(r)
if r.Data != nil {
t.Error("Expected handler to execute")
}
}
func TestNamedHandlers(t *testing.T) {
l := request.HandlerList{}
named := request.NamedHandler{Name: "Name", Fn: func(r *request.Request) {}}
named2 := request.NamedHandler{Name: "NotName", Fn: func(r *request.Request) {}}
l.PushBackNamed(named)
l.PushBackNamed(named)
l.PushBackNamed(named2)
l.PushBack(func(r *request.Request) {})
assert.Equal(t, 4, l.Len())
l.Remove(named)
assert.Equal(t, 2, l.Len())
}
@@ -1,455 +0,0 @@
package request_test
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/request"
"github.com/aws/aws-sdk-go/awstesting/unit"
"github.com/aws/aws-sdk-go/service/dynamodb"
"github.com/aws/aws-sdk-go/service/route53"
"github.com/aws/aws-sdk-go/service/s3"
)
// Use DynamoDB methods for simplicity
func TestPaginationQueryPage(t *testing.T) {
db := dynamodb.New(unit.Session)
tokens, pages, numPages, gotToEnd := []map[string]*dynamodb.AttributeValue{}, []map[string]*dynamodb.AttributeValue{}, 0, false
reqNum := 0
resps := []*dynamodb.QueryOutput{
{
LastEvaluatedKey: map[string]*dynamodb.AttributeValue{"key": {S: aws.String("key1")}},
Count: aws.Int64(1),
Items: []map[string]*dynamodb.AttributeValue{
map[string]*dynamodb.AttributeValue{
"key": {S: aws.String("key1")},
},
},
},
{
LastEvaluatedKey: map[string]*dynamodb.AttributeValue{"key": {S: aws.String("key2")}},
Count: aws.Int64(1),
Items: []map[string]*dynamodb.AttributeValue{
map[string]*dynamodb.AttributeValue{
"key": {S: aws.String("key2")},
},
},
},
{
LastEvaluatedKey: map[string]*dynamodb.AttributeValue{},
Count: aws.Int64(1),
Items: []map[string]*dynamodb.AttributeValue{
map[string]*dynamodb.AttributeValue{
"key": {S: aws.String("key3")},
},
},
},
}
db.Handlers.Send.Clear() // mock sending
db.Handlers.Unmarshal.Clear()
db.Handlers.UnmarshalMeta.Clear()
db.Handlers.ValidateResponse.Clear()
db.Handlers.Build.PushBack(func(r *request.Request) {
in := r.Params.(*dynamodb.QueryInput)
if in == nil {
tokens = append(tokens, nil)
} else if len(in.ExclusiveStartKey) != 0 {
tokens = append(tokens, in.ExclusiveStartKey)
}
})
db.Handlers.Unmarshal.PushBack(func(r *request.Request) {
r.Data = resps[reqNum]
reqNum++
})
params := &dynamodb.QueryInput{
Limit: aws.Int64(2),
TableName: aws.String("tablename"),
}
err := db.QueryPages(params, func(p *dynamodb.QueryOutput, last bool) bool {
numPages++
for _, item := range p.Items {
pages = append(pages, item)
}
if last {
if gotToEnd {
assert.Fail(t, "last=true happened twice")
}
gotToEnd = true
}
return true
})
assert.Nil(t, err)
assert.Equal(t,
[]map[string]*dynamodb.AttributeValue{
map[string]*dynamodb.AttributeValue{"key": {S: aws.String("key1")}},
map[string]*dynamodb.AttributeValue{"key": {S: aws.String("key2")}},
}, tokens)
assert.Equal(t,
[]map[string]*dynamodb.AttributeValue{
map[string]*dynamodb.AttributeValue{"key": {S: aws.String("key1")}},
map[string]*dynamodb.AttributeValue{"key": {S: aws.String("key2")}},
map[string]*dynamodb.AttributeValue{"key": {S: aws.String("key3")}},
}, pages)
assert.Equal(t, 3, numPages)
assert.True(t, gotToEnd)
assert.Nil(t, params.ExclusiveStartKey)
}
// Use DynamoDB methods for simplicity
func TestPagination(t *testing.T) {
db := dynamodb.New(unit.Session)
tokens, pages, numPages, gotToEnd := []string{}, []string{}, 0, false
reqNum := 0
resps := []*dynamodb.ListTablesOutput{
{TableNames: []*string{aws.String("Table1"), aws.String("Table2")}, LastEvaluatedTableName: aws.String("Table2")},
{TableNames: []*string{aws.String("Table3"), aws.String("Table4")}, LastEvaluatedTableName: aws.String("Table4")},
{TableNames: []*string{aws.String("Table5")}},
}
db.Handlers.Send.Clear() // mock sending
db.Handlers.Unmarshal.Clear()
db.Handlers.UnmarshalMeta.Clear()
db.Handlers.ValidateResponse.Clear()
db.Handlers.Build.PushBack(func(r *request.Request) {
in := r.Params.(*dynamodb.ListTablesInput)
if in == nil {
tokens = append(tokens, "")
} else if in.ExclusiveStartTableName != nil {
tokens = append(tokens, *in.ExclusiveStartTableName)
}
})
db.Handlers.Unmarshal.PushBack(func(r *request.Request) {
r.Data = resps[reqNum]
reqNum++
})
params := &dynamodb.ListTablesInput{Limit: aws.Int64(2)}
err := db.ListTablesPages(params, func(p *dynamodb.ListTablesOutput, last bool) bool {
numPages++
for _, t := range p.TableNames {
pages = append(pages, *t)
}
if last {
if gotToEnd {
assert.Fail(t, "last=true happened twice")
}
gotToEnd = true
}
return true
})
assert.Equal(t, []string{"Table2", "Table4"}, tokens)
assert.Equal(t, []string{"Table1", "Table2", "Table3", "Table4", "Table5"}, pages)
assert.Equal(t, 3, numPages)
assert.True(t, gotToEnd)
assert.Nil(t, err)
assert.Nil(t, params.ExclusiveStartTableName)
}
// Use DynamoDB methods for simplicity
func TestPaginationEachPage(t *testing.T) {
db := dynamodb.New(unit.Session)
tokens, pages, numPages, gotToEnd := []string{}, []string{}, 0, false
reqNum := 0
resps := []*dynamodb.ListTablesOutput{
{TableNames: []*string{aws.String("Table1"), aws.String("Table2")}, LastEvaluatedTableName: aws.String("Table2")},
{TableNames: []*string{aws.String("Table3"), aws.String("Table4")}, LastEvaluatedTableName: aws.String("Table4")},
{TableNames: []*string{aws.String("Table5")}},
}
db.Handlers.Send.Clear() // mock sending
db.Handlers.Unmarshal.Clear()
db.Handlers.UnmarshalMeta.Clear()
db.Handlers.ValidateResponse.Clear()
db.Handlers.Build.PushBack(func(r *request.Request) {
in := r.Params.(*dynamodb.ListTablesInput)
if in == nil {
tokens = append(tokens, "")
} else if in.ExclusiveStartTableName != nil {
tokens = append(tokens, *in.ExclusiveStartTableName)
}
})
db.Handlers.Unmarshal.PushBack(func(r *request.Request) {
r.Data = resps[reqNum]
reqNum++
})
params := &dynamodb.ListTablesInput{Limit: aws.Int64(2)}
req, _ := db.ListTablesRequest(params)
err := req.EachPage(func(p interface{}, last bool) bool {
numPages++
for _, t := range p.(*dynamodb.ListTablesOutput).TableNames {
pages = append(pages, *t)
}
if last {
if gotToEnd {
assert.Fail(t, "last=true happened twice")
}
gotToEnd = true
}
return true
})
assert.Equal(t, []string{"Table2", "Table4"}, tokens)
assert.Equal(t, []string{"Table1", "Table2", "Table3", "Table4", "Table5"}, pages)
assert.Equal(t, 3, numPages)
assert.True(t, gotToEnd)
assert.Nil(t, err)
}
// Use DynamoDB methods for simplicity
func TestPaginationEarlyExit(t *testing.T) {
db := dynamodb.New(unit.Session)
numPages, gotToEnd := 0, false
reqNum := 0
resps := []*dynamodb.ListTablesOutput{
{TableNames: []*string{aws.String("Table1"), aws.String("Table2")}, LastEvaluatedTableName: aws.String("Table2")},
{TableNames: []*string{aws.String("Table3"), aws.String("Table4")}, LastEvaluatedTableName: aws.String("Table4")},
{TableNames: []*string{aws.String("Table5")}},
}
db.Handlers.Send.Clear() // mock sending
db.Handlers.Unmarshal.Clear()
db.Handlers.UnmarshalMeta.Clear()
db.Handlers.ValidateResponse.Clear()
db.Handlers.Unmarshal.PushBack(func(r *request.Request) {
r.Data = resps[reqNum]
reqNum++
})
params := &dynamodb.ListTablesInput{Limit: aws.Int64(2)}
err := db.ListTablesPages(params, func(p *dynamodb.ListTablesOutput, last bool) bool {
numPages++
if numPages == 2 {
return false
}
if last {
if gotToEnd {
assert.Fail(t, "last=true happened twice")
}
gotToEnd = true
}
return true
})
assert.Equal(t, 2, numPages)
assert.False(t, gotToEnd)
assert.Nil(t, err)
}
func TestSkipPagination(t *testing.T) {
client := s3.New(unit.Session)
client.Handlers.Send.Clear() // mock sending
client.Handlers.Unmarshal.Clear()
client.Handlers.UnmarshalMeta.Clear()
client.Handlers.ValidateResponse.Clear()
client.Handlers.Unmarshal.PushBack(func(r *request.Request) {
r.Data = &s3.HeadBucketOutput{}
})
req, _ := client.HeadBucketRequest(&s3.HeadBucketInput{Bucket: aws.String("bucket")})
numPages, gotToEnd := 0, false
req.EachPage(func(p interface{}, last bool) bool {
numPages++
if last {
gotToEnd = true
}
return true
})
assert.Equal(t, 1, numPages)
assert.True(t, gotToEnd)
}
// Use S3 for simplicity
func TestPaginationTruncation(t *testing.T) {
client := s3.New(unit.Session)
reqNum := 0
resps := []*s3.ListObjectsOutput{
{IsTruncated: aws.Bool(true), Contents: []*s3.Object{{Key: aws.String("Key1")}}},
{IsTruncated: aws.Bool(true), Contents: []*s3.Object{{Key: aws.String("Key2")}}},
{IsTruncated: aws.Bool(false), Contents: []*s3.Object{{Key: aws.String("Key3")}}},
{IsTruncated: aws.Bool(true), Contents: []*s3.Object{{Key: aws.String("Key4")}}},
}
client.Handlers.Send.Clear() // mock sending
client.Handlers.Unmarshal.Clear()
client.Handlers.UnmarshalMeta.Clear()
client.Handlers.ValidateResponse.Clear()
client.Handlers.Unmarshal.PushBack(func(r *request.Request) {
r.Data = resps[reqNum]
reqNum++
})
params := &s3.ListObjectsInput{Bucket: aws.String("bucket")}
results := []string{}
err := client.ListObjectsPages(params, func(p *s3.ListObjectsOutput, last bool) bool {
results = append(results, *p.Contents[0].Key)
return true
})
assert.Equal(t, []string{"Key1", "Key2", "Key3"}, results)
assert.Nil(t, err)
// Try again without truncation token at all
reqNum = 0
resps[1].IsTruncated = nil
resps[2].IsTruncated = aws.Bool(true)
results = []string{}
err = client.ListObjectsPages(params, func(p *s3.ListObjectsOutput, last bool) bool {
results = append(results, *p.Contents[0].Key)
return true
})
assert.Equal(t, []string{"Key1", "Key2"}, results)
assert.Nil(t, err)
}
func TestPaginationNilToken(t *testing.T) {
client := route53.New(unit.Session)
reqNum := 0
resps := []*route53.ListResourceRecordSetsOutput{
{
ResourceRecordSets: []*route53.ResourceRecordSet{
{Name: aws.String("first.example.com.")},
},
IsTruncated: aws.Bool(true),
NextRecordName: aws.String("second.example.com."),
NextRecordType: aws.String("MX"),
NextRecordIdentifier: aws.String("second"),
MaxItems: aws.String("1"),
},
{
ResourceRecordSets: []*route53.ResourceRecordSet{
{Name: aws.String("second.example.com.")},
},
IsTruncated: aws.Bool(true),
NextRecordName: aws.String("third.example.com."),
NextRecordType: aws.String("MX"),
MaxItems: aws.String("1"),
},
{
ResourceRecordSets: []*route53.ResourceRecordSet{
{Name: aws.String("third.example.com.")},
},
IsTruncated: aws.Bool(false),
MaxItems: aws.String("1"),
},
}
client.Handlers.Send.Clear() // mock sending
client.Handlers.Unmarshal.Clear()
client.Handlers.UnmarshalMeta.Clear()
client.Handlers.ValidateResponse.Clear()
idents := []string{}
client.Handlers.Build.PushBack(func(r *request.Request) {
p := r.Params.(*route53.ListResourceRecordSetsInput)
idents = append(idents, aws.StringValue(p.StartRecordIdentifier))
})
client.Handlers.Unmarshal.PushBack(func(r *request.Request) {
r.Data = resps[reqNum]
reqNum++
})
params := &route53.ListResourceRecordSetsInput{
HostedZoneId: aws.String("id-zone"),
}
results := []string{}
err := client.ListResourceRecordSetsPages(params, func(p *route53.ListResourceRecordSetsOutput, last bool) bool {
results = append(results, *p.ResourceRecordSets[0].Name)
return true
})
assert.NoError(t, err)
assert.Equal(t, []string{"", "second", ""}, idents)
assert.Equal(t, []string{"first.example.com.", "second.example.com.", "third.example.com."}, results)
}
// Benchmarks
var benchResps = []*dynamodb.ListTablesOutput{
{TableNames: []*string{aws.String("TABLE"), aws.String("NXT")}, LastEvaluatedTableName: aws.String("NXT")},
{TableNames: []*string{aws.String("TABLE"), aws.String("NXT")}, LastEvaluatedTableName: aws.String("NXT")},
{TableNames: []*string{aws.String("TABLE"), aws.String("NXT")}, LastEvaluatedTableName: aws.String("NXT")},
{TableNames: []*string{aws.String("TABLE"), aws.String("NXT")}, LastEvaluatedTableName: aws.String("NXT")},
{TableNames: []*string{aws.String("TABLE"), aws.String("NXT")}, LastEvaluatedTableName: aws.String("NXT")},
{TableNames: []*string{aws.String("TABLE"), aws.String("NXT")}, LastEvaluatedTableName: aws.String("NXT")},
{TableNames: []*string{aws.String("TABLE"), aws.String("NXT")}, LastEvaluatedTableName: aws.String("NXT")},
{TableNames: []*string{aws.String("TABLE"), aws.String("NXT")}, LastEvaluatedTableName: aws.String("NXT")},
{TableNames: []*string{aws.String("TABLE"), aws.String("NXT")}, LastEvaluatedTableName: aws.String("NXT")},
{TableNames: []*string{aws.String("TABLE"), aws.String("NXT")}, LastEvaluatedTableName: aws.String("NXT")},
{TableNames: []*string{aws.String("TABLE"), aws.String("NXT")}, LastEvaluatedTableName: aws.String("NXT")},
{TableNames: []*string{aws.String("TABLE"), aws.String("NXT")}, LastEvaluatedTableName: aws.String("NXT")},
{TableNames: []*string{aws.String("TABLE"), aws.String("NXT")}, LastEvaluatedTableName: aws.String("NXT")},
{TableNames: []*string{aws.String("TABLE")}},
}
var benchDb = func() *dynamodb.DynamoDB {
db := dynamodb.New(unit.Session)
db.Handlers.Send.Clear() // mock sending
db.Handlers.Unmarshal.Clear()
db.Handlers.UnmarshalMeta.Clear()
db.Handlers.ValidateResponse.Clear()
return db
}
func BenchmarkCodegenIterator(b *testing.B) {
reqNum := 0
db := benchDb()
db.Handlers.Unmarshal.PushBack(func(r *request.Request) {
r.Data = benchResps[reqNum]
reqNum++
})
input := &dynamodb.ListTablesInput{Limit: aws.Int64(2)}
iter := func(fn func(*dynamodb.ListTablesOutput, bool) bool) error {
page, _ := db.ListTablesRequest(input)
for ; page != nil; page = page.NextPage() {
page.Send()
out := page.Data.(*dynamodb.ListTablesOutput)
if result := fn(out, !page.HasNextPage()); page.Error != nil || !result {
return page.Error
}
}
return nil
}
for i := 0; i < b.N; i++ {
reqNum = 0
iter(func(p *dynamodb.ListTablesOutput, last bool) bool {
return true
})
}
}
func BenchmarkEachPageIterator(b *testing.B) {
reqNum := 0
db := benchDb()
db.Handlers.Unmarshal.PushBack(func(r *request.Request) {
r.Data = benchResps[reqNum]
reqNum++
})
input := &dynamodb.ListTablesInput{Limit: aws.Int64(2)}
for i := 0; i < b.N; i++ {
reqNum = 0
req, _ := db.ListTablesRequest(input)
req.EachPage(func(p interface{}, last bool) bool {
return true
})
}
}
@@ -1,261 +0,0 @@
package request_test
import (
"bytes"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"net/http"
"runtime"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/request"
"github.com/aws/aws-sdk-go/awstesting"
)
type testData struct {
Data string
}
func body(str string) io.ReadCloser {
return ioutil.NopCloser(bytes.NewReader([]byte(str)))
}
func unmarshal(req *request.Request) {
defer req.HTTPResponse.Body.Close()
if req.Data != nil {
json.NewDecoder(req.HTTPResponse.Body).Decode(req.Data)
}
return
}
func unmarshalError(req *request.Request) {
bodyBytes, err := ioutil.ReadAll(req.HTTPResponse.Body)
if err != nil {
req.Error = awserr.New("UnmarshaleError", req.HTTPResponse.Status, err)
return
}
if len(bodyBytes) == 0 {
req.Error = awserr.NewRequestFailure(
awserr.New("UnmarshaleError", req.HTTPResponse.Status, fmt.Errorf("empty body")),
req.HTTPResponse.StatusCode,
"",
)
return
}
var jsonErr jsonErrorResponse
if err := json.Unmarshal(bodyBytes, &jsonErr); err != nil {
req.Error = awserr.New("UnmarshaleError", "JSON unmarshal", err)
return
}
req.Error = awserr.NewRequestFailure(
awserr.New(jsonErr.Code, jsonErr.Message, nil),
req.HTTPResponse.StatusCode,
"",
)
}
type jsonErrorResponse struct {
Code string `json:"__type"`
Message string `json:"message"`
}
// test that retries occur for 5xx status codes
func TestRequestRecoverRetry5xx(t *testing.T) {
reqNum := 0
reqs := []http.Response{
{StatusCode: 500, Body: body(`{"__type":"UnknownError","message":"An error occurred."}`)},
{StatusCode: 501, Body: body(`{"__type":"UnknownError","message":"An error occurred."}`)},
{StatusCode: 200, Body: body(`{"data":"valid"}`)},
}
s := awstesting.NewClient(aws.NewConfig().WithMaxRetries(10))
s.Handlers.Validate.Clear()
s.Handlers.Unmarshal.PushBack(unmarshal)
s.Handlers.UnmarshalError.PushBack(unmarshalError)
s.Handlers.Send.Clear() // mock sending
s.Handlers.Send.PushBack(func(r *request.Request) {
r.HTTPResponse = &reqs[reqNum]
reqNum++
})
out := &testData{}
r := s.NewRequest(&request.Operation{Name: "Operation"}, nil, out)
err := r.Send()
assert.Nil(t, err)
assert.Equal(t, 2, int(r.RetryCount))
assert.Equal(t, "valid", out.Data)
}
// test that retries occur for 4xx status codes with a response type that can be retried - see `shouldRetry`
func TestRequestRecoverRetry4xxRetryable(t *testing.T) {
reqNum := 0
reqs := []http.Response{
{StatusCode: 400, Body: body(`{"__type":"Throttling","message":"Rate exceeded."}`)},
{StatusCode: 429, Body: body(`{"__type":"ProvisionedThroughputExceededException","message":"Rate exceeded."}`)},
{StatusCode: 200, Body: body(`{"data":"valid"}`)},
}
s := awstesting.NewClient(aws.NewConfig().WithMaxRetries(10))
s.Handlers.Validate.Clear()
s.Handlers.Unmarshal.PushBack(unmarshal)
s.Handlers.UnmarshalError.PushBack(unmarshalError)
s.Handlers.Send.Clear() // mock sending
s.Handlers.Send.PushBack(func(r *request.Request) {
r.HTTPResponse = &reqs[reqNum]
reqNum++
})
out := &testData{}
r := s.NewRequest(&request.Operation{Name: "Operation"}, nil, out)
err := r.Send()
assert.Nil(t, err)
assert.Equal(t, 2, int(r.RetryCount))
assert.Equal(t, "valid", out.Data)
}
// test that retries don't occur for 4xx status codes with a response type that can't be retried
func TestRequest4xxUnretryable(t *testing.T) {
s := awstesting.NewClient(aws.NewConfig().WithMaxRetries(10))
s.Handlers.Validate.Clear()
s.Handlers.Unmarshal.PushBack(unmarshal)
s.Handlers.UnmarshalError.PushBack(unmarshalError)
s.Handlers.Send.Clear() // mock sending
s.Handlers.Send.PushBack(func(r *request.Request) {
r.HTTPResponse = &http.Response{StatusCode: 401, Body: body(`{"__type":"SignatureDoesNotMatch","message":"Signature does not match."}`)}
})
out := &testData{}
r := s.NewRequest(&request.Operation{Name: "Operation"}, nil, out)
err := r.Send()
assert.NotNil(t, err)
if e, ok := err.(awserr.RequestFailure); ok {
assert.Equal(t, 401, e.StatusCode())
} else {
assert.Fail(t, "Expected error to be a service failure")
}
assert.Equal(t, "SignatureDoesNotMatch", err.(awserr.Error).Code())
assert.Equal(t, "Signature does not match.", err.(awserr.Error).Message())
assert.Equal(t, 0, int(r.RetryCount))
}
func TestRequestExhaustRetries(t *testing.T) {
delays := []time.Duration{}
sleepDelay := func(delay time.Duration) {
delays = append(delays, delay)
}
reqNum := 0
reqs := []http.Response{
{StatusCode: 500, Body: body(`{"__type":"UnknownError","message":"An error occurred."}`)},
{StatusCode: 500, Body: body(`{"__type":"UnknownError","message":"An error occurred."}`)},
{StatusCode: 500, Body: body(`{"__type":"UnknownError","message":"An error occurred."}`)},
{StatusCode: 500, Body: body(`{"__type":"UnknownError","message":"An error occurred."}`)},
}
s := awstesting.NewClient(aws.NewConfig().WithSleepDelay(sleepDelay))
s.Handlers.Validate.Clear()
s.Handlers.Unmarshal.PushBack(unmarshal)
s.Handlers.UnmarshalError.PushBack(unmarshalError)
s.Handlers.Send.Clear() // mock sending
s.Handlers.Send.PushBack(func(r *request.Request) {
r.HTTPResponse = &reqs[reqNum]
reqNum++
})
r := s.NewRequest(&request.Operation{Name: "Operation"}, nil, nil)
err := r.Send()
assert.NotNil(t, err)
if e, ok := err.(awserr.RequestFailure); ok {
assert.Equal(t, 500, e.StatusCode())
} else {
assert.Fail(t, "Expected error to be a service failure")
}
assert.Equal(t, "UnknownError", err.(awserr.Error).Code())
assert.Equal(t, "An error occurred.", err.(awserr.Error).Message())
assert.Equal(t, 3, int(r.RetryCount))
expectDelays := []struct{ min, max time.Duration }{{30, 59}, {60, 118}, {120, 236}}
for i, v := range delays {
min := expectDelays[i].min * time.Millisecond
max := expectDelays[i].max * time.Millisecond
assert.True(t, min <= v && v <= max,
"Expect delay to be within range, i:%d, v:%s, min:%s, max:%s", i, v, min, max)
}
}
// test that the request is retried after the credentials are expired.
func TestRequestRecoverExpiredCreds(t *testing.T) {
reqNum := 0
reqs := []http.Response{
{StatusCode: 400, Body: body(`{"__type":"ExpiredTokenException","message":"expired token"}`)},
{StatusCode: 200, Body: body(`{"data":"valid"}`)},
}
s := awstesting.NewClient(&aws.Config{MaxRetries: aws.Int(10), Credentials: credentials.NewStaticCredentials("AKID", "SECRET", "")})
s.Handlers.Validate.Clear()
s.Handlers.Unmarshal.PushBack(unmarshal)
s.Handlers.UnmarshalError.PushBack(unmarshalError)
credExpiredBeforeRetry := false
credExpiredAfterRetry := false
s.Handlers.AfterRetry.PushBack(func(r *request.Request) {
credExpiredAfterRetry = r.Config.Credentials.IsExpired()
})
s.Handlers.Sign.Clear()
s.Handlers.Sign.PushBack(func(r *request.Request) {
r.Config.Credentials.Get()
})
s.Handlers.Send.Clear() // mock sending
s.Handlers.Send.PushBack(func(r *request.Request) {
r.HTTPResponse = &reqs[reqNum]
reqNum++
})
out := &testData{}
r := s.NewRequest(&request.Operation{Name: "Operation"}, nil, out)
err := r.Send()
assert.Nil(t, err)
assert.False(t, credExpiredBeforeRetry, "Expect valid creds before retry check")
assert.True(t, credExpiredAfterRetry, "Expect expired creds after retry check")
assert.False(t, s.Config.Credentials.IsExpired(), "Expect valid creds after cred expired recovery")
assert.Equal(t, 1, int(r.RetryCount))
assert.Equal(t, "valid", out.Data)
}
func TestMakeAddtoUserAgentHandler(t *testing.T) {
fn := request.MakeAddToUserAgentHandler("name", "version", "extra1", "extra2")
r := &request.Request{HTTPRequest: &http.Request{Header: http.Header{}}}
r.HTTPRequest.Header.Set("User-Agent", "foo/bar")
fn(r)
assert.Equal(t, "foo/bar name/version (extra1; extra2)", r.HTTPRequest.Header.Get("User-Agent"))
}
func TestMakeAddtoUserAgentFreeFormHandler(t *testing.T) {
fn := request.MakeAddToUserAgentFreeFormHandler("name/version (extra1; extra2)")
r := &request.Request{HTTPRequest: &http.Request{Header: http.Header{}}}
r.HTTPRequest.Header.Set("User-Agent", "foo/bar")
fn(r)
assert.Equal(t, "foo/bar name/version (extra1; extra2)", r.HTTPRequest.Header.Get("User-Agent"))
}
func TestRequestUserAgent(t *testing.T) {
s := awstesting.NewClient(&aws.Config{Region: aws.String("us-east-1")})
// s.Handlers.Validate.Clear()
req := s.NewRequest(&request.Operation{Name: "Operation"}, nil, &testData{})
req.HTTPRequest.Header.Set("User-Agent", "foo/bar")
assert.NoError(t, req.Build())
expectUA := fmt.Sprintf("foo/bar %s/%s (%s; %s; %s)",
aws.SDKName, aws.SDKVersion, runtime.Version(), runtime.GOOS, runtime.GOARCH)
assert.Equal(t, expectUA, req.HTTPRequest.Header.Get("User-Agent"))
}
-105
View File
@@ -1,105 +0,0 @@
// Package session provides a way to create service clients with shared configuration
// and handlers.
package session
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/client"
"github.com/aws/aws-sdk-go/aws/corehandlers"
"github.com/aws/aws-sdk-go/aws/defaults"
"github.com/aws/aws-sdk-go/aws/request"
"github.com/aws/aws-sdk-go/private/endpoints"
)
// A Session provides a central location to create service clients from and
// store configurations and request handlers for those services.
//
// Sessions are safe to create service clients concurrently, but it is not safe
// to mutate the session concurrently.
type Session struct {
Config *aws.Config
Handlers request.Handlers
}
// New creates a new instance of the handlers merging in the provided Configs
// on top of the SDK's default configurations. Once the session is created it
// can be mutated to modify Configs or Handlers. The session is safe to be read
// concurrently, but it should not be written to concurrently.
//
// Example:
// // Create a session with the default config and request handlers.
// sess := session.New()
//
// // Create a session with a custom region
// sess := session.New(&aws.Config{Region: aws.String("us-east-1")})
//
// // Create a session, and add additional handlers for all service
// // clients created with the session to inherit. Adds logging handler.
// sess := session.New()
// sess.Handlers.Send.PushFront(func(r *request.Request) {
// // Log every request made and its payload
// logger.Println("Request: %s/%s, Payload: %s", r.ClientInfo.ServiceName, r.Operation, r.Params)
// })
//
// // Create a S3 client instance from a session
// sess := session.New()
// svc := s3.New(sess)
func New(cfgs ...*aws.Config) *Session {
def := defaults.Get()
s := &Session{
Config: def.Config,
Handlers: def.Handlers,
}
s.Config.MergeIn(cfgs...)
initHandlers(s)
return s
}
func initHandlers(s *Session) {
// Add the Validate parameter handler if it is not disabled.
s.Handlers.Validate.Remove(corehandlers.ValidateParametersHandler)
if !aws.BoolValue(s.Config.DisableParamValidation) {
s.Handlers.Validate.PushBackNamed(corehandlers.ValidateParametersHandler)
}
}
// Copy creates and returns a copy of the current session, coping the config
// and handlers. If any additional configs are provided they will be merged
// on top of the session's copied config.
//
// Example:
// // Create a copy of the current session, configured for the us-west-2 region.
// sess.Copy(&aws.Config{Region: aws.String("us-west-2"})
func (s *Session) Copy(cfgs ...*aws.Config) *Session {
newSession := &Session{
Config: s.Config.Copy(cfgs...),
Handlers: s.Handlers.Copy(),
}
initHandlers(newSession)
return newSession
}
// ClientConfig satisfies the client.ConfigProvider interface and is used to
// configure the service client instances. Passing the Session to the service
// client's constructor (New) will use this method to configure the client.
//
// Example:
// sess := session.New()
// s3.New(sess)
func (s *Session) ClientConfig(serviceName string, cfgs ...*aws.Config) client.Config {
s = s.Copy(cfgs...)
endpoint, signingRegion := endpoints.NormalizeEndpoint(
aws.StringValue(s.Config.Endpoint), serviceName,
aws.StringValue(s.Config.Region), aws.BoolValue(s.Config.DisableSSL))
return client.Config{
Config: s.Config,
Handlers: s.Handlers,
Endpoint: endpoint,
SigningRegion: signingRegion,
}
}
@@ -1,20 +0,0 @@
package session_test
import (
"net/http"
"testing"
"github.com/stretchr/testify/assert"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
)
func TestNewDefaultSession(t *testing.T) {
s := session.New(&aws.Config{Region: aws.String("region")})
assert.Equal(t, "region", *s.Config.Region)
assert.Equal(t, http.DefaultClient, s.Config.HTTPClient)
assert.NotNil(t, s.Config.Logger)
assert.Equal(t, aws.LogOff, *s.Config.LogLevel)
}
-56
View File
@@ -1,56 +0,0 @@
package aws
import (
"math/rand"
"testing"
"github.com/stretchr/testify/assert"
)
func TestWriteAtBuffer(t *testing.T) {
b := &WriteAtBuffer{}
n, err := b.WriteAt([]byte{1}, 0)
assert.NoError(t, err)
assert.Equal(t, 1, n)
n, err = b.WriteAt([]byte{1, 1, 1}, 5)
assert.NoError(t, err)
assert.Equal(t, 3, n)
n, err = b.WriteAt([]byte{2}, 1)
assert.NoError(t, err)
assert.Equal(t, 1, n)
n, err = b.WriteAt([]byte{3}, 2)
assert.NoError(t, err)
assert.Equal(t, 1, n)
assert.Equal(t, []byte{1, 2, 3, 0, 0, 1, 1, 1}, b.Bytes())
}
func BenchmarkWriteAtBuffer(b *testing.B) {
buf := &WriteAtBuffer{}
r := rand.New(rand.NewSource(1))
b.ResetTimer()
for i := 0; i < b.N; i++ {
to := r.Intn(10) * 4096
bs := make([]byte, to)
buf.WriteAt(bs, r.Int63n(10)*4096)
}
}
func BenchmarkWriteAtBufferParallel(b *testing.B) {
buf := &WriteAtBuffer{}
r := rand.New(rand.NewSource(1))
b.ResetTimer()
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
to := r.Intn(10) * 4096
bs := make([]byte, to)
buf.WriteAt(bs, r.Int63n(10)*4096)
}
})
}
@@ -1,31 +0,0 @@
// Package endpoints validates regional endpoints for services.
package endpoints
//go:generate go run ../model/cli/gen-endpoints/main.go endpoints.json endpoints_map.go
//go:generate gofmt -s -w endpoints_map.go
import "strings"
// EndpointForRegion returns an endpoint and its signing region for a service and region.
// if the service and region pair are not found endpoint and signingRegion will be empty.
func EndpointForRegion(svcName, region string) (endpoint, signingRegion string) {
derivedKeys := []string{
region + "/" + svcName,
region + "/*",
"*/" + svcName,
"*/*",
}
for _, key := range derivedKeys {
if val, ok := endpointsMap.Endpoints[key]; ok {
ep := val.Endpoint
ep = strings.Replace(ep, "{region}", region, -1)
ep = strings.Replace(ep, "{service}", svcName, -1)
endpoint = ep
signingRegion = val.SigningRegion
return
}
}
return
}
@@ -1,77 +0,0 @@
{
"version": 2,
"endpoints": {
"*/*": {
"endpoint": "{service}.{region}.amazonaws.com"
},
"cn-north-1/*": {
"endpoint": "{service}.{region}.amazonaws.com.cn",
"signatureVersion": "v4"
},
"us-gov-west-1/iam": {
"endpoint": "iam.us-gov.amazonaws.com"
},
"us-gov-west-1/sts": {
"endpoint": "sts.us-gov-west-1.amazonaws.com"
},
"us-gov-west-1/s3": {
"endpoint": "s3-{region}.amazonaws.com"
},
"*/cloudfront": {
"endpoint": "cloudfront.amazonaws.com",
"signingRegion": "us-east-1"
},
"*/cloudsearchdomain": {
"endpoint": "",
"signingRegion": "us-east-1"
},
"*/iam": {
"endpoint": "iam.amazonaws.com",
"signingRegion": "us-east-1"
},
"*/importexport": {
"endpoint": "importexport.amazonaws.com",
"signingRegion": "us-east-1"
},
"*/route53": {
"endpoint": "route53.amazonaws.com",
"signingRegion": "us-east-1"
},
"*/sts": {
"endpoint": "sts.amazonaws.com",
"signingRegion": "us-east-1"
},
"us-east-1/sdb": {
"endpoint": "sdb.amazonaws.com",
"signingRegion": "us-east-1"
},
"us-east-1/s3": {
"endpoint": "s3.amazonaws.com"
},
"us-west-1/s3": {
"endpoint": "s3-{region}.amazonaws.com"
},
"us-west-2/s3": {
"endpoint": "s3-{region}.amazonaws.com"
},
"eu-west-1/s3": {
"endpoint": "s3-{region}.amazonaws.com"
},
"ap-southeast-1/s3": {
"endpoint": "s3-{region}.amazonaws.com"
},
"ap-southeast-2/s3": {
"endpoint": "s3-{region}.amazonaws.com"
},
"ap-northeast-1/s3": {
"endpoint": "s3-{region}.amazonaws.com"
},
"sa-east-1/s3": {
"endpoint": "s3-{region}.amazonaws.com"
},
"eu-central-1/s3": {
"endpoint": "{service}.{region}.amazonaws.com",
"signatureVersion": "v4"
}
}
}
@@ -1,89 +0,0 @@
package endpoints
// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
type endpointStruct struct {
Version int
Endpoints map[string]endpointEntry
}
type endpointEntry struct {
Endpoint string
SigningRegion string
}
var endpointsMap = endpointStruct{
Version: 2,
Endpoints: map[string]endpointEntry{
"*/*": {
Endpoint: "{service}.{region}.amazonaws.com",
},
"*/cloudfront": {
Endpoint: "cloudfront.amazonaws.com",
SigningRegion: "us-east-1",
},
"*/cloudsearchdomain": {
Endpoint: "",
SigningRegion: "us-east-1",
},
"*/iam": {
Endpoint: "iam.amazonaws.com",
SigningRegion: "us-east-1",
},
"*/importexport": {
Endpoint: "importexport.amazonaws.com",
SigningRegion: "us-east-1",
},
"*/route53": {
Endpoint: "route53.amazonaws.com",
SigningRegion: "us-east-1",
},
"*/sts": {
Endpoint: "sts.amazonaws.com",
SigningRegion: "us-east-1",
},
"ap-northeast-1/s3": {
Endpoint: "s3-{region}.amazonaws.com",
},
"ap-southeast-1/s3": {
Endpoint: "s3-{region}.amazonaws.com",
},
"ap-southeast-2/s3": {
Endpoint: "s3-{region}.amazonaws.com",
},
"cn-north-1/*": {
Endpoint: "{service}.{region}.amazonaws.com.cn",
},
"eu-central-1/s3": {
Endpoint: "{service}.{region}.amazonaws.com",
},
"eu-west-1/s3": {
Endpoint: "s3-{region}.amazonaws.com",
},
"sa-east-1/s3": {
Endpoint: "s3-{region}.amazonaws.com",
},
"us-east-1/s3": {
Endpoint: "s3.amazonaws.com",
},
"us-east-1/sdb": {
Endpoint: "sdb.amazonaws.com",
SigningRegion: "us-east-1",
},
"us-gov-west-1/iam": {
Endpoint: "iam.us-gov.amazonaws.com",
},
"us-gov-west-1/s3": {
Endpoint: "s3-{region}.amazonaws.com",
},
"us-gov-west-1/sts": {
Endpoint: "sts.us-gov-west-1.amazonaws.com",
},
"us-west-1/s3": {
Endpoint: "s3-{region}.amazonaws.com",
},
"us-west-2/s3": {
Endpoint: "s3-{region}.amazonaws.com",
},
},
}
@@ -1,28 +0,0 @@
package endpoints
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestGlobalEndpoints(t *testing.T) {
region := "mock-region-1"
svcs := []string{"cloudfront", "iam", "importexport", "route53", "sts"}
for _, name := range svcs {
ep, sr := EndpointForRegion(name, region)
assert.Equal(t, name+".amazonaws.com", ep)
assert.Equal(t, "us-east-1", sr)
}
}
func TestServicesInCN(t *testing.T) {
region := "cn-north-1"
svcs := []string{"cloudfront", "iam", "importexport", "route53", "sts", "s3"}
for _, name := range svcs {
ep, _ := EndpointForRegion(name, region)
assert.Equal(t, name+"."+region+".amazonaws.com.cn", ep)
}
}
@@ -1,32 +0,0 @@
// Package ec2query provides serialisation of AWS EC2 requests and responses.
package ec2query
//go:generate go run ../../fixtures/protocol/generate.go ../../fixtures/protocol/input/ec2.json build_test.go
import (
"net/url"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/internal/protocol/query/queryutil"
)
// Build builds a request for the EC2 protocol.
func Build(r *aws.Request) {
body := url.Values{
"Action": {r.Operation.Name},
"Version": {r.Service.APIVersion},
}
if err := queryutil.Parse(body, r.Params, true); err != nil {
r.Error = awserr.New("SerializationError", "failed encoding EC2 Query request", err)
}
if r.ExpireTime == 0 {
r.HTTPRequest.Method = "POST"
r.HTTPRequest.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=utf-8")
r.SetBufferBody([]byte(body.Encode()))
} else { // This is a pre-signed request
r.HTTPRequest.Method = "GET"
r.HTTPRequest.URL.RawQuery = body.Encode()
}
}
@@ -1,860 +0,0 @@
package ec2query_test
import (
"bytes"
"encoding/json"
"encoding/xml"
"io"
"io/ioutil"
"net/http"
"net/url"
"testing"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/internal/protocol/ec2query"
"github.com/aws/aws-sdk-go/internal/protocol/xml/xmlutil"
"github.com/aws/aws-sdk-go/internal/signer/v4"
"github.com/aws/aws-sdk-go/internal/util"
"github.com/stretchr/testify/assert"
)
var _ bytes.Buffer // always import bytes
var _ http.Request
var _ json.Marshaler
var _ time.Time
var _ xmlutil.XMLNode
var _ xml.Attr
var _ = ioutil.Discard
var _ = util.Trim("")
var _ = url.Values{}
var _ = io.EOF
type InputService1ProtocolTest struct {
*aws.Service
}
// New returns a new InputService1ProtocolTest client.
func NewInputService1ProtocolTest(config *aws.Config) *InputService1ProtocolTest {
service := &aws.Service{
Config: aws.DefaultConfig.Merge(config),
ServiceName: "inputservice1protocoltest",
APIVersion: "2014-01-01",
}
service.Initialize()
// Handlers
service.Handlers.Sign.PushBack(v4.Sign)
service.Handlers.Build.PushBack(ec2query.Build)
service.Handlers.Unmarshal.PushBack(ec2query.Unmarshal)
service.Handlers.UnmarshalMeta.PushBack(ec2query.UnmarshalMeta)
service.Handlers.UnmarshalError.PushBack(ec2query.UnmarshalError)
return &InputService1ProtocolTest{service}
}
// newRequest creates a new request for a InputService1ProtocolTest operation and runs any
// custom request initialization.
func (c *InputService1ProtocolTest) newRequest(op *aws.Operation, params, data interface{}) *aws.Request {
req := aws.NewRequest(c.Service, op, params, data)
return req
}
const opInputService1TestCaseOperation1 = "OperationName"
// InputService1TestCaseOperation1Request generates a request for the InputService1TestCaseOperation1 operation.
func (c *InputService1ProtocolTest) InputService1TestCaseOperation1Request(input *InputService1TestShapeInputShape) (req *aws.Request, output *InputService1TestShapeInputService1TestCaseOperation1Output) {
op := &aws.Operation{
Name: opInputService1TestCaseOperation1,
}
if input == nil {
input = &InputService1TestShapeInputShape{}
}
req = c.newRequest(op, input, output)
output = &InputService1TestShapeInputService1TestCaseOperation1Output{}
req.Data = output
return
}
func (c *InputService1ProtocolTest) InputService1TestCaseOperation1(input *InputService1TestShapeInputShape) (*InputService1TestShapeInputService1TestCaseOperation1Output, error) {
req, out := c.InputService1TestCaseOperation1Request(input)
err := req.Send()
return out, err
}
type InputService1TestShapeInputService1TestCaseOperation1Output struct {
metadataInputService1TestShapeInputService1TestCaseOperation1Output `json:"-" xml:"-"`
}
type metadataInputService1TestShapeInputService1TestCaseOperation1Output struct {
SDKShapeTraits bool `type:"structure"`
}
type InputService1TestShapeInputShape struct {
Bar *string `type:"string"`
Foo *string `type:"string"`
metadataInputService1TestShapeInputShape `json:"-" xml:"-"`
}
type metadataInputService1TestShapeInputShape struct {
SDKShapeTraits bool `type:"structure"`
}
type InputService2ProtocolTest struct {
*aws.Service
}
// New returns a new InputService2ProtocolTest client.
func NewInputService2ProtocolTest(config *aws.Config) *InputService2ProtocolTest {
service := &aws.Service{
Config: aws.DefaultConfig.Merge(config),
ServiceName: "inputservice2protocoltest",
APIVersion: "2014-01-01",
}
service.Initialize()
// Handlers
service.Handlers.Sign.PushBack(v4.Sign)
service.Handlers.Build.PushBack(ec2query.Build)
service.Handlers.Unmarshal.PushBack(ec2query.Unmarshal)
service.Handlers.UnmarshalMeta.PushBack(ec2query.UnmarshalMeta)
service.Handlers.UnmarshalError.PushBack(ec2query.UnmarshalError)
return &InputService2ProtocolTest{service}
}
// newRequest creates a new request for a InputService2ProtocolTest operation and runs any
// custom request initialization.
func (c *InputService2ProtocolTest) newRequest(op *aws.Operation, params, data interface{}) *aws.Request {
req := aws.NewRequest(c.Service, op, params, data)
return req
}
const opInputService2TestCaseOperation1 = "OperationName"
// InputService2TestCaseOperation1Request generates a request for the InputService2TestCaseOperation1 operation.
func (c *InputService2ProtocolTest) InputService2TestCaseOperation1Request(input *InputService2TestShapeInputShape) (req *aws.Request, output *InputService2TestShapeInputService2TestCaseOperation1Output) {
op := &aws.Operation{
Name: opInputService2TestCaseOperation1,
}
if input == nil {
input = &InputService2TestShapeInputShape{}
}
req = c.newRequest(op, input, output)
output = &InputService2TestShapeInputService2TestCaseOperation1Output{}
req.Data = output
return
}
func (c *InputService2ProtocolTest) InputService2TestCaseOperation1(input *InputService2TestShapeInputShape) (*InputService2TestShapeInputService2TestCaseOperation1Output, error) {
req, out := c.InputService2TestCaseOperation1Request(input)
err := req.Send()
return out, err
}
type InputService2TestShapeInputService2TestCaseOperation1Output struct {
metadataInputService2TestShapeInputService2TestCaseOperation1Output `json:"-" xml:"-"`
}
type metadataInputService2TestShapeInputService2TestCaseOperation1Output struct {
SDKShapeTraits bool `type:"structure"`
}
type InputService2TestShapeInputShape struct {
Bar *string `locationName:"barLocationName" type:"string"`
Foo *string `type:"string"`
Yuck *string `locationName:"yuckLocationName" queryName:"yuckQueryName" type:"string"`
metadataInputService2TestShapeInputShape `json:"-" xml:"-"`
}
type metadataInputService2TestShapeInputShape struct {
SDKShapeTraits bool `type:"structure"`
}
type InputService3ProtocolTest struct {
*aws.Service
}
// New returns a new InputService3ProtocolTest client.
func NewInputService3ProtocolTest(config *aws.Config) *InputService3ProtocolTest {
service := &aws.Service{
Config: aws.DefaultConfig.Merge(config),
ServiceName: "inputservice3protocoltest",
APIVersion: "2014-01-01",
}
service.Initialize()
// Handlers
service.Handlers.Sign.PushBack(v4.Sign)
service.Handlers.Build.PushBack(ec2query.Build)
service.Handlers.Unmarshal.PushBack(ec2query.Unmarshal)
service.Handlers.UnmarshalMeta.PushBack(ec2query.UnmarshalMeta)
service.Handlers.UnmarshalError.PushBack(ec2query.UnmarshalError)
return &InputService3ProtocolTest{service}
}
// newRequest creates a new request for a InputService3ProtocolTest operation and runs any
// custom request initialization.
func (c *InputService3ProtocolTest) newRequest(op *aws.Operation, params, data interface{}) *aws.Request {
req := aws.NewRequest(c.Service, op, params, data)
return req
}
const opInputService3TestCaseOperation1 = "OperationName"
// InputService3TestCaseOperation1Request generates a request for the InputService3TestCaseOperation1 operation.
func (c *InputService3ProtocolTest) InputService3TestCaseOperation1Request(input *InputService3TestShapeInputShape) (req *aws.Request, output *InputService3TestShapeInputService3TestCaseOperation1Output) {
op := &aws.Operation{
Name: opInputService3TestCaseOperation1,
}
if input == nil {
input = &InputService3TestShapeInputShape{}
}
req = c.newRequest(op, input, output)
output = &InputService3TestShapeInputService3TestCaseOperation1Output{}
req.Data = output
return
}
func (c *InputService3ProtocolTest) InputService3TestCaseOperation1(input *InputService3TestShapeInputShape) (*InputService3TestShapeInputService3TestCaseOperation1Output, error) {
req, out := c.InputService3TestCaseOperation1Request(input)
err := req.Send()
return out, err
}
type InputService3TestShapeInputService3TestCaseOperation1Output struct {
metadataInputService3TestShapeInputService3TestCaseOperation1Output `json:"-" xml:"-"`
}
type metadataInputService3TestShapeInputService3TestCaseOperation1Output struct {
SDKShapeTraits bool `type:"structure"`
}
type InputService3TestShapeInputShape struct {
StructArg *InputService3TestShapeStructType `locationName:"Struct" type:"structure"`
metadataInputService3TestShapeInputShape `json:"-" xml:"-"`
}
type metadataInputService3TestShapeInputShape struct {
SDKShapeTraits bool `type:"structure"`
}
type InputService3TestShapeStructType struct {
ScalarArg *string `locationName:"Scalar" type:"string"`
metadataInputService3TestShapeStructType `json:"-" xml:"-"`
}
type metadataInputService3TestShapeStructType struct {
SDKShapeTraits bool `type:"structure"`
}
type InputService4ProtocolTest struct {
*aws.Service
}
// New returns a new InputService4ProtocolTest client.
func NewInputService4ProtocolTest(config *aws.Config) *InputService4ProtocolTest {
service := &aws.Service{
Config: aws.DefaultConfig.Merge(config),
ServiceName: "inputservice4protocoltest",
APIVersion: "2014-01-01",
}
service.Initialize()
// Handlers
service.Handlers.Sign.PushBack(v4.Sign)
service.Handlers.Build.PushBack(ec2query.Build)
service.Handlers.Unmarshal.PushBack(ec2query.Unmarshal)
service.Handlers.UnmarshalMeta.PushBack(ec2query.UnmarshalMeta)
service.Handlers.UnmarshalError.PushBack(ec2query.UnmarshalError)
return &InputService4ProtocolTest{service}
}
// newRequest creates a new request for a InputService4ProtocolTest operation and runs any
// custom request initialization.
func (c *InputService4ProtocolTest) newRequest(op *aws.Operation, params, data interface{}) *aws.Request {
req := aws.NewRequest(c.Service, op, params, data)
return req
}
const opInputService4TestCaseOperation1 = "OperationName"
// InputService4TestCaseOperation1Request generates a request for the InputService4TestCaseOperation1 operation.
func (c *InputService4ProtocolTest) InputService4TestCaseOperation1Request(input *InputService4TestShapeInputShape) (req *aws.Request, output *InputService4TestShapeInputService4TestCaseOperation1Output) {
op := &aws.Operation{
Name: opInputService4TestCaseOperation1,
}
if input == nil {
input = &InputService4TestShapeInputShape{}
}
req = c.newRequest(op, input, output)
output = &InputService4TestShapeInputService4TestCaseOperation1Output{}
req.Data = output
return
}
func (c *InputService4ProtocolTest) InputService4TestCaseOperation1(input *InputService4TestShapeInputShape) (*InputService4TestShapeInputService4TestCaseOperation1Output, error) {
req, out := c.InputService4TestCaseOperation1Request(input)
err := req.Send()
return out, err
}
type InputService4TestShapeInputService4TestCaseOperation1Output struct {
metadataInputService4TestShapeInputService4TestCaseOperation1Output `json:"-" xml:"-"`
}
type metadataInputService4TestShapeInputService4TestCaseOperation1Output struct {
SDKShapeTraits bool `type:"structure"`
}
type InputService4TestShapeInputShape struct {
ListArg []*string `type:"list"`
metadataInputService4TestShapeInputShape `json:"-" xml:"-"`
}
type metadataInputService4TestShapeInputShape struct {
SDKShapeTraits bool `type:"structure"`
}
type InputService5ProtocolTest struct {
*aws.Service
}
// New returns a new InputService5ProtocolTest client.
func NewInputService5ProtocolTest(config *aws.Config) *InputService5ProtocolTest {
service := &aws.Service{
Config: aws.DefaultConfig.Merge(config),
ServiceName: "inputservice5protocoltest",
APIVersion: "2014-01-01",
}
service.Initialize()
// Handlers
service.Handlers.Sign.PushBack(v4.Sign)
service.Handlers.Build.PushBack(ec2query.Build)
service.Handlers.Unmarshal.PushBack(ec2query.Unmarshal)
service.Handlers.UnmarshalMeta.PushBack(ec2query.UnmarshalMeta)
service.Handlers.UnmarshalError.PushBack(ec2query.UnmarshalError)
return &InputService5ProtocolTest{service}
}
// newRequest creates a new request for a InputService5ProtocolTest operation and runs any
// custom request initialization.
func (c *InputService5ProtocolTest) newRequest(op *aws.Operation, params, data interface{}) *aws.Request {
req := aws.NewRequest(c.Service, op, params, data)
return req
}
const opInputService5TestCaseOperation1 = "OperationName"
// InputService5TestCaseOperation1Request generates a request for the InputService5TestCaseOperation1 operation.
func (c *InputService5ProtocolTest) InputService5TestCaseOperation1Request(input *InputService5TestShapeInputShape) (req *aws.Request, output *InputService5TestShapeInputService5TestCaseOperation1Output) {
op := &aws.Operation{
Name: opInputService5TestCaseOperation1,
}
if input == nil {
input = &InputService5TestShapeInputShape{}
}
req = c.newRequest(op, input, output)
output = &InputService5TestShapeInputService5TestCaseOperation1Output{}
req.Data = output
return
}
func (c *InputService5ProtocolTest) InputService5TestCaseOperation1(input *InputService5TestShapeInputShape) (*InputService5TestShapeInputService5TestCaseOperation1Output, error) {
req, out := c.InputService5TestCaseOperation1Request(input)
err := req.Send()
return out, err
}
type InputService5TestShapeInputService5TestCaseOperation1Output struct {
metadataInputService5TestShapeInputService5TestCaseOperation1Output `json:"-" xml:"-"`
}
type metadataInputService5TestShapeInputService5TestCaseOperation1Output struct {
SDKShapeTraits bool `type:"structure"`
}
type InputService5TestShapeInputShape struct {
ListArg []*string `locationName:"ListMemberName" locationNameList:"item" type:"list"`
metadataInputService5TestShapeInputShape `json:"-" xml:"-"`
}
type metadataInputService5TestShapeInputShape struct {
SDKShapeTraits bool `type:"structure"`
}
type InputService6ProtocolTest struct {
*aws.Service
}
// New returns a new InputService6ProtocolTest client.
func NewInputService6ProtocolTest(config *aws.Config) *InputService6ProtocolTest {
service := &aws.Service{
Config: aws.DefaultConfig.Merge(config),
ServiceName: "inputservice6protocoltest",
APIVersion: "2014-01-01",
}
service.Initialize()
// Handlers
service.Handlers.Sign.PushBack(v4.Sign)
service.Handlers.Build.PushBack(ec2query.Build)
service.Handlers.Unmarshal.PushBack(ec2query.Unmarshal)
service.Handlers.UnmarshalMeta.PushBack(ec2query.UnmarshalMeta)
service.Handlers.UnmarshalError.PushBack(ec2query.UnmarshalError)
return &InputService6ProtocolTest{service}
}
// newRequest creates a new request for a InputService6ProtocolTest operation and runs any
// custom request initialization.
func (c *InputService6ProtocolTest) newRequest(op *aws.Operation, params, data interface{}) *aws.Request {
req := aws.NewRequest(c.Service, op, params, data)
return req
}
const opInputService6TestCaseOperation1 = "OperationName"
// InputService6TestCaseOperation1Request generates a request for the InputService6TestCaseOperation1 operation.
func (c *InputService6ProtocolTest) InputService6TestCaseOperation1Request(input *InputService6TestShapeInputShape) (req *aws.Request, output *InputService6TestShapeInputService6TestCaseOperation1Output) {
op := &aws.Operation{
Name: opInputService6TestCaseOperation1,
}
if input == nil {
input = &InputService6TestShapeInputShape{}
}
req = c.newRequest(op, input, output)
output = &InputService6TestShapeInputService6TestCaseOperation1Output{}
req.Data = output
return
}
func (c *InputService6ProtocolTest) InputService6TestCaseOperation1(input *InputService6TestShapeInputShape) (*InputService6TestShapeInputService6TestCaseOperation1Output, error) {
req, out := c.InputService6TestCaseOperation1Request(input)
err := req.Send()
return out, err
}
type InputService6TestShapeInputService6TestCaseOperation1Output struct {
metadataInputService6TestShapeInputService6TestCaseOperation1Output `json:"-" xml:"-"`
}
type metadataInputService6TestShapeInputService6TestCaseOperation1Output struct {
SDKShapeTraits bool `type:"structure"`
}
type InputService6TestShapeInputShape struct {
ListArg []*string `locationName:"ListMemberName" queryName:"ListQueryName" locationNameList:"item" type:"list"`
metadataInputService6TestShapeInputShape `json:"-" xml:"-"`
}
type metadataInputService6TestShapeInputShape struct {
SDKShapeTraits bool `type:"structure"`
}
type InputService7ProtocolTest struct {
*aws.Service
}
// New returns a new InputService7ProtocolTest client.
func NewInputService7ProtocolTest(config *aws.Config) *InputService7ProtocolTest {
service := &aws.Service{
Config: aws.DefaultConfig.Merge(config),
ServiceName: "inputservice7protocoltest",
APIVersion: "2014-01-01",
}
service.Initialize()
// Handlers
service.Handlers.Sign.PushBack(v4.Sign)
service.Handlers.Build.PushBack(ec2query.Build)
service.Handlers.Unmarshal.PushBack(ec2query.Unmarshal)
service.Handlers.UnmarshalMeta.PushBack(ec2query.UnmarshalMeta)
service.Handlers.UnmarshalError.PushBack(ec2query.UnmarshalError)
return &InputService7ProtocolTest{service}
}
// newRequest creates a new request for a InputService7ProtocolTest operation and runs any
// custom request initialization.
func (c *InputService7ProtocolTest) newRequest(op *aws.Operation, params, data interface{}) *aws.Request {
req := aws.NewRequest(c.Service, op, params, data)
return req
}
const opInputService7TestCaseOperation1 = "OperationName"
// InputService7TestCaseOperation1Request generates a request for the InputService7TestCaseOperation1 operation.
func (c *InputService7ProtocolTest) InputService7TestCaseOperation1Request(input *InputService7TestShapeInputShape) (req *aws.Request, output *InputService7TestShapeInputService7TestCaseOperation1Output) {
op := &aws.Operation{
Name: opInputService7TestCaseOperation1,
}
if input == nil {
input = &InputService7TestShapeInputShape{}
}
req = c.newRequest(op, input, output)
output = &InputService7TestShapeInputService7TestCaseOperation1Output{}
req.Data = output
return
}
func (c *InputService7ProtocolTest) InputService7TestCaseOperation1(input *InputService7TestShapeInputShape) (*InputService7TestShapeInputService7TestCaseOperation1Output, error) {
req, out := c.InputService7TestCaseOperation1Request(input)
err := req.Send()
return out, err
}
type InputService7TestShapeInputService7TestCaseOperation1Output struct {
metadataInputService7TestShapeInputService7TestCaseOperation1Output `json:"-" xml:"-"`
}
type metadataInputService7TestShapeInputService7TestCaseOperation1Output struct {
SDKShapeTraits bool `type:"structure"`
}
type InputService7TestShapeInputShape struct {
BlobArg []byte `type:"blob"`
metadataInputService7TestShapeInputShape `json:"-" xml:"-"`
}
type metadataInputService7TestShapeInputShape struct {
SDKShapeTraits bool `type:"structure"`
}
type InputService8ProtocolTest struct {
*aws.Service
}
// New returns a new InputService8ProtocolTest client.
func NewInputService8ProtocolTest(config *aws.Config) *InputService8ProtocolTest {
service := &aws.Service{
Config: aws.DefaultConfig.Merge(config),
ServiceName: "inputservice8protocoltest",
APIVersion: "2014-01-01",
}
service.Initialize()
// Handlers
service.Handlers.Sign.PushBack(v4.Sign)
service.Handlers.Build.PushBack(ec2query.Build)
service.Handlers.Unmarshal.PushBack(ec2query.Unmarshal)
service.Handlers.UnmarshalMeta.PushBack(ec2query.UnmarshalMeta)
service.Handlers.UnmarshalError.PushBack(ec2query.UnmarshalError)
return &InputService8ProtocolTest{service}
}
// newRequest creates a new request for a InputService8ProtocolTest operation and runs any
// custom request initialization.
func (c *InputService8ProtocolTest) newRequest(op *aws.Operation, params, data interface{}) *aws.Request {
req := aws.NewRequest(c.Service, op, params, data)
return req
}
const opInputService8TestCaseOperation1 = "OperationName"
// InputService8TestCaseOperation1Request generates a request for the InputService8TestCaseOperation1 operation.
func (c *InputService8ProtocolTest) InputService8TestCaseOperation1Request(input *InputService8TestShapeInputShape) (req *aws.Request, output *InputService8TestShapeInputService8TestCaseOperation1Output) {
op := &aws.Operation{
Name: opInputService8TestCaseOperation1,
}
if input == nil {
input = &InputService8TestShapeInputShape{}
}
req = c.newRequest(op, input, output)
output = &InputService8TestShapeInputService8TestCaseOperation1Output{}
req.Data = output
return
}
func (c *InputService8ProtocolTest) InputService8TestCaseOperation1(input *InputService8TestShapeInputShape) (*InputService8TestShapeInputService8TestCaseOperation1Output, error) {
req, out := c.InputService8TestCaseOperation1Request(input)
err := req.Send()
return out, err
}
type InputService8TestShapeInputService8TestCaseOperation1Output struct {
metadataInputService8TestShapeInputService8TestCaseOperation1Output `json:"-" xml:"-"`
}
type metadataInputService8TestShapeInputService8TestCaseOperation1Output struct {
SDKShapeTraits bool `type:"structure"`
}
type InputService8TestShapeInputShape struct {
TimeArg *time.Time `type:"timestamp" timestampFormat:"iso8601"`
metadataInputService8TestShapeInputShape `json:"-" xml:"-"`
}
type metadataInputService8TestShapeInputShape struct {
SDKShapeTraits bool `type:"structure"`
}
//
// Tests begin here
//
func TestInputService1ProtocolTestScalarMembersCase1(t *testing.T) {
svc := NewInputService1ProtocolTest(nil)
svc.Endpoint = "https://test"
input := &InputService1TestShapeInputShape{
Bar: aws.String("val2"),
Foo: aws.String("val1"),
}
req, _ := svc.InputService1TestCaseOperation1Request(input)
r := req.HTTPRequest
// build request
ec2query.Build(req)
assert.NoError(t, req.Error)
// assert body
assert.NotNil(t, r.Body)
body, _ := ioutil.ReadAll(r.Body)
assert.Equal(t, util.Trim(`Action=OperationName&Bar=val2&Foo=val1&Version=2014-01-01`), util.Trim(string(body)))
// assert URL
assert.Equal(t, "https://test/", r.URL.String())
// assert headers
}
func TestInputService2ProtocolTestStructureWithLocationNameAndQueryNameAppliedToMembersCase1(t *testing.T) {
svc := NewInputService2ProtocolTest(nil)
svc.Endpoint = "https://test"
input := &InputService2TestShapeInputShape{
Bar: aws.String("val2"),
Foo: aws.String("val1"),
Yuck: aws.String("val3"),
}
req, _ := svc.InputService2TestCaseOperation1Request(input)
r := req.HTTPRequest
// build request
ec2query.Build(req)
assert.NoError(t, req.Error)
// assert body
assert.NotNil(t, r.Body)
body, _ := ioutil.ReadAll(r.Body)
assert.Equal(t, util.Trim(`Action=OperationName&BarLocationName=val2&Foo=val1&Version=2014-01-01&yuckQueryName=val3`), util.Trim(string(body)))
// assert URL
assert.Equal(t, "https://test/", r.URL.String())
// assert headers
}
func TestInputService3ProtocolTestNestedStructureMembersCase1(t *testing.T) {
svc := NewInputService3ProtocolTest(nil)
svc.Endpoint = "https://test"
input := &InputService3TestShapeInputShape{
StructArg: &InputService3TestShapeStructType{
ScalarArg: aws.String("foo"),
},
}
req, _ := svc.InputService3TestCaseOperation1Request(input)
r := req.HTTPRequest
// build request
ec2query.Build(req)
assert.NoError(t, req.Error)
// assert body
assert.NotNil(t, r.Body)
body, _ := ioutil.ReadAll(r.Body)
assert.Equal(t, util.Trim(`Action=OperationName&Struct.Scalar=foo&Version=2014-01-01`), util.Trim(string(body)))
// assert URL
assert.Equal(t, "https://test/", r.URL.String())
// assert headers
}
func TestInputService4ProtocolTestListTypesCase1(t *testing.T) {
svc := NewInputService4ProtocolTest(nil)
svc.Endpoint = "https://test"
input := &InputService4TestShapeInputShape{
ListArg: []*string{
aws.String("foo"),
aws.String("bar"),
aws.String("baz"),
},
}
req, _ := svc.InputService4TestCaseOperation1Request(input)
r := req.HTTPRequest
// build request
ec2query.Build(req)
assert.NoError(t, req.Error)
// assert body
assert.NotNil(t, r.Body)
body, _ := ioutil.ReadAll(r.Body)
assert.Equal(t, util.Trim(`Action=OperationName&ListArg.1=foo&ListArg.2=bar&ListArg.3=baz&Version=2014-01-01`), util.Trim(string(body)))
// assert URL
assert.Equal(t, "https://test/", r.URL.String())
// assert headers
}
func TestInputService5ProtocolTestListWithLocationNameAppliedToMemberCase1(t *testing.T) {
svc := NewInputService5ProtocolTest(nil)
svc.Endpoint = "https://test"
input := &InputService5TestShapeInputShape{
ListArg: []*string{
aws.String("a"),
aws.String("b"),
aws.String("c"),
},
}
req, _ := svc.InputService5TestCaseOperation1Request(input)
r := req.HTTPRequest
// build request
ec2query.Build(req)
assert.NoError(t, req.Error)
// assert body
assert.NotNil(t, r.Body)
body, _ := ioutil.ReadAll(r.Body)
assert.Equal(t, util.Trim(`Action=OperationName&ListMemberName.1=a&ListMemberName.2=b&ListMemberName.3=c&Version=2014-01-01`), util.Trim(string(body)))
// assert URL
assert.Equal(t, "https://test/", r.URL.String())
// assert headers
}
func TestInputService6ProtocolTestListWithLocationNameAndQueryNameCase1(t *testing.T) {
svc := NewInputService6ProtocolTest(nil)
svc.Endpoint = "https://test"
input := &InputService6TestShapeInputShape{
ListArg: []*string{
aws.String("a"),
aws.String("b"),
aws.String("c"),
},
}
req, _ := svc.InputService6TestCaseOperation1Request(input)
r := req.HTTPRequest
// build request
ec2query.Build(req)
assert.NoError(t, req.Error)
// assert body
assert.NotNil(t, r.Body)
body, _ := ioutil.ReadAll(r.Body)
assert.Equal(t, util.Trim(`Action=OperationName&ListQueryName.1=a&ListQueryName.2=b&ListQueryName.3=c&Version=2014-01-01`), util.Trim(string(body)))
// assert URL
assert.Equal(t, "https://test/", r.URL.String())
// assert headers
}
func TestInputService7ProtocolTestBase64EncodedBlobsCase1(t *testing.T) {
svc := NewInputService7ProtocolTest(nil)
svc.Endpoint = "https://test"
input := &InputService7TestShapeInputShape{
BlobArg: []byte("foo"),
}
req, _ := svc.InputService7TestCaseOperation1Request(input)
r := req.HTTPRequest
// build request
ec2query.Build(req)
assert.NoError(t, req.Error)
// assert body
assert.NotNil(t, r.Body)
body, _ := ioutil.ReadAll(r.Body)
assert.Equal(t, util.Trim(`Action=OperationName&BlobArg=Zm9v&Version=2014-01-01`), util.Trim(string(body)))
// assert URL
assert.Equal(t, "https://test/", r.URL.String())
// assert headers
}
func TestInputService8ProtocolTestTimestampValuesCase1(t *testing.T) {
svc := NewInputService8ProtocolTest(nil)
svc.Endpoint = "https://test"
input := &InputService8TestShapeInputShape{
TimeArg: aws.Time(time.Unix(1422172800, 0)),
}
req, _ := svc.InputService8TestCaseOperation1Request(input)
r := req.HTTPRequest
// build request
ec2query.Build(req)
assert.NoError(t, req.Error)
// assert body
assert.NotNil(t, r.Body)
body, _ := ioutil.ReadAll(r.Body)
assert.Equal(t, util.Trim(`Action=OperationName&TimeArg=2015-01-25T08%3A00%3A00Z&Version=2014-01-01`), util.Trim(string(body)))
// assert URL
assert.Equal(t, "https://test/", r.URL.String())
// assert headers
}
@@ -1,54 +0,0 @@
package ec2query
//go:generate go run ../../fixtures/protocol/generate.go ../../fixtures/protocol/output/ec2.json unmarshal_test.go
import (
"encoding/xml"
"io"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/internal/protocol/xml/xmlutil"
)
// Unmarshal unmarshals a response body for the EC2 protocol.
func Unmarshal(r *aws.Request) {
defer r.HTTPResponse.Body.Close()
if r.DataFilled() {
decoder := xml.NewDecoder(r.HTTPResponse.Body)
err := xmlutil.UnmarshalXML(r.Data, decoder, "")
if err != nil {
r.Error = awserr.New("SerializationError", "failed decoding EC2 Query response", err)
return
}
}
}
// UnmarshalMeta unmarshals response headers for the EC2 protocol.
func UnmarshalMeta(r *aws.Request) {
// TODO implement unmarshaling of request IDs
}
type xmlErrorResponse struct {
XMLName xml.Name `xml:"Response"`
Code string `xml:"Errors>Error>Code"`
Message string `xml:"Errors>Error>Message"`
RequestID string `xml:"RequestId"`
}
// UnmarshalError unmarshals a response error for the EC2 protocol.
func UnmarshalError(r *aws.Request) {
defer r.HTTPResponse.Body.Close()
resp := &xmlErrorResponse{}
err := xml.NewDecoder(r.HTTPResponse.Body).Decode(resp)
if err != nil && err != io.EOF {
r.Error = awserr.New("SerializationError", "failed decoding EC2 Query error response", err)
} else {
r.Error = awserr.NewRequestFailure(
awserr.New(resp.Code, resp.Message, nil),
r.HTTPResponse.StatusCode,
resp.RequestID,
)
}
}
@@ -1,816 +0,0 @@
package ec2query_test
import (
"bytes"
"encoding/json"
"encoding/xml"
"io"
"io/ioutil"
"net/http"
"net/url"
"testing"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/internal/protocol/ec2query"
"github.com/aws/aws-sdk-go/internal/protocol/xml/xmlutil"
"github.com/aws/aws-sdk-go/internal/signer/v4"
"github.com/aws/aws-sdk-go/internal/util"
"github.com/stretchr/testify/assert"
)
var _ bytes.Buffer // always import bytes
var _ http.Request
var _ json.Marshaler
var _ time.Time
var _ xmlutil.XMLNode
var _ xml.Attr
var _ = ioutil.Discard
var _ = util.Trim("")
var _ = url.Values{}
var _ = io.EOF
type OutputService1ProtocolTest struct {
*aws.Service
}
// New returns a new OutputService1ProtocolTest client.
func NewOutputService1ProtocolTest(config *aws.Config) *OutputService1ProtocolTest {
service := &aws.Service{
Config: aws.DefaultConfig.Merge(config),
ServiceName: "outputservice1protocoltest",
APIVersion: "",
}
service.Initialize()
// Handlers
service.Handlers.Sign.PushBack(v4.Sign)
service.Handlers.Build.PushBack(ec2query.Build)
service.Handlers.Unmarshal.PushBack(ec2query.Unmarshal)
service.Handlers.UnmarshalMeta.PushBack(ec2query.UnmarshalMeta)
service.Handlers.UnmarshalError.PushBack(ec2query.UnmarshalError)
return &OutputService1ProtocolTest{service}
}
// newRequest creates a new request for a OutputService1ProtocolTest operation and runs any
// custom request initialization.
func (c *OutputService1ProtocolTest) newRequest(op *aws.Operation, params, data interface{}) *aws.Request {
req := aws.NewRequest(c.Service, op, params, data)
return req
}
const opOutputService1TestCaseOperation1 = "OperationName"
// OutputService1TestCaseOperation1Request generates a request for the OutputService1TestCaseOperation1 operation.
func (c *OutputService1ProtocolTest) OutputService1TestCaseOperation1Request(input *OutputService1TestShapeOutputService1TestCaseOperation1Input) (req *aws.Request, output *OutputService1TestShapeOutputShape) {
op := &aws.Operation{
Name: opOutputService1TestCaseOperation1,
}
if input == nil {
input = &OutputService1TestShapeOutputService1TestCaseOperation1Input{}
}
req = c.newRequest(op, input, output)
output = &OutputService1TestShapeOutputShape{}
req.Data = output
return
}
func (c *OutputService1ProtocolTest) OutputService1TestCaseOperation1(input *OutputService1TestShapeOutputService1TestCaseOperation1Input) (*OutputService1TestShapeOutputShape, error) {
req, out := c.OutputService1TestCaseOperation1Request(input)
err := req.Send()
return out, err
}
type OutputService1TestShapeOutputService1TestCaseOperation1Input struct {
metadataOutputService1TestShapeOutputService1TestCaseOperation1Input `json:"-" xml:"-"`
}
type metadataOutputService1TestShapeOutputService1TestCaseOperation1Input struct {
SDKShapeTraits bool `type:"structure"`
}
type OutputService1TestShapeOutputShape struct {
Char *string `type:"character"`
Double *float64 `type:"double"`
FalseBool *bool `type:"boolean"`
Float *float64 `type:"float"`
Long *int64 `type:"long"`
Num *int64 `locationName:"FooNum" type:"integer"`
Str *string `type:"string"`
TrueBool *bool `type:"boolean"`
metadataOutputService1TestShapeOutputShape `json:"-" xml:"-"`
}
type metadataOutputService1TestShapeOutputShape struct {
SDKShapeTraits bool `type:"structure"`
}
type OutputService2ProtocolTest struct {
*aws.Service
}
// New returns a new OutputService2ProtocolTest client.
func NewOutputService2ProtocolTest(config *aws.Config) *OutputService2ProtocolTest {
service := &aws.Service{
Config: aws.DefaultConfig.Merge(config),
ServiceName: "outputservice2protocoltest",
APIVersion: "",
}
service.Initialize()
// Handlers
service.Handlers.Sign.PushBack(v4.Sign)
service.Handlers.Build.PushBack(ec2query.Build)
service.Handlers.Unmarshal.PushBack(ec2query.Unmarshal)
service.Handlers.UnmarshalMeta.PushBack(ec2query.UnmarshalMeta)
service.Handlers.UnmarshalError.PushBack(ec2query.UnmarshalError)
return &OutputService2ProtocolTest{service}
}
// newRequest creates a new request for a OutputService2ProtocolTest operation and runs any
// custom request initialization.
func (c *OutputService2ProtocolTest) newRequest(op *aws.Operation, params, data interface{}) *aws.Request {
req := aws.NewRequest(c.Service, op, params, data)
return req
}
const opOutputService2TestCaseOperation1 = "OperationName"
// OutputService2TestCaseOperation1Request generates a request for the OutputService2TestCaseOperation1 operation.
func (c *OutputService2ProtocolTest) OutputService2TestCaseOperation1Request(input *OutputService2TestShapeOutputService2TestCaseOperation1Input) (req *aws.Request, output *OutputService2TestShapeOutputShape) {
op := &aws.Operation{
Name: opOutputService2TestCaseOperation1,
}
if input == nil {
input = &OutputService2TestShapeOutputService2TestCaseOperation1Input{}
}
req = c.newRequest(op, input, output)
output = &OutputService2TestShapeOutputShape{}
req.Data = output
return
}
func (c *OutputService2ProtocolTest) OutputService2TestCaseOperation1(input *OutputService2TestShapeOutputService2TestCaseOperation1Input) (*OutputService2TestShapeOutputShape, error) {
req, out := c.OutputService2TestCaseOperation1Request(input)
err := req.Send()
return out, err
}
type OutputService2TestShapeOutputService2TestCaseOperation1Input struct {
metadataOutputService2TestShapeOutputService2TestCaseOperation1Input `json:"-" xml:"-"`
}
type metadataOutputService2TestShapeOutputService2TestCaseOperation1Input struct {
SDKShapeTraits bool `type:"structure"`
}
type OutputService2TestShapeOutputShape struct {
Blob []byte `type:"blob"`
metadataOutputService2TestShapeOutputShape `json:"-" xml:"-"`
}
type metadataOutputService2TestShapeOutputShape struct {
SDKShapeTraits bool `type:"structure"`
}
type OutputService3ProtocolTest struct {
*aws.Service
}
// New returns a new OutputService3ProtocolTest client.
func NewOutputService3ProtocolTest(config *aws.Config) *OutputService3ProtocolTest {
service := &aws.Service{
Config: aws.DefaultConfig.Merge(config),
ServiceName: "outputservice3protocoltest",
APIVersion: "",
}
service.Initialize()
// Handlers
service.Handlers.Sign.PushBack(v4.Sign)
service.Handlers.Build.PushBack(ec2query.Build)
service.Handlers.Unmarshal.PushBack(ec2query.Unmarshal)
service.Handlers.UnmarshalMeta.PushBack(ec2query.UnmarshalMeta)
service.Handlers.UnmarshalError.PushBack(ec2query.UnmarshalError)
return &OutputService3ProtocolTest{service}
}
// newRequest creates a new request for a OutputService3ProtocolTest operation and runs any
// custom request initialization.
func (c *OutputService3ProtocolTest) newRequest(op *aws.Operation, params, data interface{}) *aws.Request {
req := aws.NewRequest(c.Service, op, params, data)
return req
}
const opOutputService3TestCaseOperation1 = "OperationName"
// OutputService3TestCaseOperation1Request generates a request for the OutputService3TestCaseOperation1 operation.
func (c *OutputService3ProtocolTest) OutputService3TestCaseOperation1Request(input *OutputService3TestShapeOutputService3TestCaseOperation1Input) (req *aws.Request, output *OutputService3TestShapeOutputShape) {
op := &aws.Operation{
Name: opOutputService3TestCaseOperation1,
}
if input == nil {
input = &OutputService3TestShapeOutputService3TestCaseOperation1Input{}
}
req = c.newRequest(op, input, output)
output = &OutputService3TestShapeOutputShape{}
req.Data = output
return
}
func (c *OutputService3ProtocolTest) OutputService3TestCaseOperation1(input *OutputService3TestShapeOutputService3TestCaseOperation1Input) (*OutputService3TestShapeOutputShape, error) {
req, out := c.OutputService3TestCaseOperation1Request(input)
err := req.Send()
return out, err
}
type OutputService3TestShapeOutputService3TestCaseOperation1Input struct {
metadataOutputService3TestShapeOutputService3TestCaseOperation1Input `json:"-" xml:"-"`
}
type metadataOutputService3TestShapeOutputService3TestCaseOperation1Input struct {
SDKShapeTraits bool `type:"structure"`
}
type OutputService3TestShapeOutputShape struct {
ListMember []*string `type:"list"`
metadataOutputService3TestShapeOutputShape `json:"-" xml:"-"`
}
type metadataOutputService3TestShapeOutputShape struct {
SDKShapeTraits bool `type:"structure"`
}
type OutputService4ProtocolTest struct {
*aws.Service
}
// New returns a new OutputService4ProtocolTest client.
func NewOutputService4ProtocolTest(config *aws.Config) *OutputService4ProtocolTest {
service := &aws.Service{
Config: aws.DefaultConfig.Merge(config),
ServiceName: "outputservice4protocoltest",
APIVersion: "",
}
service.Initialize()
// Handlers
service.Handlers.Sign.PushBack(v4.Sign)
service.Handlers.Build.PushBack(ec2query.Build)
service.Handlers.Unmarshal.PushBack(ec2query.Unmarshal)
service.Handlers.UnmarshalMeta.PushBack(ec2query.UnmarshalMeta)
service.Handlers.UnmarshalError.PushBack(ec2query.UnmarshalError)
return &OutputService4ProtocolTest{service}
}
// newRequest creates a new request for a OutputService4ProtocolTest operation and runs any
// custom request initialization.
func (c *OutputService4ProtocolTest) newRequest(op *aws.Operation, params, data interface{}) *aws.Request {
req := aws.NewRequest(c.Service, op, params, data)
return req
}
const opOutputService4TestCaseOperation1 = "OperationName"
// OutputService4TestCaseOperation1Request generates a request for the OutputService4TestCaseOperation1 operation.
func (c *OutputService4ProtocolTest) OutputService4TestCaseOperation1Request(input *OutputService4TestShapeOutputService4TestCaseOperation1Input) (req *aws.Request, output *OutputService4TestShapeOutputShape) {
op := &aws.Operation{
Name: opOutputService4TestCaseOperation1,
}
if input == nil {
input = &OutputService4TestShapeOutputService4TestCaseOperation1Input{}
}
req = c.newRequest(op, input, output)
output = &OutputService4TestShapeOutputShape{}
req.Data = output
return
}
func (c *OutputService4ProtocolTest) OutputService4TestCaseOperation1(input *OutputService4TestShapeOutputService4TestCaseOperation1Input) (*OutputService4TestShapeOutputShape, error) {
req, out := c.OutputService4TestCaseOperation1Request(input)
err := req.Send()
return out, err
}
type OutputService4TestShapeOutputService4TestCaseOperation1Input struct {
metadataOutputService4TestShapeOutputService4TestCaseOperation1Input `json:"-" xml:"-"`
}
type metadataOutputService4TestShapeOutputService4TestCaseOperation1Input struct {
SDKShapeTraits bool `type:"structure"`
}
type OutputService4TestShapeOutputShape struct {
ListMember []*string `locationNameList:"item" type:"list"`
metadataOutputService4TestShapeOutputShape `json:"-" xml:"-"`
}
type metadataOutputService4TestShapeOutputShape struct {
SDKShapeTraits bool `type:"structure"`
}
type OutputService5ProtocolTest struct {
*aws.Service
}
// New returns a new OutputService5ProtocolTest client.
func NewOutputService5ProtocolTest(config *aws.Config) *OutputService5ProtocolTest {
service := &aws.Service{
Config: aws.DefaultConfig.Merge(config),
ServiceName: "outputservice5protocoltest",
APIVersion: "",
}
service.Initialize()
// Handlers
service.Handlers.Sign.PushBack(v4.Sign)
service.Handlers.Build.PushBack(ec2query.Build)
service.Handlers.Unmarshal.PushBack(ec2query.Unmarshal)
service.Handlers.UnmarshalMeta.PushBack(ec2query.UnmarshalMeta)
service.Handlers.UnmarshalError.PushBack(ec2query.UnmarshalError)
return &OutputService5ProtocolTest{service}
}
// newRequest creates a new request for a OutputService5ProtocolTest operation and runs any
// custom request initialization.
func (c *OutputService5ProtocolTest) newRequest(op *aws.Operation, params, data interface{}) *aws.Request {
req := aws.NewRequest(c.Service, op, params, data)
return req
}
const opOutputService5TestCaseOperation1 = "OperationName"
// OutputService5TestCaseOperation1Request generates a request for the OutputService5TestCaseOperation1 operation.
func (c *OutputService5ProtocolTest) OutputService5TestCaseOperation1Request(input *OutputService5TestShapeOutputService5TestCaseOperation1Input) (req *aws.Request, output *OutputService5TestShapeOutputShape) {
op := &aws.Operation{
Name: opOutputService5TestCaseOperation1,
}
if input == nil {
input = &OutputService5TestShapeOutputService5TestCaseOperation1Input{}
}
req = c.newRequest(op, input, output)
output = &OutputService5TestShapeOutputShape{}
req.Data = output
return
}
func (c *OutputService5ProtocolTest) OutputService5TestCaseOperation1(input *OutputService5TestShapeOutputService5TestCaseOperation1Input) (*OutputService5TestShapeOutputShape, error) {
req, out := c.OutputService5TestCaseOperation1Request(input)
err := req.Send()
return out, err
}
type OutputService5TestShapeOutputService5TestCaseOperation1Input struct {
metadataOutputService5TestShapeOutputService5TestCaseOperation1Input `json:"-" xml:"-"`
}
type metadataOutputService5TestShapeOutputService5TestCaseOperation1Input struct {
SDKShapeTraits bool `type:"structure"`
}
type OutputService5TestShapeOutputShape struct {
ListMember []*string `type:"list" flattened:"true"`
metadataOutputService5TestShapeOutputShape `json:"-" xml:"-"`
}
type metadataOutputService5TestShapeOutputShape struct {
SDKShapeTraits bool `type:"structure"`
}
type OutputService6ProtocolTest struct {
*aws.Service
}
// New returns a new OutputService6ProtocolTest client.
func NewOutputService6ProtocolTest(config *aws.Config) *OutputService6ProtocolTest {
service := &aws.Service{
Config: aws.DefaultConfig.Merge(config),
ServiceName: "outputservice6protocoltest",
APIVersion: "",
}
service.Initialize()
// Handlers
service.Handlers.Sign.PushBack(v4.Sign)
service.Handlers.Build.PushBack(ec2query.Build)
service.Handlers.Unmarshal.PushBack(ec2query.Unmarshal)
service.Handlers.UnmarshalMeta.PushBack(ec2query.UnmarshalMeta)
service.Handlers.UnmarshalError.PushBack(ec2query.UnmarshalError)
return &OutputService6ProtocolTest{service}
}
// newRequest creates a new request for a OutputService6ProtocolTest operation and runs any
// custom request initialization.
func (c *OutputService6ProtocolTest) newRequest(op *aws.Operation, params, data interface{}) *aws.Request {
req := aws.NewRequest(c.Service, op, params, data)
return req
}
const opOutputService6TestCaseOperation1 = "OperationName"
// OutputService6TestCaseOperation1Request generates a request for the OutputService6TestCaseOperation1 operation.
func (c *OutputService6ProtocolTest) OutputService6TestCaseOperation1Request(input *OutputService6TestShapeOutputService6TestCaseOperation1Input) (req *aws.Request, output *OutputService6TestShapeOutputShape) {
op := &aws.Operation{
Name: opOutputService6TestCaseOperation1,
}
if input == nil {
input = &OutputService6TestShapeOutputService6TestCaseOperation1Input{}
}
req = c.newRequest(op, input, output)
output = &OutputService6TestShapeOutputShape{}
req.Data = output
return
}
func (c *OutputService6ProtocolTest) OutputService6TestCaseOperation1(input *OutputService6TestShapeOutputService6TestCaseOperation1Input) (*OutputService6TestShapeOutputShape, error) {
req, out := c.OutputService6TestCaseOperation1Request(input)
err := req.Send()
return out, err
}
type OutputService6TestShapeOutputService6TestCaseOperation1Input struct {
metadataOutputService6TestShapeOutputService6TestCaseOperation1Input `json:"-" xml:"-"`
}
type metadataOutputService6TestShapeOutputService6TestCaseOperation1Input struct {
SDKShapeTraits bool `type:"structure"`
}
type OutputService6TestShapeOutputShape struct {
Map map[string]*OutputService6TestShapeStructureType `type:"map"`
metadataOutputService6TestShapeOutputShape `json:"-" xml:"-"`
}
type metadataOutputService6TestShapeOutputShape struct {
SDKShapeTraits bool `type:"structure"`
}
type OutputService6TestShapeStructureType struct {
Foo *string `locationName:"foo" type:"string"`
metadataOutputService6TestShapeStructureType `json:"-" xml:"-"`
}
type metadataOutputService6TestShapeStructureType struct {
SDKShapeTraits bool `type:"structure"`
}
type OutputService7ProtocolTest struct {
*aws.Service
}
// New returns a new OutputService7ProtocolTest client.
func NewOutputService7ProtocolTest(config *aws.Config) *OutputService7ProtocolTest {
service := &aws.Service{
Config: aws.DefaultConfig.Merge(config),
ServiceName: "outputservice7protocoltest",
APIVersion: "",
}
service.Initialize()
// Handlers
service.Handlers.Sign.PushBack(v4.Sign)
service.Handlers.Build.PushBack(ec2query.Build)
service.Handlers.Unmarshal.PushBack(ec2query.Unmarshal)
service.Handlers.UnmarshalMeta.PushBack(ec2query.UnmarshalMeta)
service.Handlers.UnmarshalError.PushBack(ec2query.UnmarshalError)
return &OutputService7ProtocolTest{service}
}
// newRequest creates a new request for a OutputService7ProtocolTest operation and runs any
// custom request initialization.
func (c *OutputService7ProtocolTest) newRequest(op *aws.Operation, params, data interface{}) *aws.Request {
req := aws.NewRequest(c.Service, op, params, data)
return req
}
const opOutputService7TestCaseOperation1 = "OperationName"
// OutputService7TestCaseOperation1Request generates a request for the OutputService7TestCaseOperation1 operation.
func (c *OutputService7ProtocolTest) OutputService7TestCaseOperation1Request(input *OutputService7TestShapeOutputService7TestCaseOperation1Input) (req *aws.Request, output *OutputService7TestShapeOutputShape) {
op := &aws.Operation{
Name: opOutputService7TestCaseOperation1,
}
if input == nil {
input = &OutputService7TestShapeOutputService7TestCaseOperation1Input{}
}
req = c.newRequest(op, input, output)
output = &OutputService7TestShapeOutputShape{}
req.Data = output
return
}
func (c *OutputService7ProtocolTest) OutputService7TestCaseOperation1(input *OutputService7TestShapeOutputService7TestCaseOperation1Input) (*OutputService7TestShapeOutputShape, error) {
req, out := c.OutputService7TestCaseOperation1Request(input)
err := req.Send()
return out, err
}
type OutputService7TestShapeOutputService7TestCaseOperation1Input struct {
metadataOutputService7TestShapeOutputService7TestCaseOperation1Input `json:"-" xml:"-"`
}
type metadataOutputService7TestShapeOutputService7TestCaseOperation1Input struct {
SDKShapeTraits bool `type:"structure"`
}
type OutputService7TestShapeOutputShape struct {
Map map[string]*string `type:"map" flattened:"true"`
metadataOutputService7TestShapeOutputShape `json:"-" xml:"-"`
}
type metadataOutputService7TestShapeOutputShape struct {
SDKShapeTraits bool `type:"structure"`
}
type OutputService8ProtocolTest struct {
*aws.Service
}
// New returns a new OutputService8ProtocolTest client.
func NewOutputService8ProtocolTest(config *aws.Config) *OutputService8ProtocolTest {
service := &aws.Service{
Config: aws.DefaultConfig.Merge(config),
ServiceName: "outputservice8protocoltest",
APIVersion: "",
}
service.Initialize()
// Handlers
service.Handlers.Sign.PushBack(v4.Sign)
service.Handlers.Build.PushBack(ec2query.Build)
service.Handlers.Unmarshal.PushBack(ec2query.Unmarshal)
service.Handlers.UnmarshalMeta.PushBack(ec2query.UnmarshalMeta)
service.Handlers.UnmarshalError.PushBack(ec2query.UnmarshalError)
return &OutputService8ProtocolTest{service}
}
// newRequest creates a new request for a OutputService8ProtocolTest operation and runs any
// custom request initialization.
func (c *OutputService8ProtocolTest) newRequest(op *aws.Operation, params, data interface{}) *aws.Request {
req := aws.NewRequest(c.Service, op, params, data)
return req
}
const opOutputService8TestCaseOperation1 = "OperationName"
// OutputService8TestCaseOperation1Request generates a request for the OutputService8TestCaseOperation1 operation.
func (c *OutputService8ProtocolTest) OutputService8TestCaseOperation1Request(input *OutputService8TestShapeOutputService8TestCaseOperation1Input) (req *aws.Request, output *OutputService8TestShapeOutputShape) {
op := &aws.Operation{
Name: opOutputService8TestCaseOperation1,
}
if input == nil {
input = &OutputService8TestShapeOutputService8TestCaseOperation1Input{}
}
req = c.newRequest(op, input, output)
output = &OutputService8TestShapeOutputShape{}
req.Data = output
return
}
func (c *OutputService8ProtocolTest) OutputService8TestCaseOperation1(input *OutputService8TestShapeOutputService8TestCaseOperation1Input) (*OutputService8TestShapeOutputShape, error) {
req, out := c.OutputService8TestCaseOperation1Request(input)
err := req.Send()
return out, err
}
type OutputService8TestShapeOutputService8TestCaseOperation1Input struct {
metadataOutputService8TestShapeOutputService8TestCaseOperation1Input `json:"-" xml:"-"`
}
type metadataOutputService8TestShapeOutputService8TestCaseOperation1Input struct {
SDKShapeTraits bool `type:"structure"`
}
type OutputService8TestShapeOutputShape struct {
Map map[string]*string `locationNameKey:"foo" locationNameValue:"bar" type:"map" flattened:"true"`
metadataOutputService8TestShapeOutputShape `json:"-" xml:"-"`
}
type metadataOutputService8TestShapeOutputShape struct {
SDKShapeTraits bool `type:"structure"`
}
//
// Tests begin here
//
func TestOutputService1ProtocolTestScalarMembersCase1(t *testing.T) {
svc := NewOutputService1ProtocolTest(nil)
buf := bytes.NewReader([]byte("<OperationNameResponse><Str>myname</Str><FooNum>123</FooNum><FalseBool>false</FalseBool><TrueBool>true</TrueBool><Float>1.2</Float><Double>1.3</Double><Long>200</Long><Char>a</Char><RequestId>request-id</RequestId></OperationNameResponse>"))
req, out := svc.OutputService1TestCaseOperation1Request(nil)
req.HTTPResponse = &http.Response{StatusCode: 200, Body: ioutil.NopCloser(buf), Header: http.Header{}}
// set headers
// unmarshal response
ec2query.UnmarshalMeta(req)
ec2query.Unmarshal(req)
assert.NoError(t, req.Error)
// assert response
assert.NotNil(t, out) // ensure out variable is used
assert.Equal(t, "a", *out.Char)
assert.Equal(t, 1.3, *out.Double)
assert.Equal(t, false, *out.FalseBool)
assert.Equal(t, 1.2, *out.Float)
assert.Equal(t, int64(200), *out.Long)
assert.Equal(t, int64(123), *out.Num)
assert.Equal(t, "myname", *out.Str)
assert.Equal(t, true, *out.TrueBool)
}
func TestOutputService2ProtocolTestBlobCase1(t *testing.T) {
svc := NewOutputService2ProtocolTest(nil)
buf := bytes.NewReader([]byte("<OperationNameResponse><Blob>dmFsdWU=</Blob><RequestId>requestid</RequestId></OperationNameResponse>"))
req, out := svc.OutputService2TestCaseOperation1Request(nil)
req.HTTPResponse = &http.Response{StatusCode: 200, Body: ioutil.NopCloser(buf), Header: http.Header{}}
// set headers
// unmarshal response
ec2query.UnmarshalMeta(req)
ec2query.Unmarshal(req)
assert.NoError(t, req.Error)
// assert response
assert.NotNil(t, out) // ensure out variable is used
assert.Equal(t, "value", string(out.Blob))
}
func TestOutputService3ProtocolTestListsCase1(t *testing.T) {
svc := NewOutputService3ProtocolTest(nil)
buf := bytes.NewReader([]byte("<OperationNameResponse><ListMember><member>abc</member><member>123</member></ListMember><RequestId>requestid</RequestId></OperationNameResponse>"))
req, out := svc.OutputService3TestCaseOperation1Request(nil)
req.HTTPResponse = &http.Response{StatusCode: 200, Body: ioutil.NopCloser(buf), Header: http.Header{}}
// set headers
// unmarshal response
ec2query.UnmarshalMeta(req)
ec2query.Unmarshal(req)
assert.NoError(t, req.Error)
// assert response
assert.NotNil(t, out) // ensure out variable is used
assert.Equal(t, "abc", *out.ListMember[0])
assert.Equal(t, "123", *out.ListMember[1])
}
func TestOutputService4ProtocolTestListWithCustomMemberNameCase1(t *testing.T) {
svc := NewOutputService4ProtocolTest(nil)
buf := bytes.NewReader([]byte("<OperationNameResponse><ListMember><item>abc</item><item>123</item></ListMember><RequestId>requestid</RequestId></OperationNameResponse>"))
req, out := svc.OutputService4TestCaseOperation1Request(nil)
req.HTTPResponse = &http.Response{StatusCode: 200, Body: ioutil.NopCloser(buf), Header: http.Header{}}
// set headers
// unmarshal response
ec2query.UnmarshalMeta(req)
ec2query.Unmarshal(req)
assert.NoError(t, req.Error)
// assert response
assert.NotNil(t, out) // ensure out variable is used
assert.Equal(t, "abc", *out.ListMember[0])
assert.Equal(t, "123", *out.ListMember[1])
}
func TestOutputService5ProtocolTestFlattenedListCase1(t *testing.T) {
svc := NewOutputService5ProtocolTest(nil)
buf := bytes.NewReader([]byte("<OperationNameResponse><ListMember>abc</ListMember><ListMember>123</ListMember><RequestId>requestid</RequestId></OperationNameResponse>"))
req, out := svc.OutputService5TestCaseOperation1Request(nil)
req.HTTPResponse = &http.Response{StatusCode: 200, Body: ioutil.NopCloser(buf), Header: http.Header{}}
// set headers
// unmarshal response
ec2query.UnmarshalMeta(req)
ec2query.Unmarshal(req)
assert.NoError(t, req.Error)
// assert response
assert.NotNil(t, out) // ensure out variable is used
assert.Equal(t, "abc", *out.ListMember[0])
assert.Equal(t, "123", *out.ListMember[1])
}
func TestOutputService6ProtocolTestNormalMapCase1(t *testing.T) {
svc := NewOutputService6ProtocolTest(nil)
buf := bytes.NewReader([]byte("<OperationNameResponse><Map><entry><key>qux</key><value><foo>bar</foo></value></entry><entry><key>baz</key><value><foo>bam</foo></value></entry></Map><RequestId>requestid</RequestId></OperationNameResponse>"))
req, out := svc.OutputService6TestCaseOperation1Request(nil)
req.HTTPResponse = &http.Response{StatusCode: 200, Body: ioutil.NopCloser(buf), Header: http.Header{}}
// set headers
// unmarshal response
ec2query.UnmarshalMeta(req)
ec2query.Unmarshal(req)
assert.NoError(t, req.Error)
// assert response
assert.NotNil(t, out) // ensure out variable is used
assert.Equal(t, "bam", *out.Map["baz"].Foo)
assert.Equal(t, "bar", *out.Map["qux"].Foo)
}
func TestOutputService7ProtocolTestFlattenedMapCase1(t *testing.T) {
svc := NewOutputService7ProtocolTest(nil)
buf := bytes.NewReader([]byte("<OperationNameResponse><Map><key>qux</key><value>bar</value></Map><Map><key>baz</key><value>bam</value></Map><RequestId>requestid</RequestId></OperationNameResponse>"))
req, out := svc.OutputService7TestCaseOperation1Request(nil)
req.HTTPResponse = &http.Response{StatusCode: 200, Body: ioutil.NopCloser(buf), Header: http.Header{}}
// set headers
// unmarshal response
ec2query.UnmarshalMeta(req)
ec2query.Unmarshal(req)
assert.NoError(t, req.Error)
// assert response
assert.NotNil(t, out) // ensure out variable is used
assert.Equal(t, "bam", *out.Map["baz"])
assert.Equal(t, "bar", *out.Map["qux"])
}
func TestOutputService8ProtocolTestNamedMapCase1(t *testing.T) {
svc := NewOutputService8ProtocolTest(nil)
buf := bytes.NewReader([]byte("<OperationNameResponse><Map><foo>qux</foo><bar>bar</bar></Map><Map><foo>baz</foo><bar>bam</bar></Map><RequestId>requestid</RequestId></OperationNameResponse>"))
req, out := svc.OutputService8TestCaseOperation1Request(nil)
req.HTTPResponse = &http.Response{StatusCode: 200, Body: ioutil.NopCloser(buf), Header: http.Header{}}
// set headers
// unmarshal response
ec2query.UnmarshalMeta(req)
ec2query.Unmarshal(req)
assert.NoError(t, req.Error)
// assert response
assert.NotNil(t, out) // ensure out variable is used
assert.Equal(t, "bam", *out.Map["baz"])
assert.Equal(t, "bar", *out.Map["qux"])
}
@@ -1,33 +0,0 @@
// Package query provides serialisation of AWS query requests, and responses.
package query
//go:generate go run ../../fixtures/protocol/generate.go ../../fixtures/protocol/input/query.json build_test.go
import (
"net/url"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/internal/protocol/query/queryutil"
)
// Build builds a request for an AWS Query service.
func Build(r *aws.Request) {
body := url.Values{
"Action": {r.Operation.Name},
"Version": {r.Service.APIVersion},
}
if err := queryutil.Parse(body, r.Params, false); err != nil {
r.Error = awserr.New("SerializationError", "failed encoding Query request", err)
return
}
if r.ExpireTime == 0 {
r.HTTPRequest.Method = "POST"
r.HTTPRequest.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=utf-8")
r.SetBufferBody([]byte(body.Encode()))
} else { // This is a pre-signed request
r.HTTPRequest.Method = "GET"
r.HTTPRequest.URL.RawQuery = body.Encode()
}
}
File diff suppressed because it is too large Load Diff
@@ -1,223 +0,0 @@
package queryutil
import (
"encoding/base64"
"fmt"
"net/url"
"reflect"
"sort"
"strconv"
"strings"
"time"
)
// Parse parses an object i and fills a url.Values object. The isEC2 flag
// indicates if this is the EC2 Query sub-protocol.
func Parse(body url.Values, i interface{}, isEC2 bool) error {
q := queryParser{isEC2: isEC2}
return q.parseValue(body, reflect.ValueOf(i), "", "")
}
func elemOf(value reflect.Value) reflect.Value {
for value.Kind() == reflect.Ptr {
value = value.Elem()
}
return value
}
type queryParser struct {
isEC2 bool
}
func (q *queryParser) parseValue(v url.Values, value reflect.Value, prefix string, tag reflect.StructTag) error {
value = elemOf(value)
// no need to handle zero values
if !value.IsValid() {
return nil
}
t := tag.Get("type")
if t == "" {
switch value.Kind() {
case reflect.Struct:
t = "structure"
case reflect.Slice:
t = "list"
case reflect.Map:
t = "map"
}
}
switch t {
case "structure":
return q.parseStruct(v, value, prefix)
case "list":
return q.parseList(v, value, prefix, tag)
case "map":
return q.parseMap(v, value, prefix, tag)
default:
return q.parseScalar(v, value, prefix, tag)
}
}
func (q *queryParser) parseStruct(v url.Values, value reflect.Value, prefix string) error {
if !value.IsValid() {
return nil
}
t := value.Type()
for i := 0; i < value.NumField(); i++ {
if c := t.Field(i).Name[0:1]; strings.ToLower(c) == c {
continue // ignore unexported fields
}
value := elemOf(value.Field(i))
field := t.Field(i)
var name string
if q.isEC2 {
name = field.Tag.Get("queryName")
}
if name == "" {
if field.Tag.Get("flattened") != "" && field.Tag.Get("locationNameList") != "" {
name = field.Tag.Get("locationNameList")
} else if locName := field.Tag.Get("locationName"); locName != "" {
name = locName
}
if name != "" && q.isEC2 {
name = strings.ToUpper(name[0:1]) + name[1:]
}
}
if name == "" {
name = field.Name
}
if prefix != "" {
name = prefix + "." + name
}
if err := q.parseValue(v, value, name, field.Tag); err != nil {
return err
}
}
return nil
}
func (q *queryParser) parseList(v url.Values, value reflect.Value, prefix string, tag reflect.StructTag) error {
// If it's empty, generate an empty value
if !value.IsNil() && value.Len() == 0 {
v.Set(prefix, "")
return nil
}
// check for unflattened list member
if !q.isEC2 && tag.Get("flattened") == "" {
prefix += ".member"
}
for i := 0; i < value.Len(); i++ {
slicePrefix := prefix
if slicePrefix == "" {
slicePrefix = strconv.Itoa(i + 1)
} else {
slicePrefix = slicePrefix + "." + strconv.Itoa(i+1)
}
if err := q.parseValue(v, value.Index(i), slicePrefix, ""); err != nil {
return err
}
}
return nil
}
func (q *queryParser) parseMap(v url.Values, value reflect.Value, prefix string, tag reflect.StructTag) error {
// If it's empty, generate an empty value
if !value.IsNil() && value.Len() == 0 {
v.Set(prefix, "")
return nil
}
// check for unflattened list member
if !q.isEC2 && tag.Get("flattened") == "" {
prefix += ".entry"
}
// sort keys for improved serialization consistency.
// this is not strictly necessary for protocol support.
mapKeyValues := value.MapKeys()
mapKeys := map[string]reflect.Value{}
mapKeyNames := make([]string, len(mapKeyValues))
for i, mapKey := range mapKeyValues {
name := mapKey.String()
mapKeys[name] = mapKey
mapKeyNames[i] = name
}
sort.Strings(mapKeyNames)
for i, mapKeyName := range mapKeyNames {
mapKey := mapKeys[mapKeyName]
mapValue := value.MapIndex(mapKey)
kname := tag.Get("locationNameKey")
if kname == "" {
kname = "key"
}
vname := tag.Get("locationNameValue")
if vname == "" {
vname = "value"
}
// serialize key
var keyName string
if prefix == "" {
keyName = strconv.Itoa(i+1) + "." + kname
} else {
keyName = prefix + "." + strconv.Itoa(i+1) + "." + kname
}
if err := q.parseValue(v, mapKey, keyName, ""); err != nil {
return err
}
// serialize value
var valueName string
if prefix == "" {
valueName = strconv.Itoa(i+1) + "." + vname
} else {
valueName = prefix + "." + strconv.Itoa(i+1) + "." + vname
}
if err := q.parseValue(v, mapValue, valueName, ""); err != nil {
return err
}
}
return nil
}
func (q *queryParser) parseScalar(v url.Values, r reflect.Value, name string, tag reflect.StructTag) error {
switch value := r.Interface().(type) {
case string:
v.Set(name, value)
case []byte:
if !r.IsNil() {
v.Set(name, base64.StdEncoding.EncodeToString(value))
}
case bool:
v.Set(name, strconv.FormatBool(value))
case int64:
v.Set(name, strconv.FormatInt(value, 10))
case int:
v.Set(name, strconv.Itoa(value))
case float64:
v.Set(name, strconv.FormatFloat(value, 'f', -1, 64))
case float32:
v.Set(name, strconv.FormatFloat(float64(value), 'f', -1, 32))
case time.Time:
const ISO8601UTC = "2006-01-02T15:04:05Z"
v.Set(name, value.UTC().Format(ISO8601UTC))
default:
return fmt.Errorf("unsupported value for param %s: %v (%s)", name, r.Interface(), r.Type().Name())
}
return nil
}
@@ -1,29 +0,0 @@
package query
//go:generate go run ../../fixtures/protocol/generate.go ../../fixtures/protocol/output/query.json unmarshal_test.go
import (
"encoding/xml"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/internal/protocol/xml/xmlutil"
)
// Unmarshal unmarshals a response for an AWS Query service.
func Unmarshal(r *aws.Request) {
defer r.HTTPResponse.Body.Close()
if r.DataFilled() {
decoder := xml.NewDecoder(r.HTTPResponse.Body)
err := xmlutil.UnmarshalXML(r.Data, decoder, r.Operation.Name+"Result")
if err != nil {
r.Error = awserr.New("SerializationError", "failed decoding Query response", err)
return
}
}
}
// UnmarshalMeta unmarshals header response values for an AWS Query service.
func UnmarshalMeta(r *aws.Request) {
// TODO implement unmarshaling of request IDs
}
@@ -1,33 +0,0 @@
package query
import (
"encoding/xml"
"io"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
)
type xmlErrorResponse struct {
XMLName xml.Name `xml:"ErrorResponse"`
Code string `xml:"Error>Code"`
Message string `xml:"Error>Message"`
RequestID string `xml:"RequestId"`
}
// UnmarshalError unmarshals an error response for an AWS Query service.
func UnmarshalError(r *aws.Request) {
defer r.HTTPResponse.Body.Close()
resp := &xmlErrorResponse{}
err := xml.NewDecoder(r.HTTPResponse.Body).Decode(resp)
if err != nil && err != io.EOF {
r.Error = awserr.New("SerializationError", "failed to decode query XML error response", err)
} else {
r.Error = awserr.NewRequestFailure(
awserr.New(resp.Code, resp.Message, nil),
r.HTTPResponse.StatusCode,
resp.RequestID,
)
}
}
File diff suppressed because it is too large Load Diff
@@ -1,217 +0,0 @@
// Package rest provides RESTful serialisation of AWS requests and responses.
package rest
import (
"bytes"
"encoding/base64"
"fmt"
"io"
"net/url"
"path"
"reflect"
"strconv"
"strings"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
)
// RFC822 returns an RFC822 formatted timestamp for AWS protocols
const RFC822 = "Mon, 2 Jan 2006 15:04:05 GMT"
// Whether the byte value can be sent without escaping in AWS URLs
var noEscape [256]bool
func init() {
for i := 0; i < len(noEscape); i++ {
// AWS expects every character except these to be escaped
noEscape[i] = (i >= 'A' && i <= 'Z') ||
(i >= 'a' && i <= 'z') ||
(i >= '0' && i <= '9') ||
i == '-' ||
i == '.' ||
i == '_' ||
i == '~'
}
}
// Build builds the REST component of a service request.
func Build(r *aws.Request) {
if r.ParamsFilled() {
v := reflect.ValueOf(r.Params).Elem()
buildLocationElements(r, v)
buildBody(r, v)
}
}
func buildLocationElements(r *aws.Request, v reflect.Value) {
query := r.HTTPRequest.URL.Query()
for i := 0; i < v.NumField(); i++ {
m := v.Field(i)
if n := v.Type().Field(i).Name; n[0:1] == strings.ToLower(n[0:1]) {
continue
}
if m.IsValid() {
field := v.Type().Field(i)
name := field.Tag.Get("locationName")
if name == "" {
name = field.Name
}
if m.Kind() == reflect.Ptr {
m = m.Elem()
}
if !m.IsValid() {
continue
}
switch field.Tag.Get("location") {
case "headers": // header maps
buildHeaderMap(r, m, field.Tag.Get("locationName"))
case "header":
buildHeader(r, m, name)
case "uri":
buildURI(r, m, name)
case "querystring":
buildQueryString(r, m, name, query)
}
}
if r.Error != nil {
return
}
}
r.HTTPRequest.URL.RawQuery = query.Encode()
updatePath(r.HTTPRequest.URL, r.HTTPRequest.URL.Path)
}
func buildBody(r *aws.Request, v reflect.Value) {
if field, ok := v.Type().FieldByName("SDKShapeTraits"); ok {
if payloadName := field.Tag.Get("payload"); payloadName != "" {
pfield, _ := v.Type().FieldByName(payloadName)
if ptag := pfield.Tag.Get("type"); ptag != "" && ptag != "structure" {
payload := reflect.Indirect(v.FieldByName(payloadName))
if payload.IsValid() && payload.Interface() != nil {
switch reader := payload.Interface().(type) {
case io.ReadSeeker:
r.SetReaderBody(reader)
case []byte:
r.SetBufferBody(reader)
case string:
r.SetStringBody(reader)
default:
r.Error = awserr.New("SerializationError",
"failed to encode REST request",
fmt.Errorf("unknown payload type %s", payload.Type()))
}
}
}
}
}
}
func buildHeader(r *aws.Request, v reflect.Value, name string) {
str, err := convertType(v)
if err != nil {
r.Error = awserr.New("SerializationError", "failed to encode REST request", err)
} else if str != nil {
r.HTTPRequest.Header.Add(name, *str)
}
}
func buildHeaderMap(r *aws.Request, v reflect.Value, prefix string) {
for _, key := range v.MapKeys() {
str, err := convertType(v.MapIndex(key))
if err != nil {
r.Error = awserr.New("SerializationError", "failed to encode REST request", err)
} else if str != nil {
r.HTTPRequest.Header.Add(prefix+key.String(), *str)
}
}
}
func buildURI(r *aws.Request, v reflect.Value, name string) {
value, err := convertType(v)
if err != nil {
r.Error = awserr.New("SerializationError", "failed to encode REST request", err)
} else if value != nil {
uri := r.HTTPRequest.URL.Path
uri = strings.Replace(uri, "{"+name+"}", EscapePath(*value, true), -1)
uri = strings.Replace(uri, "{"+name+"+}", EscapePath(*value, false), -1)
r.HTTPRequest.URL.Path = uri
}
}
func buildQueryString(r *aws.Request, v reflect.Value, name string, query url.Values) {
str, err := convertType(v)
if err != nil {
r.Error = awserr.New("SerializationError", "failed to encode REST request", err)
} else if str != nil {
query.Set(name, *str)
}
}
func updatePath(url *url.URL, urlPath string) {
scheme, query := url.Scheme, url.RawQuery
hasSlash := strings.HasSuffix(urlPath, "/")
// clean up path
urlPath = path.Clean(urlPath)
if hasSlash && !strings.HasSuffix(urlPath, "/") {
urlPath += "/"
}
// get formatted URL minus scheme so we can build this into Opaque
url.Scheme, url.Path, url.RawQuery = "", "", ""
s := url.String()
url.Scheme = scheme
url.RawQuery = query
// build opaque URI
url.Opaque = s + urlPath
}
// EscapePath escapes part of a URL path in Amazon style
func EscapePath(path string, encodeSep bool) string {
var buf bytes.Buffer
for i := 0; i < len(path); i++ {
c := path[i]
if noEscape[c] || (c == '/' && !encodeSep) {
buf.WriteByte(c)
} else {
buf.WriteByte('%')
buf.WriteString(strings.ToUpper(strconv.FormatUint(uint64(c), 16)))
}
}
return buf.String()
}
func convertType(v reflect.Value) (*string, error) {
v = reflect.Indirect(v)
if !v.IsValid() {
return nil, nil
}
var str string
switch value := v.Interface().(type) {
case string:
str = value
case []byte:
str = base64.StdEncoding.EncodeToString(value)
case bool:
str = strconv.FormatBool(value)
case int64:
str = strconv.FormatInt(value, 10)
case float64:
str = strconv.FormatFloat(value, 'f', -1, 64)
case time.Time:
str = value.UTC().Format(RFC822)
default:
err := fmt.Errorf("Unsupported value for param %v (%s)", v.Interface(), v.Type())
return nil, err
}
return &str, nil
}
@@ -1,174 +0,0 @@
package rest
import (
"encoding/base64"
"fmt"
"io/ioutil"
"net/http"
"reflect"
"strconv"
"strings"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
)
// Unmarshal unmarshals the REST component of a response in a REST service.
func Unmarshal(r *aws.Request) {
if r.DataFilled() {
v := reflect.Indirect(reflect.ValueOf(r.Data))
unmarshalBody(r, v)
unmarshalLocationElements(r, v)
}
}
func unmarshalBody(r *aws.Request, v reflect.Value) {
if field, ok := v.Type().FieldByName("SDKShapeTraits"); ok {
if payloadName := field.Tag.Get("payload"); payloadName != "" {
pfield, _ := v.Type().FieldByName(payloadName)
if ptag := pfield.Tag.Get("type"); ptag != "" && ptag != "structure" {
payload := v.FieldByName(payloadName)
if payload.IsValid() {
switch payload.Interface().(type) {
case []byte:
b, err := ioutil.ReadAll(r.HTTPResponse.Body)
if err != nil {
r.Error = awserr.New("SerializationError", "failed to decode REST response", err)
} else {
payload.Set(reflect.ValueOf(b))
}
case *string:
b, err := ioutil.ReadAll(r.HTTPResponse.Body)
if err != nil {
r.Error = awserr.New("SerializationError", "failed to decode REST response", err)
} else {
str := string(b)
payload.Set(reflect.ValueOf(&str))
}
default:
switch payload.Type().String() {
case "io.ReadSeeker":
payload.Set(reflect.ValueOf(aws.ReadSeekCloser(r.HTTPResponse.Body)))
case "aws.ReadSeekCloser", "io.ReadCloser":
payload.Set(reflect.ValueOf(r.HTTPResponse.Body))
default:
r.Error = awserr.New("SerializationError",
"failed to decode REST response",
fmt.Errorf("unknown payload type %s", payload.Type()))
}
}
}
}
}
}
}
func unmarshalLocationElements(r *aws.Request, v reflect.Value) {
for i := 0; i < v.NumField(); i++ {
m, field := v.Field(i), v.Type().Field(i)
if n := field.Name; n[0:1] == strings.ToLower(n[0:1]) {
continue
}
if m.IsValid() {
name := field.Tag.Get("locationName")
if name == "" {
name = field.Name
}
switch field.Tag.Get("location") {
case "statusCode":
unmarshalStatusCode(m, r.HTTPResponse.StatusCode)
case "header":
err := unmarshalHeader(m, r.HTTPResponse.Header.Get(name))
if err != nil {
r.Error = awserr.New("SerializationError", "failed to decode REST response", err)
break
}
case "headers":
prefix := field.Tag.Get("locationName")
err := unmarshalHeaderMap(m, r.HTTPResponse.Header, prefix)
if err != nil {
r.Error = awserr.New("SerializationError", "failed to decode REST response", err)
break
}
}
}
if r.Error != nil {
return
}
}
}
func unmarshalStatusCode(v reflect.Value, statusCode int) {
if !v.IsValid() {
return
}
switch v.Interface().(type) {
case *int64:
s := int64(statusCode)
v.Set(reflect.ValueOf(&s))
}
}
func unmarshalHeaderMap(r reflect.Value, headers http.Header, prefix string) error {
switch r.Interface().(type) {
case map[string]*string: // we only support string map value types
out := map[string]*string{}
for k, v := range headers {
k = http.CanonicalHeaderKey(k)
if strings.HasPrefix(strings.ToLower(k), strings.ToLower(prefix)) {
out[k[len(prefix):]] = &v[0]
}
}
r.Set(reflect.ValueOf(out))
}
return nil
}
func unmarshalHeader(v reflect.Value, header string) error {
if !v.IsValid() || (header == "" && v.Elem().Kind() != reflect.String) {
return nil
}
switch v.Interface().(type) {
case *string:
v.Set(reflect.ValueOf(&header))
case []byte:
b, err := base64.StdEncoding.DecodeString(header)
if err != nil {
return err
}
v.Set(reflect.ValueOf(&b))
case *bool:
b, err := strconv.ParseBool(header)
if err != nil {
return err
}
v.Set(reflect.ValueOf(&b))
case *int64:
i, err := strconv.ParseInt(header, 10, 64)
if err != nil {
return err
}
v.Set(reflect.ValueOf(&i))
case *float64:
f, err := strconv.ParseFloat(header, 64)
if err != nil {
return err
}
v.Set(reflect.ValueOf(&f))
case *time.Time:
t, err := time.Parse(RFC822, header)
if err != nil {
return err
}
v.Set(reflect.ValueOf(&t))
default:
err := fmt.Errorf("Unsupported value for param %v (%s)", v.Interface(), v.Type())
return err
}
return nil
}
@@ -1,287 +0,0 @@
// Package xmlutil provides XML serialisation of AWS requests and responses.
package xmlutil
import (
"encoding/base64"
"encoding/xml"
"fmt"
"reflect"
"sort"
"strconv"
"strings"
"time"
)
// BuildXML will serialize params into an xml.Encoder.
// Error will be returned if the serialization of any of the params or nested values fails.
func BuildXML(params interface{}, e *xml.Encoder) error {
b := xmlBuilder{encoder: e, namespaces: map[string]string{}}
root := NewXMLElement(xml.Name{})
if err := b.buildValue(reflect.ValueOf(params), root, ""); err != nil {
return err
}
for _, c := range root.Children {
for _, v := range c {
return StructToXML(e, v, false)
}
}
return nil
}
// Returns the reflection element of a value, if it is a pointer.
func elemOf(value reflect.Value) reflect.Value {
for value.Kind() == reflect.Ptr {
value = value.Elem()
}
return value
}
// A xmlBuilder serializes values from Go code to XML
type xmlBuilder struct {
encoder *xml.Encoder
namespaces map[string]string
}
// buildValue generic XMLNode builder for any type. Will build value for their specific type
// struct, list, map, scalar.
//
// Also takes a "type" tag value to set what type a value should be converted to XMLNode as. If
// type is not provided reflect will be used to determine the value's type.
func (b *xmlBuilder) buildValue(value reflect.Value, current *XMLNode, tag reflect.StructTag) error {
value = elemOf(value)
if !value.IsValid() { // no need to handle zero values
return nil
} else if tag.Get("location") != "" { // don't handle non-body location values
return nil
}
t := tag.Get("type")
if t == "" {
switch value.Kind() {
case reflect.Struct:
t = "structure"
case reflect.Slice:
t = "list"
case reflect.Map:
t = "map"
}
}
switch t {
case "structure":
if field, ok := value.Type().FieldByName("SDKShapeTraits"); ok {
tag = tag + reflect.StructTag(" ") + field.Tag
}
return b.buildStruct(value, current, tag)
case "list":
return b.buildList(value, current, tag)
case "map":
return b.buildMap(value, current, tag)
default:
return b.buildScalar(value, current, tag)
}
}
// buildStruct adds a struct and its fields to the current XMLNode. All fields any any nested
// types are converted to XMLNodes also.
func (b *xmlBuilder) buildStruct(value reflect.Value, current *XMLNode, tag reflect.StructTag) error {
if !value.IsValid() {
return nil
}
fieldAdded := false
// unwrap payloads
if payload := tag.Get("payload"); payload != "" {
field, _ := value.Type().FieldByName(payload)
tag = field.Tag
value = elemOf(value.FieldByName(payload))
if !value.IsValid() {
return nil
}
}
child := NewXMLElement(xml.Name{Local: tag.Get("locationName")})
// there is an xmlNamespace associated with this struct
if prefix, uri := tag.Get("xmlPrefix"), tag.Get("xmlURI"); uri != "" {
ns := xml.Attr{
Name: xml.Name{Local: "xmlns"},
Value: uri,
}
if prefix != "" {
b.namespaces[prefix] = uri // register the namespace
ns.Name.Local = "xmlns:" + prefix
}
child.Attr = append(child.Attr, ns)
}
t := value.Type()
for i := 0; i < value.NumField(); i++ {
if c := t.Field(i).Name[0:1]; strings.ToLower(c) == c {
continue // ignore unexported fields
}
member := elemOf(value.Field(i))
field := t.Field(i)
mTag := field.Tag
if mTag.Get("location") != "" { // skip non-body members
continue
}
memberName := mTag.Get("locationName")
if memberName == "" {
memberName = field.Name
mTag = reflect.StructTag(string(mTag) + ` locationName:"` + memberName + `"`)
}
if err := b.buildValue(member, child, mTag); err != nil {
return err
}
fieldAdded = true
}
if fieldAdded { // only append this child if we have one ore more valid members
current.AddChild(child)
}
return nil
}
// buildList adds the value's list items to the current XMLNode as children nodes. All
// nested values in the list are converted to XMLNodes also.
func (b *xmlBuilder) buildList(value reflect.Value, current *XMLNode, tag reflect.StructTag) error {
if value.IsNil() { // don't build omitted lists
return nil
}
// check for unflattened list member
flattened := tag.Get("flattened") != ""
xname := xml.Name{Local: tag.Get("locationName")}
if flattened {
for i := 0; i < value.Len(); i++ {
child := NewXMLElement(xname)
current.AddChild(child)
if err := b.buildValue(value.Index(i), child, ""); err != nil {
return err
}
}
} else {
list := NewXMLElement(xname)
current.AddChild(list)
for i := 0; i < value.Len(); i++ {
iname := tag.Get("locationNameList")
if iname == "" {
iname = "member"
}
child := NewXMLElement(xml.Name{Local: iname})
list.AddChild(child)
if err := b.buildValue(value.Index(i), child, ""); err != nil {
return err
}
}
}
return nil
}
// buildMap adds the value's key/value pairs to the current XMLNode as children nodes. All
// nested values in the map are converted to XMLNodes also.
//
// Error will be returned if it is unable to build the map's values into XMLNodes
func (b *xmlBuilder) buildMap(value reflect.Value, current *XMLNode, tag reflect.StructTag) error {
if value.IsNil() { // don't build omitted maps
return nil
}
maproot := NewXMLElement(xml.Name{Local: tag.Get("locationName")})
current.AddChild(maproot)
current = maproot
kname, vname := "key", "value"
if n := tag.Get("locationNameKey"); n != "" {
kname = n
}
if n := tag.Get("locationNameValue"); n != "" {
vname = n
}
// sorting is not required for compliance, but it makes testing easier
keys := make([]string, value.Len())
for i, k := range value.MapKeys() {
keys[i] = k.String()
}
sort.Strings(keys)
for _, k := range keys {
v := value.MapIndex(reflect.ValueOf(k))
mapcur := current
if tag.Get("flattened") == "" { // add "entry" tag to non-flat maps
child := NewXMLElement(xml.Name{Local: "entry"})
mapcur.AddChild(child)
mapcur = child
}
kchild := NewXMLElement(xml.Name{Local: kname})
kchild.Text = k
vchild := NewXMLElement(xml.Name{Local: vname})
mapcur.AddChild(kchild)
mapcur.AddChild(vchild)
if err := b.buildValue(v, vchild, ""); err != nil {
return err
}
}
return nil
}
// buildScalar will convert the value into a string and append it as a attribute or child
// of the current XMLNode.
//
// The value will be added as an attribute if tag contains a "xmlAttribute" attribute value.
//
// Error will be returned if the value type is unsupported.
func (b *xmlBuilder) buildScalar(value reflect.Value, current *XMLNode, tag reflect.StructTag) error {
var str string
switch converted := value.Interface().(type) {
case string:
str = converted
case []byte:
if !value.IsNil() {
str = base64.StdEncoding.EncodeToString(converted)
}
case bool:
str = strconv.FormatBool(converted)
case int64:
str = strconv.FormatInt(converted, 10)
case int:
str = strconv.Itoa(converted)
case float64:
str = strconv.FormatFloat(converted, 'f', -1, 64)
case float32:
str = strconv.FormatFloat(float64(converted), 'f', -1, 32)
case time.Time:
const ISO8601UTC = "2006-01-02T15:04:05Z"
str = converted.UTC().Format(ISO8601UTC)
default:
return fmt.Errorf("unsupported value for param %s: %v (%s)",
tag.Get("locationName"), value.Interface(), value.Type().Name())
}
xname := xml.Name{Local: tag.Get("locationName")}
if tag.Get("xmlAttribute") != "" { // put into current node's attribute list
attr := xml.Attr{Name: xname, Value: str}
current.Attr = append(current.Attr, attr)
} else { // regular text node
current.AddChild(&XMLNode{Name: xname, Text: str})
}
return nil
}
@@ -1,43 +0,0 @@
package v4_test
import (
"net/url"
"testing"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/internal/test/unit"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/stretchr/testify/assert"
)
var _ = unit.Imported
func TestPresignHandler(t *testing.T) {
svc := s3.New(nil)
req, _ := svc.PutObjectRequest(&s3.PutObjectInput{
Bucket: aws.String("bucket"),
Key: aws.String("key"),
ContentDisposition: aws.String("a+b c$d"),
ACL: aws.String("public-read"),
})
req.Time = time.Unix(0, 0)
urlstr, err := req.Presign(5 * time.Minute)
assert.NoError(t, err)
expectedDate := "19700101T000000Z"
expectedHeaders := "host;x-amz-acl"
expectedSig := "7edcb4e3a1bf12f4989018d75acbe3a7f03df24bd6f3112602d59fc551f0e4e2"
expectedCred := "AKID/19700101/mock-region/s3/aws4_request"
u, _ := url.Parse(urlstr)
urlQ := u.Query()
assert.Equal(t, expectedSig, urlQ.Get("X-Amz-Signature"))
assert.Equal(t, expectedCred, urlQ.Get("X-Amz-Credential"))
assert.Equal(t, expectedHeaders, urlQ.Get("X-Amz-SignedHeaders"))
assert.Equal(t, expectedDate, urlQ.Get("X-Amz-Date"))
assert.Equal(t, "300", urlQ.Get("X-Amz-Expires"))
assert.NotContains(t, urlstr, "+") // + encoded as %20
}
@@ -1,364 +0,0 @@
// Package v4 implements signing for AWS V4 signer
package v4
import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
"fmt"
"io"
"net/http"
"net/url"
"sort"
"strconv"
"strings"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/internal/protocol/rest"
)
const (
authHeaderPrefix = "AWS4-HMAC-SHA256"
timeFormat = "20060102T150405Z"
shortTimeFormat = "20060102"
)
var ignoredHeaders = map[string]bool{
"Authorization": true,
"Content-Type": true,
"Content-Length": true,
"User-Agent": true,
}
type signer struct {
Request *http.Request
Time time.Time
ExpireTime time.Duration
ServiceName string
Region string
CredValues credentials.Value
Credentials *credentials.Credentials
Query url.Values
Body io.ReadSeeker
Debug aws.LogLevelType
Logger aws.Logger
isPresign bool
formattedTime string
formattedShortTime string
signedHeaders string
canonicalHeaders string
canonicalString string
credentialString string
stringToSign string
signature string
authorization string
}
// Sign requests with signature version 4.
//
// Will sign the requests with the service config's Credentials object
// Signing is skipped if the credentials is the credentials.AnonymousCredentials
// object.
func Sign(req *aws.Request) {
// If the request does not need to be signed ignore the signing of the
// request if the AnonymousCredentials object is used.
if req.Service.Config.Credentials == credentials.AnonymousCredentials {
return
}
region := req.Service.SigningRegion
if region == "" {
region = aws.StringValue(req.Service.Config.Region)
}
name := req.Service.SigningName
if name == "" {
name = req.Service.ServiceName
}
s := signer{
Request: req.HTTPRequest,
Time: req.Time,
ExpireTime: req.ExpireTime,
Query: req.HTTPRequest.URL.Query(),
Body: req.Body,
ServiceName: name,
Region: region,
Credentials: req.Service.Config.Credentials,
Debug: req.Service.Config.LogLevel.Value(),
Logger: req.Service.Config.Logger,
}
req.Error = s.sign()
}
func (v4 *signer) sign() error {
if v4.ExpireTime != 0 {
v4.isPresign = true
}
if v4.isRequestSigned() {
if !v4.Credentials.IsExpired() {
// If the request is already signed, and the credentials have not
// expired yet ignore the signing request.
return nil
}
// The credentials have expired for this request. The current signing
// is invalid, and needs to be request because the request will fail.
if v4.isPresign {
v4.removePresign()
// Update the request's query string to ensure the values stays in
// sync in the case retrieving the new credentials fails.
v4.Request.URL.RawQuery = v4.Query.Encode()
}
}
var err error
v4.CredValues, err = v4.Credentials.Get()
if err != nil {
return err
}
if v4.isPresign {
v4.Query.Set("X-Amz-Algorithm", authHeaderPrefix)
if v4.CredValues.SessionToken != "" {
v4.Query.Set("X-Amz-Security-Token", v4.CredValues.SessionToken)
} else {
v4.Query.Del("X-Amz-Security-Token")
}
} else if v4.CredValues.SessionToken != "" {
v4.Request.Header.Set("X-Amz-Security-Token", v4.CredValues.SessionToken)
}
v4.build()
if v4.Debug.Matches(aws.LogDebugWithSigning) {
v4.logSigningInfo()
}
return nil
}
const logSignInfoMsg = `DEBUG: Request Signiture:
---[ CANONICAL STRING ]-----------------------------
%s
---[ STRING TO SIGN ]--------------------------------
%s%s
-----------------------------------------------------`
const logSignedURLMsg = `
---[ SIGNED URL ]------------------------------------
%s`
func (v4 *signer) logSigningInfo() {
signedURLMsg := ""
if v4.isPresign {
signedURLMsg = fmt.Sprintf(logSignedURLMsg, v4.Request.URL.String())
}
msg := fmt.Sprintf(logSignInfoMsg, v4.canonicalString, v4.stringToSign, signedURLMsg)
v4.Logger.Log(msg)
}
func (v4 *signer) build() {
v4.buildTime() // no depends
v4.buildCredentialString() // no depends
if v4.isPresign {
v4.buildQuery() // no depends
}
v4.buildCanonicalHeaders() // depends on cred string
v4.buildCanonicalString() // depends on canon headers / signed headers
v4.buildStringToSign() // depends on canon string
v4.buildSignature() // depends on string to sign
if v4.isPresign {
v4.Request.URL.RawQuery += "&X-Amz-Signature=" + v4.signature
} else {
parts := []string{
authHeaderPrefix + " Credential=" + v4.CredValues.AccessKeyID + "/" + v4.credentialString,
"SignedHeaders=" + v4.signedHeaders,
"Signature=" + v4.signature,
}
v4.Request.Header.Set("Authorization", strings.Join(parts, ", "))
}
}
func (v4 *signer) buildTime() {
v4.formattedTime = v4.Time.UTC().Format(timeFormat)
v4.formattedShortTime = v4.Time.UTC().Format(shortTimeFormat)
if v4.isPresign {
duration := int64(v4.ExpireTime / time.Second)
v4.Query.Set("X-Amz-Date", v4.formattedTime)
v4.Query.Set("X-Amz-Expires", strconv.FormatInt(duration, 10))
} else {
v4.Request.Header.Set("X-Amz-Date", v4.formattedTime)
}
}
func (v4 *signer) buildCredentialString() {
v4.credentialString = strings.Join([]string{
v4.formattedShortTime,
v4.Region,
v4.ServiceName,
"aws4_request",
}, "/")
if v4.isPresign {
v4.Query.Set("X-Amz-Credential", v4.CredValues.AccessKeyID+"/"+v4.credentialString)
}
}
func (v4 *signer) buildQuery() {
for k, h := range v4.Request.Header {
if strings.HasPrefix(http.CanonicalHeaderKey(k), "X-Amz-") {
continue // never hoist x-amz-* headers, they must be signed
}
if _, ok := ignoredHeaders[http.CanonicalHeaderKey(k)]; ok {
continue // never hoist ignored headers
}
v4.Request.Header.Del(k)
v4.Query.Del(k)
for _, v := range h {
v4.Query.Add(k, v)
}
}
}
func (v4 *signer) buildCanonicalHeaders() {
var headers []string
headers = append(headers, "host")
for k := range v4.Request.Header {
if _, ok := ignoredHeaders[http.CanonicalHeaderKey(k)]; ok {
continue // ignored header
}
headers = append(headers, strings.ToLower(k))
}
sort.Strings(headers)
v4.signedHeaders = strings.Join(headers, ";")
if v4.isPresign {
v4.Query.Set("X-Amz-SignedHeaders", v4.signedHeaders)
}
headerValues := make([]string, len(headers))
for i, k := range headers {
if k == "host" {
headerValues[i] = "host:" + v4.Request.URL.Host
} else {
headerValues[i] = k + ":" +
strings.Join(v4.Request.Header[http.CanonicalHeaderKey(k)], ",")
}
}
v4.canonicalHeaders = strings.Join(headerValues, "\n")
}
func (v4 *signer) buildCanonicalString() {
v4.Request.URL.RawQuery = strings.Replace(v4.Query.Encode(), "+", "%20", -1)
uri := v4.Request.URL.Opaque
if uri != "" {
uri = "/" + strings.Join(strings.Split(uri, "/")[3:], "/")
} else {
uri = v4.Request.URL.Path
}
if uri == "" {
uri = "/"
}
if v4.ServiceName != "s3" {
uri = rest.EscapePath(uri, false)
}
v4.canonicalString = strings.Join([]string{
v4.Request.Method,
uri,
v4.Request.URL.RawQuery,
v4.canonicalHeaders + "\n",
v4.signedHeaders,
v4.bodyDigest(),
}, "\n")
}
func (v4 *signer) buildStringToSign() {
v4.stringToSign = strings.Join([]string{
authHeaderPrefix,
v4.formattedTime,
v4.credentialString,
hex.EncodeToString(makeSha256([]byte(v4.canonicalString))),
}, "\n")
}
func (v4 *signer) buildSignature() {
secret := v4.CredValues.SecretAccessKey
date := makeHmac([]byte("AWS4"+secret), []byte(v4.formattedShortTime))
region := makeHmac(date, []byte(v4.Region))
service := makeHmac(region, []byte(v4.ServiceName))
credentials := makeHmac(service, []byte("aws4_request"))
signature := makeHmac(credentials, []byte(v4.stringToSign))
v4.signature = hex.EncodeToString(signature)
}
func (v4 *signer) bodyDigest() string {
hash := v4.Request.Header.Get("X-Amz-Content-Sha256")
if hash == "" {
if v4.isPresign && v4.ServiceName == "s3" {
hash = "UNSIGNED-PAYLOAD"
} else if v4.Body == nil {
hash = hex.EncodeToString(makeSha256([]byte{}))
} else {
hash = hex.EncodeToString(makeSha256Reader(v4.Body))
}
v4.Request.Header.Add("X-Amz-Content-Sha256", hash)
}
return hash
}
// isRequestSigned returns if the request is currently signed or presigned
func (v4 *signer) isRequestSigned() bool {
if v4.isPresign && v4.Query.Get("X-Amz-Signature") != "" {
return true
}
if v4.Request.Header.Get("Authorization") != "" {
return true
}
return false
}
// unsign removes signing flags for both signed and presigned requests.
func (v4 *signer) removePresign() {
v4.Query.Del("X-Amz-Algorithm")
v4.Query.Del("X-Amz-Signature")
v4.Query.Del("X-Amz-Security-Token")
v4.Query.Del("X-Amz-Date")
v4.Query.Del("X-Amz-Expires")
v4.Query.Del("X-Amz-Credential")
v4.Query.Del("X-Amz-SignedHeaders")
}
func makeHmac(key []byte, data []byte) []byte {
hash := hmac.New(sha256.New, key)
hash.Write(data)
return hash.Sum(nil)
}
func makeSha256(data []byte) []byte {
hash := sha256.New()
hash.Write(data)
return hash.Sum(nil)
}
func makeSha256Reader(reader io.ReadSeeker) []byte {
hash := sha256.New()
start, _ := reader.Seek(0, 1)
defer reader.Seek(start, 0)
io.Copy(hash, reader)
return hash.Sum(nil)
}
@@ -1,245 +0,0 @@
package v4
import (
"net/http"
"strings"
"testing"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/stretchr/testify/assert"
)
func buildSigner(serviceName string, region string, signTime time.Time, expireTime time.Duration, body string) signer {
endpoint := "https://" + serviceName + "." + region + ".amazonaws.com"
reader := strings.NewReader(body)
req, _ := http.NewRequest("POST", endpoint, reader)
req.URL.Opaque = "//example.org/bucket/key-._~,!@#$%^&*()"
req.Header.Add("X-Amz-Target", "prefix.Operation")
req.Header.Add("Content-Type", "application/x-amz-json-1.0")
req.Header.Add("Content-Length", string(len(body)))
req.Header.Add("X-Amz-Meta-Other-Header", "some-value=!@#$%^&* (+)")
return signer{
Request: req,
Time: signTime,
ExpireTime: expireTime,
Query: req.URL.Query(),
Body: reader,
ServiceName: serviceName,
Region: region,
Credentials: credentials.NewStaticCredentials("AKID", "SECRET", "SESSION"),
}
}
func removeWS(text string) string {
text = strings.Replace(text, " ", "", -1)
text = strings.Replace(text, "\n", "", -1)
text = strings.Replace(text, "\t", "", -1)
return text
}
func assertEqual(t *testing.T, expected, given string) {
if removeWS(expected) != removeWS(given) {
t.Errorf("\nExpected: %s\nGiven: %s", expected, given)
}
}
func TestPresignRequest(t *testing.T) {
signer := buildSigner("dynamodb", "us-east-1", time.Unix(0, 0), 300*time.Second, "{}")
signer.sign()
expectedDate := "19700101T000000Z"
expectedHeaders := "host;x-amz-meta-other-header;x-amz-target"
expectedSig := "5eeedebf6f995145ce56daa02902d10485246d3defb34f97b973c1f40ab82d36"
expectedCred := "AKID/19700101/us-east-1/dynamodb/aws4_request"
q := signer.Request.URL.Query()
assert.Equal(t, expectedSig, q.Get("X-Amz-Signature"))
assert.Equal(t, expectedCred, q.Get("X-Amz-Credential"))
assert.Equal(t, expectedHeaders, q.Get("X-Amz-SignedHeaders"))
assert.Equal(t, expectedDate, q.Get("X-Amz-Date"))
}
func TestSignRequest(t *testing.T) {
signer := buildSigner("dynamodb", "us-east-1", time.Unix(0, 0), 0, "{}")
signer.sign()
expectedDate := "19700101T000000Z"
expectedSig := "AWS4-HMAC-SHA256 Credential=AKID/19700101/us-east-1/dynamodb/aws4_request, SignedHeaders=host;x-amz-date;x-amz-meta-other-header;x-amz-security-token;x-amz-target, Signature=69ada33fec48180dab153576e4dd80c4e04124f80dda3eccfed8a67c2b91ed5e"
q := signer.Request.Header
assert.Equal(t, expectedSig, q.Get("Authorization"))
assert.Equal(t, expectedDate, q.Get("X-Amz-Date"))
}
func TestSignEmptyBody(t *testing.T) {
signer := buildSigner("dynamodb", "us-east-1", time.Now(), 0, "")
signer.Body = nil
signer.sign()
hash := signer.Request.Header.Get("X-Amz-Content-Sha256")
assert.Equal(t, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", hash)
}
func TestSignBody(t *testing.T) {
signer := buildSigner("dynamodb", "us-east-1", time.Now(), 0, "hello")
signer.sign()
hash := signer.Request.Header.Get("X-Amz-Content-Sha256")
assert.Equal(t, "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824", hash)
}
func TestSignSeekedBody(t *testing.T) {
signer := buildSigner("dynamodb", "us-east-1", time.Now(), 0, " hello")
signer.Body.Read(make([]byte, 3)) // consume first 3 bytes so body is now "hello"
signer.sign()
hash := signer.Request.Header.Get("X-Amz-Content-Sha256")
assert.Equal(t, "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824", hash)
start, _ := signer.Body.Seek(0, 1)
assert.Equal(t, int64(3), start)
}
func TestPresignEmptyBodyS3(t *testing.T) {
signer := buildSigner("s3", "us-east-1", time.Now(), 5*time.Minute, "hello")
signer.sign()
hash := signer.Request.Header.Get("X-Amz-Content-Sha256")
assert.Equal(t, "UNSIGNED-PAYLOAD", hash)
}
func TestSignPrecomputedBodyChecksum(t *testing.T) {
signer := buildSigner("dynamodb", "us-east-1", time.Now(), 0, "hello")
signer.Request.Header.Set("X-Amz-Content-Sha256", "PRECOMPUTED")
signer.sign()
hash := signer.Request.Header.Get("X-Amz-Content-Sha256")
assert.Equal(t, "PRECOMPUTED", hash)
}
func TestAnonymousCredentials(t *testing.T) {
r := aws.NewRequest(
aws.NewService(&aws.Config{Credentials: credentials.AnonymousCredentials}),
&aws.Operation{
Name: "BatchGetItem",
HTTPMethod: "POST",
HTTPPath: "/",
},
nil,
nil,
)
Sign(r)
urlQ := r.HTTPRequest.URL.Query()
assert.Empty(t, urlQ.Get("X-Amz-Signature"))
assert.Empty(t, urlQ.Get("X-Amz-Credential"))
assert.Empty(t, urlQ.Get("X-Amz-SignedHeaders"))
assert.Empty(t, urlQ.Get("X-Amz-Date"))
hQ := r.HTTPRequest.Header
assert.Empty(t, hQ.Get("Authorization"))
assert.Empty(t, hQ.Get("X-Amz-Date"))
}
func TestIgnoreResignRequestWithValidCreds(t *testing.T) {
r := aws.NewRequest(
aws.NewService(&aws.Config{
Credentials: credentials.NewStaticCredentials("AKID", "SECRET", "SESSION"),
Region: aws.String("us-west-2"),
}),
&aws.Operation{
Name: "BatchGetItem",
HTTPMethod: "POST",
HTTPPath: "/",
},
nil,
nil,
)
Sign(r)
sig := r.HTTPRequest.Header.Get("Authorization")
Sign(r)
assert.Equal(t, sig, r.HTTPRequest.Header.Get("Authorization"))
}
func TestIgnorePreResignRequestWithValidCreds(t *testing.T) {
r := aws.NewRequest(
aws.NewService(&aws.Config{
Credentials: credentials.NewStaticCredentials("AKID", "SECRET", "SESSION"),
Region: aws.String("us-west-2"),
}),
&aws.Operation{
Name: "BatchGetItem",
HTTPMethod: "POST",
HTTPPath: "/",
},
nil,
nil,
)
r.ExpireTime = time.Minute * 10
Sign(r)
sig := r.HTTPRequest.Header.Get("X-Amz-Signature")
Sign(r)
assert.Equal(t, sig, r.HTTPRequest.Header.Get("X-Amz-Signature"))
}
func TestResignRequestExpiredCreds(t *testing.T) {
creds := credentials.NewStaticCredentials("AKID", "SECRET", "SESSION")
r := aws.NewRequest(
aws.NewService(&aws.Config{Credentials: creds}),
&aws.Operation{
Name: "BatchGetItem",
HTTPMethod: "POST",
HTTPPath: "/",
},
nil,
nil,
)
Sign(r)
querySig := r.HTTPRequest.Header.Get("Authorization")
creds.Expire()
Sign(r)
assert.NotEqual(t, querySig, r.HTTPRequest.Header.Get("Authorization"))
}
func TestPreResignRequestExpiredCreds(t *testing.T) {
provider := &credentials.StaticProvider{credentials.Value{"AKID", "SECRET", "SESSION"}}
creds := credentials.NewCredentials(provider)
r := aws.NewRequest(
aws.NewService(&aws.Config{Credentials: creds}),
&aws.Operation{
Name: "BatchGetItem",
HTTPMethod: "POST",
HTTPPath: "/",
},
nil,
nil,
)
r.ExpireTime = time.Minute * 10
Sign(r)
querySig := r.HTTPRequest.URL.Query().Get("X-Amz-Signature")
creds.Expire()
r.Time = time.Now().Add(time.Hour * 48)
Sign(r)
assert.NotEqual(t, querySig, r.HTTPRequest.URL.Query().Get("X-Amz-Signature"))
}
func BenchmarkPresignRequest(b *testing.B) {
signer := buildSigner("dynamodb", "us-east-1", time.Now(), 300*time.Second, "{}")
for i := 0; i < b.N; i++ {
signer.sign()
}
}
func BenchmarkSignRequest(b *testing.B) {
signer := buildSigner("dynamodb", "us-east-1", time.Now(), 0, "{}")
for i := 0; i < b.N; i++ {
signer.sign()
}
}
@@ -1,41 +0,0 @@
package endpoints_test
import (
"fmt"
"testing"
"github.com/stretchr/testify/assert"
"github.com/aws/aws-sdk-go/private/endpoints"
)
func TestGenericEndpoint(t *testing.T) {
name := "service"
region := "mock-region-1"
ep, sr := endpoints.EndpointForRegion(name, region, false)
assert.Equal(t, fmt.Sprintf("https://%s.%s.amazonaws.com", name, region), ep)
assert.Empty(t, sr)
}
func TestGlobalEndpoints(t *testing.T) {
region := "mock-region-1"
svcs := []string{"cloudfront", "iam", "importexport", "route53", "sts", "waf"}
for _, name := range svcs {
ep, sr := endpoints.EndpointForRegion(name, region, false)
assert.Equal(t, fmt.Sprintf("https://%s.amazonaws.com", name), ep)
assert.Equal(t, "us-east-1", sr)
}
}
func TestServicesInCN(t *testing.T) {
region := "cn-north-1"
svcs := []string{"cloudfront", "iam", "importexport", "route53", "sts", "s3", "waf"}
for _, name := range svcs {
ep, sr := endpoints.EndpointForRegion(name, region, false)
assert.Equal(t, fmt.Sprintf("https://%s.%s.amazonaws.com.cn", name, region), ep)
assert.Empty(t, sr)
}
}
@@ -1,85 +0,0 @@
// +build bench
package ec2query_test
import (
"testing"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/request"
"github.com/aws/aws-sdk-go/awstesting"
"github.com/aws/aws-sdk-go/private/protocol/ec2query"
"github.com/aws/aws-sdk-go/service/ec2"
)
func BenchmarkEC2QueryBuild_Complex_ec2AuthorizeSecurityGroupEgress(b *testing.B) {
params := &ec2.AuthorizeSecurityGroupEgressInput{
GroupId: aws.String("String"), // Required
CidrIp: aws.String("String"),
DryRun: aws.Bool(true),
FromPort: aws.Int64(1),
IpPermissions: []*ec2.IpPermission{
{ // Required
FromPort: aws.Int64(1),
IpProtocol: aws.String("String"),
IpRanges: []*ec2.IpRange{
{ // Required
CidrIp: aws.String("String"),
},
// More values...
},
PrefixListIds: []*ec2.PrefixListId{
{ // Required
PrefixListId: aws.String("String"),
},
// More values...
},
ToPort: aws.Int64(1),
UserIdGroupPairs: []*ec2.UserIdGroupPair{
{ // Required
GroupId: aws.String("String"),
GroupName: aws.String("String"),
UserId: aws.String("String"),
},
// More values...
},
},
// More values...
},
IpProtocol: aws.String("String"),
SourceSecurityGroupName: aws.String("String"),
SourceSecurityGroupOwnerId: aws.String("String"),
ToPort: aws.Int64(1),
}
benchEC2QueryBuild(b, "AuthorizeSecurityGroupEgress", params)
}
func BenchmarkEC2QueryBuild_Simple_ec2AttachNetworkInterface(b *testing.B) {
params := &ec2.AttachNetworkInterfaceInput{
DeviceIndex: aws.Int64(1), // Required
InstanceId: aws.String("String"), // Required
NetworkInterfaceId: aws.String("String"), // Required
DryRun: aws.Bool(true),
}
benchEC2QueryBuild(b, "AttachNetworkInterface", params)
}
func benchEC2QueryBuild(b *testing.B, opName string, params interface{}) {
svc := awstesting.NewClient()
svc.ServiceName = "ec2"
svc.APIVersion = "2015-04-15"
for i := 0; i < b.N; i++ {
r := svc.NewRequest(&request.Operation{
Name: opName,
HTTPMethod: "POST",
HTTPPath: "/",
}, params, nil)
ec2query.Build(r)
if r.Error != nil {
b.Fatal("Unexpected error", r.Error)
}
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,33 +0,0 @@
package query
import (
"encoding/xml"
"io"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/request"
)
type xmlErrorResponse struct {
XMLName xml.Name `xml:"ErrorResponse"`
Code string `xml:"Error>Code"`
Message string `xml:"Error>Message"`
RequestID string `xml:"RequestId"`
}
// UnmarshalError unmarshals an error response for an AWS Query service.
func UnmarshalError(r *request.Request) {
defer r.HTTPResponse.Body.Close()
resp := &xmlErrorResponse{}
err := xml.NewDecoder(r.HTTPResponse.Body).Decode(resp)
if err != nil && err != io.EOF {
r.Error = awserr.New("SerializationError", "failed to decode query XML error response", err)
} else {
r.Error = awserr.NewRequestFailure(
awserr.New(resp.Code, resp.Message, nil),
r.HTTPResponse.StatusCode,
resp.RequestID,
)
}
}
File diff suppressed because it is too large Load Diff
@@ -1,45 +0,0 @@
package rest
import "reflect"
// PayloadMember returns the payload field member of i if there is one, or nil.
func PayloadMember(i interface{}) interface{} {
if i == nil {
return nil
}
v := reflect.ValueOf(i).Elem()
if !v.IsValid() {
return nil
}
if field, ok := v.Type().FieldByName("SDKShapeTraits"); ok {
if payloadName := field.Tag.Get("payload"); payloadName != "" {
field, _ := v.Type().FieldByName(payloadName)
if field.Tag.Get("type") != "structure" {
return nil
}
payload := v.FieldByName(payloadName)
if payload.IsValid() || (payload.Kind() == reflect.Ptr && !payload.IsNil()) {
return payload.Interface()
}
}
}
return nil
}
// PayloadType returns the type of a payload field member of i if there is one, or "".
func PayloadType(i interface{}) string {
v := reflect.Indirect(reflect.ValueOf(i))
if !v.IsValid() {
return ""
}
if field, ok := v.Type().FieldByName("SDKShapeTraits"); ok {
if payloadName := field.Tag.Get("payload"); payloadName != "" {
if member, ok := v.Type().FieldByName(payloadName); ok {
return member.Tag.Get("type")
}
}
}
return ""
}
@@ -1,260 +0,0 @@
package xmlutil
import (
"encoding/base64"
"encoding/xml"
"fmt"
"io"
"reflect"
"strconv"
"strings"
"time"
)
// UnmarshalXML deserializes an xml.Decoder into the container v. V
// needs to match the shape of the XML expected to be decoded.
// If the shape doesn't match unmarshaling will fail.
func UnmarshalXML(v interface{}, d *xml.Decoder, wrapper string) error {
n, _ := XMLToStruct(d, nil)
if n.Children != nil {
for _, root := range n.Children {
for _, c := range root {
if wrappedChild, ok := c.Children[wrapper]; ok {
c = wrappedChild[0] // pull out wrapped element
}
err := parse(reflect.ValueOf(v), c, "")
if err != nil {
if err == io.EOF {
return nil
}
return err
}
}
}
return nil
}
return nil
}
// parse deserializes any value from the XMLNode. The type tag is used to infer the type, or reflect
// will be used to determine the type from r.
func parse(r reflect.Value, node *XMLNode, tag reflect.StructTag) error {
rtype := r.Type()
if rtype.Kind() == reflect.Ptr {
rtype = rtype.Elem() // check kind of actual element type
}
t := tag.Get("type")
if t == "" {
switch rtype.Kind() {
case reflect.Struct:
t = "structure"
case reflect.Slice:
t = "list"
case reflect.Map:
t = "map"
}
}
switch t {
case "structure":
if field, ok := rtype.FieldByName("SDKShapeTraits"); ok {
tag = field.Tag
}
return parseStruct(r, node, tag)
case "list":
return parseList(r, node, tag)
case "map":
return parseMap(r, node, tag)
default:
return parseScalar(r, node, tag)
}
}
// parseStruct deserializes a structure and its fields from an XMLNode. Any nested
// types in the structure will also be deserialized.
func parseStruct(r reflect.Value, node *XMLNode, tag reflect.StructTag) error {
t := r.Type()
if r.Kind() == reflect.Ptr {
if r.IsNil() { // create the structure if it's nil
s := reflect.New(r.Type().Elem())
r.Set(s)
r = s
}
r = r.Elem()
t = t.Elem()
}
// unwrap any payloads
if payload := tag.Get("payload"); payload != "" {
field, _ := t.FieldByName(payload)
return parseStruct(r.FieldByName(payload), node, field.Tag)
}
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
if c := field.Name[0:1]; strings.ToLower(c) == c {
continue // ignore unexported fields
}
// figure out what this field is called
name := field.Name
if field.Tag.Get("flattened") != "" && field.Tag.Get("locationNameList") != "" {
name = field.Tag.Get("locationNameList")
} else if locName := field.Tag.Get("locationName"); locName != "" {
name = locName
}
// try to find the field by name in elements
elems := node.Children[name]
if elems == nil { // try to find the field in attributes
for _, a := range node.Attr {
if name == a.Name.Local {
// turn this into a text node for de-serializing
elems = []*XMLNode{{Text: a.Value}}
}
}
}
member := r.FieldByName(field.Name)
for _, elem := range elems {
err := parse(member, elem, field.Tag)
if err != nil {
return err
}
}
}
return nil
}
// parseList deserializes a list of values from an XML node. Each list entry
// will also be deserialized.
func parseList(r reflect.Value, node *XMLNode, tag reflect.StructTag) error {
t := r.Type()
if tag.Get("flattened") == "" { // look at all item entries
mname := "member"
if name := tag.Get("locationNameList"); name != "" {
mname = name
}
if Children, ok := node.Children[mname]; ok {
if r.IsNil() {
r.Set(reflect.MakeSlice(t, len(Children), len(Children)))
}
for i, c := range Children {
err := parse(r.Index(i), c, "")
if err != nil {
return err
}
}
}
} else { // flattened list means this is a single element
if r.IsNil() {
r.Set(reflect.MakeSlice(t, 0, 0))
}
childR := reflect.Zero(t.Elem())
r.Set(reflect.Append(r, childR))
err := parse(r.Index(r.Len()-1), node, "")
if err != nil {
return err
}
}
return nil
}
// parseMap deserializes a map from an XMLNode. The direct children of the XMLNode
// will also be deserialized as map entries.
func parseMap(r reflect.Value, node *XMLNode, tag reflect.StructTag) error {
if r.IsNil() {
r.Set(reflect.MakeMap(r.Type()))
}
if tag.Get("flattened") == "" { // look at all child entries
for _, entry := range node.Children["entry"] {
parseMapEntry(r, entry, tag)
}
} else { // this element is itself an entry
parseMapEntry(r, node, tag)
}
return nil
}
// parseMapEntry deserializes a map entry from a XML node.
func parseMapEntry(r reflect.Value, node *XMLNode, tag reflect.StructTag) error {
kname, vname := "key", "value"
if n := tag.Get("locationNameKey"); n != "" {
kname = n
}
if n := tag.Get("locationNameValue"); n != "" {
vname = n
}
keys, ok := node.Children[kname]
values := node.Children[vname]
if ok {
for i, key := range keys {
keyR := reflect.ValueOf(key.Text)
value := values[i]
valueR := reflect.New(r.Type().Elem()).Elem()
parse(valueR, value, "")
r.SetMapIndex(keyR, valueR)
}
}
return nil
}
// parseScaller deserializes an XMLNode value into a concrete type based on the
// interface type of r.
//
// Error is returned if the deserialization fails due to invalid type conversion,
// or unsupported interface type.
func parseScalar(r reflect.Value, node *XMLNode, tag reflect.StructTag) error {
switch r.Interface().(type) {
case *string:
r.Set(reflect.ValueOf(&node.Text))
return nil
case []byte:
b, err := base64.StdEncoding.DecodeString(node.Text)
if err != nil {
return err
}
r.Set(reflect.ValueOf(b))
case *bool:
v, err := strconv.ParseBool(node.Text)
if err != nil {
return err
}
r.Set(reflect.ValueOf(&v))
case *int64:
v, err := strconv.ParseInt(node.Text, 10, 64)
if err != nil {
return err
}
r.Set(reflect.ValueOf(&v))
case *float64:
v, err := strconv.ParseFloat(node.Text, 64)
if err != nil {
return err
}
r.Set(reflect.ValueOf(&v))
case *time.Time:
const ISO8601UTC = "2006-01-02T15:04:05Z"
t, err := time.Parse(ISO8601UTC, node.Text)
if err != nil {
return err
}
r.Set(reflect.ValueOf(&t))
default:
return fmt.Errorf("unsupported value: %v (%s)", r.Interface(), r.Type())
}
return nil
}
@@ -1,105 +0,0 @@
package xmlutil
import (
"encoding/xml"
"io"
"sort"
)
// A XMLNode contains the values to be encoded or decoded.
type XMLNode struct {
Name xml.Name `json:",omitempty"`
Children map[string][]*XMLNode `json:",omitempty"`
Text string `json:",omitempty"`
Attr []xml.Attr `json:",omitempty"`
}
// NewXMLElement returns a pointer to a new XMLNode initialized to default values.
func NewXMLElement(name xml.Name) *XMLNode {
return &XMLNode{
Name: name,
Children: map[string][]*XMLNode{},
Attr: []xml.Attr{},
}
}
// AddChild adds child to the XMLNode.
func (n *XMLNode) AddChild(child *XMLNode) {
if _, ok := n.Children[child.Name.Local]; !ok {
n.Children[child.Name.Local] = []*XMLNode{}
}
n.Children[child.Name.Local] = append(n.Children[child.Name.Local], child)
}
// XMLToStruct converts a xml.Decoder stream to XMLNode with nested values.
func XMLToStruct(d *xml.Decoder, s *xml.StartElement) (*XMLNode, error) {
out := &XMLNode{}
for {
tok, err := d.Token()
if tok == nil || err == io.EOF {
break
}
if err != nil {
return out, err
}
switch typed := tok.(type) {
case xml.CharData:
out.Text = string(typed.Copy())
case xml.StartElement:
el := typed.Copy()
out.Attr = el.Attr
if out.Children == nil {
out.Children = map[string][]*XMLNode{}
}
name := typed.Name.Local
slice := out.Children[name]
if slice == nil {
slice = []*XMLNode{}
}
node, e := XMLToStruct(d, &el)
if e != nil {
return out, e
}
node.Name = typed.Name
slice = append(slice, node)
out.Children[name] = slice
case xml.EndElement:
if s != nil && s.Name.Local == typed.Name.Local { // matching end token
return out, nil
}
}
}
return out, nil
}
// StructToXML writes an XMLNode to a xml.Encoder as tokens.
func StructToXML(e *xml.Encoder, node *XMLNode, sorted bool) error {
e.EncodeToken(xml.StartElement{Name: node.Name, Attr: node.Attr})
if node.Text != "" {
e.EncodeToken(xml.CharData([]byte(node.Text)))
} else if sorted {
sortedNames := []string{}
for k := range node.Children {
sortedNames = append(sortedNames, k)
}
sort.Strings(sortedNames)
for _, k := range sortedNames {
for _, v := range node.Children[k] {
StructToXML(e, v, sorted)
}
}
} else {
for _, c := range node.Children {
for _, v := range c {
StructToXML(e, v, sorted)
}
}
}
e.EncodeToken(xml.EndElement{Name: node.Name})
return e.Flush()
}
@@ -1,42 +0,0 @@
package v4_test
import (
"net/url"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/awstesting/unit"
"github.com/aws/aws-sdk-go/service/s3"
)
func TestPresignHandler(t *testing.T) {
svc := s3.New(unit.Session)
req, _ := svc.PutObjectRequest(&s3.PutObjectInput{
Bucket: aws.String("bucket"),
Key: aws.String("key"),
ContentDisposition: aws.String("a+b c$d"),
ACL: aws.String("public-read"),
})
req.Time = time.Unix(0, 0)
urlstr, err := req.Presign(5 * time.Minute)
assert.NoError(t, err)
expectedDate := "19700101T000000Z"
expectedHeaders := "host;x-amz-acl"
expectedSig := "7edcb4e3a1bf12f4989018d75acbe3a7f03df24bd6f3112602d59fc551f0e4e2"
expectedCred := "AKID/19700101/mock-region/s3/aws4_request"
u, _ := url.Parse(urlstr)
urlQ := u.Query()
assert.Equal(t, expectedSig, urlQ.Get("X-Amz-Signature"))
assert.Equal(t, expectedCred, urlQ.Get("X-Amz-Credential"))
assert.Equal(t, expectedHeaders, urlQ.Get("X-Amz-SignedHeaders"))
assert.Equal(t, expectedDate, urlQ.Get("X-Amz-Date"))
assert.Equal(t, "300", urlQ.Get("X-Amz-Expires"))
assert.NotContains(t, urlstr, "+") // + encoded as %20
}
-365
View File
@@ -1,365 +0,0 @@
// Package v4 implements signing for AWS V4 signer
package v4
import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
"fmt"
"io"
"net/http"
"net/url"
"sort"
"strconv"
"strings"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/request"
"github.com/aws/aws-sdk-go/private/protocol/rest"
)
const (
authHeaderPrefix = "AWS4-HMAC-SHA256"
timeFormat = "20060102T150405Z"
shortTimeFormat = "20060102"
)
var ignoredHeaders = map[string]bool{
"Authorization": true,
"Content-Type": true,
"Content-Length": true,
"User-Agent": true,
}
type signer struct {
Request *http.Request
Time time.Time
ExpireTime time.Duration
ServiceName string
Region string
CredValues credentials.Value
Credentials *credentials.Credentials
Query url.Values
Body io.ReadSeeker
Debug aws.LogLevelType
Logger aws.Logger
isPresign bool
formattedTime string
formattedShortTime string
signedHeaders string
canonicalHeaders string
canonicalString string
credentialString string
stringToSign string
signature string
authorization string
}
// Sign requests with signature version 4.
//
// Will sign the requests with the service config's Credentials object
// Signing is skipped if the credentials is the credentials.AnonymousCredentials
// object.
func Sign(req *request.Request) {
// If the request does not need to be signed ignore the signing of the
// request if the AnonymousCredentials object is used.
if req.Config.Credentials == credentials.AnonymousCredentials {
return
}
region := req.ClientInfo.SigningRegion
if region == "" {
region = aws.StringValue(req.Config.Region)
}
name := req.ClientInfo.SigningName
if name == "" {
name = req.ClientInfo.ServiceName
}
s := signer{
Request: req.HTTPRequest,
Time: req.Time,
ExpireTime: req.ExpireTime,
Query: req.HTTPRequest.URL.Query(),
Body: req.Body,
ServiceName: name,
Region: region,
Credentials: req.Config.Credentials,
Debug: req.Config.LogLevel.Value(),
Logger: req.Config.Logger,
}
req.Error = s.sign()
}
func (v4 *signer) sign() error {
if v4.ExpireTime != 0 {
v4.isPresign = true
}
if v4.isRequestSigned() {
if !v4.Credentials.IsExpired() {
// If the request is already signed, and the credentials have not
// expired yet ignore the signing request.
return nil
}
// The credentials have expired for this request. The current signing
// is invalid, and needs to be request because the request will fail.
if v4.isPresign {
v4.removePresign()
// Update the request's query string to ensure the values stays in
// sync in the case retrieving the new credentials fails.
v4.Request.URL.RawQuery = v4.Query.Encode()
}
}
var err error
v4.CredValues, err = v4.Credentials.Get()
if err != nil {
return err
}
if v4.isPresign {
v4.Query.Set("X-Amz-Algorithm", authHeaderPrefix)
if v4.CredValues.SessionToken != "" {
v4.Query.Set("X-Amz-Security-Token", v4.CredValues.SessionToken)
} else {
v4.Query.Del("X-Amz-Security-Token")
}
} else if v4.CredValues.SessionToken != "" {
v4.Request.Header.Set("X-Amz-Security-Token", v4.CredValues.SessionToken)
}
v4.build()
if v4.Debug.Matches(aws.LogDebugWithSigning) {
v4.logSigningInfo()
}
return nil
}
const logSignInfoMsg = `DEBUG: Request Signiture:
---[ CANONICAL STRING ]-----------------------------
%s
---[ STRING TO SIGN ]--------------------------------
%s%s
-----------------------------------------------------`
const logSignedURLMsg = `
---[ SIGNED URL ]------------------------------------
%s`
func (v4 *signer) logSigningInfo() {
signedURLMsg := ""
if v4.isPresign {
signedURLMsg = fmt.Sprintf(logSignedURLMsg, v4.Request.URL.String())
}
msg := fmt.Sprintf(logSignInfoMsg, v4.canonicalString, v4.stringToSign, signedURLMsg)
v4.Logger.Log(msg)
}
func (v4 *signer) build() {
v4.buildTime() // no depends
v4.buildCredentialString() // no depends
if v4.isPresign {
v4.buildQuery() // no depends
}
v4.buildCanonicalHeaders() // depends on cred string
v4.buildCanonicalString() // depends on canon headers / signed headers
v4.buildStringToSign() // depends on canon string
v4.buildSignature() // depends on string to sign
if v4.isPresign {
v4.Request.URL.RawQuery += "&X-Amz-Signature=" + v4.signature
} else {
parts := []string{
authHeaderPrefix + " Credential=" + v4.CredValues.AccessKeyID + "/" + v4.credentialString,
"SignedHeaders=" + v4.signedHeaders,
"Signature=" + v4.signature,
}
v4.Request.Header.Set("Authorization", strings.Join(parts, ", "))
}
}
func (v4 *signer) buildTime() {
v4.formattedTime = v4.Time.UTC().Format(timeFormat)
v4.formattedShortTime = v4.Time.UTC().Format(shortTimeFormat)
if v4.isPresign {
duration := int64(v4.ExpireTime / time.Second)
v4.Query.Set("X-Amz-Date", v4.formattedTime)
v4.Query.Set("X-Amz-Expires", strconv.FormatInt(duration, 10))
} else {
v4.Request.Header.Set("X-Amz-Date", v4.formattedTime)
}
}
func (v4 *signer) buildCredentialString() {
v4.credentialString = strings.Join([]string{
v4.formattedShortTime,
v4.Region,
v4.ServiceName,
"aws4_request",
}, "/")
if v4.isPresign {
v4.Query.Set("X-Amz-Credential", v4.CredValues.AccessKeyID+"/"+v4.credentialString)
}
}
func (v4 *signer) buildQuery() {
for k, h := range v4.Request.Header {
if strings.HasPrefix(http.CanonicalHeaderKey(k), "X-Amz-") {
continue // never hoist x-amz-* headers, they must be signed
}
if _, ok := ignoredHeaders[http.CanonicalHeaderKey(k)]; ok {
continue // never hoist ignored headers
}
v4.Request.Header.Del(k)
v4.Query.Del(k)
for _, v := range h {
v4.Query.Add(k, v)
}
}
}
func (v4 *signer) buildCanonicalHeaders() {
var headers []string
headers = append(headers, "host")
for k := range v4.Request.Header {
if _, ok := ignoredHeaders[http.CanonicalHeaderKey(k)]; ok {
continue // ignored header
}
headers = append(headers, strings.ToLower(k))
}
sort.Strings(headers)
v4.signedHeaders = strings.Join(headers, ";")
if v4.isPresign {
v4.Query.Set("X-Amz-SignedHeaders", v4.signedHeaders)
}
headerValues := make([]string, len(headers))
for i, k := range headers {
if k == "host" {
headerValues[i] = "host:" + v4.Request.URL.Host
} else {
headerValues[i] = k + ":" +
strings.Join(v4.Request.Header[http.CanonicalHeaderKey(k)], ",")
}
}
v4.canonicalHeaders = strings.Join(headerValues, "\n")
}
func (v4 *signer) buildCanonicalString() {
v4.Request.URL.RawQuery = strings.Replace(v4.Query.Encode(), "+", "%20", -1)
uri := v4.Request.URL.Opaque
if uri != "" {
uri = "/" + strings.Join(strings.Split(uri, "/")[3:], "/")
} else {
uri = v4.Request.URL.Path
}
if uri == "" {
uri = "/"
}
if v4.ServiceName != "s3" {
uri = rest.EscapePath(uri, false)
}
v4.canonicalString = strings.Join([]string{
v4.Request.Method,
uri,
v4.Request.URL.RawQuery,
v4.canonicalHeaders + "\n",
v4.signedHeaders,
v4.bodyDigest(),
}, "\n")
}
func (v4 *signer) buildStringToSign() {
v4.stringToSign = strings.Join([]string{
authHeaderPrefix,
v4.formattedTime,
v4.credentialString,
hex.EncodeToString(makeSha256([]byte(v4.canonicalString))),
}, "\n")
}
func (v4 *signer) buildSignature() {
secret := v4.CredValues.SecretAccessKey
date := makeHmac([]byte("AWS4"+secret), []byte(v4.formattedShortTime))
region := makeHmac(date, []byte(v4.Region))
service := makeHmac(region, []byte(v4.ServiceName))
credentials := makeHmac(service, []byte("aws4_request"))
signature := makeHmac(credentials, []byte(v4.stringToSign))
v4.signature = hex.EncodeToString(signature)
}
func (v4 *signer) bodyDigest() string {
hash := v4.Request.Header.Get("X-Amz-Content-Sha256")
if hash == "" {
if v4.isPresign && v4.ServiceName == "s3" {
hash = "UNSIGNED-PAYLOAD"
} else if v4.Body == nil {
hash = hex.EncodeToString(makeSha256([]byte{}))
} else {
hash = hex.EncodeToString(makeSha256Reader(v4.Body))
}
v4.Request.Header.Add("X-Amz-Content-Sha256", hash)
}
return hash
}
// isRequestSigned returns if the request is currently signed or presigned
func (v4 *signer) isRequestSigned() bool {
if v4.isPresign && v4.Query.Get("X-Amz-Signature") != "" {
return true
}
if v4.Request.Header.Get("Authorization") != "" {
return true
}
return false
}
// unsign removes signing flags for both signed and presigned requests.
func (v4 *signer) removePresign() {
v4.Query.Del("X-Amz-Algorithm")
v4.Query.Del("X-Amz-Signature")
v4.Query.Del("X-Amz-Security-Token")
v4.Query.Del("X-Amz-Date")
v4.Query.Del("X-Amz-Expires")
v4.Query.Del("X-Amz-Credential")
v4.Query.Del("X-Amz-SignedHeaders")
}
func makeHmac(key []byte, data []byte) []byte {
hash := hmac.New(sha256.New, key)
hash.Write(data)
return hash.Sum(nil)
}
func makeSha256(data []byte) []byte {
hash := sha256.New()
hash.Write(data)
return hash.Sum(nil)
}
func makeSha256Reader(reader io.ReadSeeker) []byte {
hash := sha256.New()
start, _ := reader.Seek(0, 1)
defer reader.Seek(start, 0)
io.Copy(hash, reader)
return hash.Sum(nil)
}
@@ -1,252 +0,0 @@
package v4
import (
"net/http"
"strings"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/request"
"github.com/aws/aws-sdk-go/awstesting"
)
func buildSigner(serviceName string, region string, signTime time.Time, expireTime time.Duration, body string) signer {
endpoint := "https://" + serviceName + "." + region + ".amazonaws.com"
reader := strings.NewReader(body)
req, _ := http.NewRequest("POST", endpoint, reader)
req.URL.Opaque = "//example.org/bucket/key-._~,!@#$%^&*()"
req.Header.Add("X-Amz-Target", "prefix.Operation")
req.Header.Add("Content-Type", "application/x-amz-json-1.0")
req.Header.Add("Content-Length", string(len(body)))
req.Header.Add("X-Amz-Meta-Other-Header", "some-value=!@#$%^&* (+)")
return signer{
Request: req,
Time: signTime,
ExpireTime: expireTime,
Query: req.URL.Query(),
Body: reader,
ServiceName: serviceName,
Region: region,
Credentials: credentials.NewStaticCredentials("AKID", "SECRET", "SESSION"),
}
}
func removeWS(text string) string {
text = strings.Replace(text, " ", "", -1)
text = strings.Replace(text, "\n", "", -1)
text = strings.Replace(text, "\t", "", -1)
return text
}
func assertEqual(t *testing.T, expected, given string) {
if removeWS(expected) != removeWS(given) {
t.Errorf("\nExpected: %s\nGiven: %s", expected, given)
}
}
func TestPresignRequest(t *testing.T) {
signer := buildSigner("dynamodb", "us-east-1", time.Unix(0, 0), 300*time.Second, "{}")
signer.sign()
expectedDate := "19700101T000000Z"
expectedHeaders := "host;x-amz-meta-other-header;x-amz-target"
expectedSig := "5eeedebf6f995145ce56daa02902d10485246d3defb34f97b973c1f40ab82d36"
expectedCred := "AKID/19700101/us-east-1/dynamodb/aws4_request"
q := signer.Request.URL.Query()
assert.Equal(t, expectedSig, q.Get("X-Amz-Signature"))
assert.Equal(t, expectedCred, q.Get("X-Amz-Credential"))
assert.Equal(t, expectedHeaders, q.Get("X-Amz-SignedHeaders"))
assert.Equal(t, expectedDate, q.Get("X-Amz-Date"))
}
func TestSignRequest(t *testing.T) {
signer := buildSigner("dynamodb", "us-east-1", time.Unix(0, 0), 0, "{}")
signer.sign()
expectedDate := "19700101T000000Z"
expectedSig := "AWS4-HMAC-SHA256 Credential=AKID/19700101/us-east-1/dynamodb/aws4_request, SignedHeaders=host;x-amz-date;x-amz-meta-other-header;x-amz-security-token;x-amz-target, Signature=69ada33fec48180dab153576e4dd80c4e04124f80dda3eccfed8a67c2b91ed5e"
q := signer.Request.Header
assert.Equal(t, expectedSig, q.Get("Authorization"))
assert.Equal(t, expectedDate, q.Get("X-Amz-Date"))
}
func TestSignEmptyBody(t *testing.T) {
signer := buildSigner("dynamodb", "us-east-1", time.Now(), 0, "")
signer.Body = nil
signer.sign()
hash := signer.Request.Header.Get("X-Amz-Content-Sha256")
assert.Equal(t, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", hash)
}
func TestSignBody(t *testing.T) {
signer := buildSigner("dynamodb", "us-east-1", time.Now(), 0, "hello")
signer.sign()
hash := signer.Request.Header.Get("X-Amz-Content-Sha256")
assert.Equal(t, "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824", hash)
}
func TestSignSeekedBody(t *testing.T) {
signer := buildSigner("dynamodb", "us-east-1", time.Now(), 0, " hello")
signer.Body.Read(make([]byte, 3)) // consume first 3 bytes so body is now "hello"
signer.sign()
hash := signer.Request.Header.Get("X-Amz-Content-Sha256")
assert.Equal(t, "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824", hash)
start, _ := signer.Body.Seek(0, 1)
assert.Equal(t, int64(3), start)
}
func TestPresignEmptyBodyS3(t *testing.T) {
signer := buildSigner("s3", "us-east-1", time.Now(), 5*time.Minute, "hello")
signer.sign()
hash := signer.Request.Header.Get("X-Amz-Content-Sha256")
assert.Equal(t, "UNSIGNED-PAYLOAD", hash)
}
func TestSignPrecomputedBodyChecksum(t *testing.T) {
signer := buildSigner("dynamodb", "us-east-1", time.Now(), 0, "hello")
signer.Request.Header.Set("X-Amz-Content-Sha256", "PRECOMPUTED")
signer.sign()
hash := signer.Request.Header.Get("X-Amz-Content-Sha256")
assert.Equal(t, "PRECOMPUTED", hash)
}
func TestAnonymousCredentials(t *testing.T) {
svc := awstesting.NewClient(&aws.Config{Credentials: credentials.AnonymousCredentials})
r := svc.NewRequest(
&request.Operation{
Name: "BatchGetItem",
HTTPMethod: "POST",
HTTPPath: "/",
},
nil,
nil,
)
Sign(r)
urlQ := r.HTTPRequest.URL.Query()
assert.Empty(t, urlQ.Get("X-Amz-Signature"))
assert.Empty(t, urlQ.Get("X-Amz-Credential"))
assert.Empty(t, urlQ.Get("X-Amz-SignedHeaders"))
assert.Empty(t, urlQ.Get("X-Amz-Date"))
hQ := r.HTTPRequest.Header
assert.Empty(t, hQ.Get("Authorization"))
assert.Empty(t, hQ.Get("X-Amz-Date"))
}
func TestIgnoreResignRequestWithValidCreds(t *testing.T) {
svc := awstesting.NewClient(&aws.Config{
Credentials: credentials.NewStaticCredentials("AKID", "SECRET", "SESSION"),
Region: aws.String("us-west-2"),
})
r := svc.NewRequest(
&request.Operation{
Name: "BatchGetItem",
HTTPMethod: "POST",
HTTPPath: "/",
},
nil,
nil,
)
Sign(r)
sig := r.HTTPRequest.Header.Get("Authorization")
Sign(r)
assert.Equal(t, sig, r.HTTPRequest.Header.Get("Authorization"))
}
func TestIgnorePreResignRequestWithValidCreds(t *testing.T) {
svc := awstesting.NewClient(&aws.Config{
Credentials: credentials.NewStaticCredentials("AKID", "SECRET", "SESSION"),
Region: aws.String("us-west-2"),
})
r := svc.NewRequest(
&request.Operation{
Name: "BatchGetItem",
HTTPMethod: "POST",
HTTPPath: "/",
},
nil,
nil,
)
r.ExpireTime = time.Minute * 10
Sign(r)
sig := r.HTTPRequest.Header.Get("X-Amz-Signature")
Sign(r)
assert.Equal(t, sig, r.HTTPRequest.Header.Get("X-Amz-Signature"))
}
func TestResignRequestExpiredCreds(t *testing.T) {
creds := credentials.NewStaticCredentials("AKID", "SECRET", "SESSION")
svc := awstesting.NewClient(&aws.Config{Credentials: creds})
r := svc.NewRequest(
&request.Operation{
Name: "BatchGetItem",
HTTPMethod: "POST",
HTTPPath: "/",
},
nil,
nil,
)
Sign(r)
querySig := r.HTTPRequest.Header.Get("Authorization")
creds.Expire()
Sign(r)
assert.NotEqual(t, querySig, r.HTTPRequest.Header.Get("Authorization"))
}
func TestPreResignRequestExpiredCreds(t *testing.T) {
provider := &credentials.StaticProvider{Value: credentials.Value{
AccessKeyID: "AKID",
SecretAccessKey: "SECRET",
SessionToken: "SESSION",
}}
creds := credentials.NewCredentials(provider)
svc := awstesting.NewClient(&aws.Config{Credentials: creds})
r := svc.NewRequest(
&request.Operation{
Name: "BatchGetItem",
HTTPMethod: "POST",
HTTPPath: "/",
},
nil,
nil,
)
r.ExpireTime = time.Minute * 10
Sign(r)
querySig := r.HTTPRequest.URL.Query().Get("X-Amz-Signature")
creds.Expire()
r.Time = time.Now().Add(time.Hour * 48)
Sign(r)
assert.NotEqual(t, querySig, r.HTTPRequest.URL.Query().Get("X-Amz-Signature"))
}
func BenchmarkPresignRequest(b *testing.B) {
signer := buildSigner("dynamodb", "us-east-1", time.Now(), 300*time.Second, "{}")
for i := 0; i < b.N; i++ {
signer.sign()
}
}
func BenchmarkSignRequest(b *testing.B) {
signer := buildSigner("dynamodb", "us-east-1", time.Now(), 0, "{}")
for i := 0; i < b.N; i++ {
signer.sign()
}
}
@@ -1,391 +0,0 @@
package waiter_test
import (
"bytes"
"io/ioutil"
"net/http"
"testing"
"github.com/stretchr/testify/assert"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/client"
"github.com/aws/aws-sdk-go/aws/request"
"github.com/aws/aws-sdk-go/awstesting"
"github.com/aws/aws-sdk-go/private/waiter"
)
type mockClient struct {
*client.Client
}
type MockInput struct{}
type MockOutput struct {
States []*MockState
}
type MockState struct {
State *string
}
func (c *mockClient) MockRequest(input *MockInput) (*request.Request, *MockOutput) {
op := &request.Operation{
Name: "Mock",
HTTPMethod: "POST",
HTTPPath: "/",
}
if input == nil {
input = &MockInput{}
}
output := &MockOutput{}
req := c.NewRequest(op, input, output)
req.Data = output
return req, output
}
func TestWaiterPathAll(t *testing.T) {
svc := &mockClient{Client: awstesting.NewClient(&aws.Config{
Region: aws.String("mock-region"),
})}
svc.Handlers.Send.Clear() // mock sending
svc.Handlers.Unmarshal.Clear()
svc.Handlers.UnmarshalMeta.Clear()
svc.Handlers.ValidateResponse.Clear()
reqNum := 0
resps := []*MockOutput{
{ // Request 1
States: []*MockState{
{State: aws.String("pending")},
{State: aws.String("pending")},
},
},
{ // Request 2
States: []*MockState{
{State: aws.String("running")},
{State: aws.String("pending")},
},
},
{ // Request 3
States: []*MockState{
{State: aws.String("running")},
{State: aws.String("running")},
},
},
}
numBuiltReq := 0
svc.Handlers.Build.PushBack(func(r *request.Request) {
numBuiltReq++
})
svc.Handlers.Unmarshal.PushBack(func(r *request.Request) {
if reqNum >= len(resps) {
assert.Fail(t, "too many polling requests made")
return
}
r.Data = resps[reqNum]
reqNum++
})
waiterCfg := waiter.Config{
Operation: "Mock",
Delay: 0,
MaxAttempts: 10,
Acceptors: []waiter.WaitAcceptor{
{
State: "success",
Matcher: "pathAll",
Argument: "States[].State",
Expected: "running",
},
},
}
w := waiter.Waiter{
Client: svc,
Input: &MockInput{},
Config: waiterCfg,
}
err := w.Wait()
assert.NoError(t, err)
assert.Equal(t, 3, numBuiltReq)
assert.Equal(t, 3, reqNum)
}
func TestWaiterPath(t *testing.T) {
svc := &mockClient{Client: awstesting.NewClient(&aws.Config{
Region: aws.String("mock-region"),
})}
svc.Handlers.Send.Clear() // mock sending
svc.Handlers.Unmarshal.Clear()
svc.Handlers.UnmarshalMeta.Clear()
svc.Handlers.ValidateResponse.Clear()
reqNum := 0
resps := []*MockOutput{
{ // Request 1
States: []*MockState{
{State: aws.String("pending")},
{State: aws.String("pending")},
},
},
{ // Request 2
States: []*MockState{
{State: aws.String("running")},
{State: aws.String("pending")},
},
},
{ // Request 3
States: []*MockState{
{State: aws.String("running")},
{State: aws.String("running")},
},
},
}
numBuiltReq := 0
svc.Handlers.Build.PushBack(func(r *request.Request) {
numBuiltReq++
})
svc.Handlers.Unmarshal.PushBack(func(r *request.Request) {
if reqNum >= len(resps) {
assert.Fail(t, "too many polling requests made")
return
}
r.Data = resps[reqNum]
reqNum++
})
waiterCfg := waiter.Config{
Operation: "Mock",
Delay: 0,
MaxAttempts: 10,
Acceptors: []waiter.WaitAcceptor{
{
State: "success",
Matcher: "path",
Argument: "States[].State",
Expected: "running",
},
},
}
w := waiter.Waiter{
Client: svc,
Input: &MockInput{},
Config: waiterCfg,
}
err := w.Wait()
assert.NoError(t, err)
assert.Equal(t, 3, numBuiltReq)
assert.Equal(t, 3, reqNum)
}
func TestWaiterFailure(t *testing.T) {
svc := &mockClient{Client: awstesting.NewClient(&aws.Config{
Region: aws.String("mock-region"),
})}
svc.Handlers.Send.Clear() // mock sending
svc.Handlers.Unmarshal.Clear()
svc.Handlers.UnmarshalMeta.Clear()
svc.Handlers.ValidateResponse.Clear()
reqNum := 0
resps := []*MockOutput{
{ // Request 1
States: []*MockState{
{State: aws.String("pending")},
{State: aws.String("pending")},
},
},
{ // Request 2
States: []*MockState{
{State: aws.String("running")},
{State: aws.String("pending")},
},
},
{ // Request 3
States: []*MockState{
{State: aws.String("running")},
{State: aws.String("stopping")},
},
},
}
numBuiltReq := 0
svc.Handlers.Build.PushBack(func(r *request.Request) {
numBuiltReq++
})
svc.Handlers.Unmarshal.PushBack(func(r *request.Request) {
if reqNum >= len(resps) {
assert.Fail(t, "too many polling requests made")
return
}
r.Data = resps[reqNum]
reqNum++
})
waiterCfg := waiter.Config{
Operation: "Mock",
Delay: 0,
MaxAttempts: 10,
Acceptors: []waiter.WaitAcceptor{
{
State: "success",
Matcher: "pathAll",
Argument: "States[].State",
Expected: "running",
},
{
State: "failure",
Matcher: "pathAny",
Argument: "States[].State",
Expected: "stopping",
},
},
}
w := waiter.Waiter{
Client: svc,
Input: &MockInput{},
Config: waiterCfg,
}
err := w.Wait().(awserr.Error)
assert.Error(t, err)
assert.Equal(t, "ResourceNotReady", err.Code())
assert.Equal(t, "failed waiting for successful resource state", err.Message())
assert.Equal(t, 3, numBuiltReq)
assert.Equal(t, 3, reqNum)
}
func TestWaiterError(t *testing.T) {
svc := &mockClient{Client: awstesting.NewClient(&aws.Config{
Region: aws.String("mock-region"),
})}
svc.Handlers.Send.Clear() // mock sending
svc.Handlers.Unmarshal.Clear()
svc.Handlers.UnmarshalMeta.Clear()
svc.Handlers.ValidateResponse.Clear()
reqNum := 0
resps := []*MockOutput{
{ // Request 1
States: []*MockState{
{State: aws.String("pending")},
{State: aws.String("pending")},
},
},
{ // Request 2, error case
},
{ // Request 3
States: []*MockState{
{State: aws.String("running")},
{State: aws.String("running")},
},
},
}
numBuiltReq := 0
svc.Handlers.Build.PushBack(func(r *request.Request) {
numBuiltReq++
})
svc.Handlers.Send.PushBack(func(r *request.Request) {
if reqNum == 1 {
r.Error = awserr.New("MockException", "mock exception message", nil)
r.HTTPResponse = &http.Response{
StatusCode: 400,
Status: http.StatusText(400),
Body: ioutil.NopCloser(bytes.NewReader([]byte{})),
}
reqNum++
}
})
svc.Handlers.Unmarshal.PushBack(func(r *request.Request) {
if reqNum >= len(resps) {
assert.Fail(t, "too many polling requests made")
return
}
r.Data = resps[reqNum]
reqNum++
})
waiterCfg := waiter.Config{
Operation: "Mock",
Delay: 0,
MaxAttempts: 10,
Acceptors: []waiter.WaitAcceptor{
{
State: "success",
Matcher: "pathAll",
Argument: "States[].State",
Expected: "running",
},
{
State: "retry",
Matcher: "error",
Argument: "",
Expected: "MockException",
},
},
}
w := waiter.Waiter{
Client: svc,
Input: &MockInput{},
Config: waiterCfg,
}
err := w.Wait()
assert.NoError(t, err)
assert.Equal(t, 3, numBuiltReq)
assert.Equal(t, 3, reqNum)
}
func TestWaiterStatus(t *testing.T) {
svc := &mockClient{Client: awstesting.NewClient(&aws.Config{
Region: aws.String("mock-region"),
})}
svc.Handlers.Send.Clear() // mock sending
svc.Handlers.Unmarshal.Clear()
svc.Handlers.UnmarshalMeta.Clear()
svc.Handlers.ValidateResponse.Clear()
reqNum := 0
svc.Handlers.Build.PushBack(func(r *request.Request) {
reqNum++
})
svc.Handlers.Send.PushBack(func(r *request.Request) {
code := 200
if reqNum == 3 {
code = 404
}
r.HTTPResponse = &http.Response{
StatusCode: code,
Status: http.StatusText(code),
Body: ioutil.NopCloser(bytes.NewReader([]byte{})),
}
})
waiterCfg := waiter.Config{
Operation: "Mock",
Delay: 0,
MaxAttempts: 10,
Acceptors: []waiter.WaitAcceptor{
{
State: "success",
Matcher: "status",
Argument: "",
Expected: 404,
},
},
}
w := waiter.Waiter{
Client: svc,
Input: &MockInput{},
Config: waiterCfg,
}
err := w.Wait()
assert.NoError(t, err)
assert.Equal(t, 3, reqNum)
}
File diff suppressed because it is too large Load Diff
@@ -1,337 +0,0 @@
// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
package cloudwatch_test
import (
"bytes"
"fmt"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/cloudwatch"
)
var _ time.Duration
var _ bytes.Buffer
func ExampleCloudWatch_DeleteAlarms() {
svc := cloudwatch.New(session.New())
params := &cloudwatch.DeleteAlarmsInput{
AlarmNames: []*string{ // Required
aws.String("AlarmName"), // Required
// More values...
},
}
resp, err := svc.DeleteAlarms(params)
if err != nil {
// Print the error, cast err to awserr.Error to get the Code and
// Message from an error.
fmt.Println(err.Error())
return
}
// Pretty-print the response data.
fmt.Println(resp)
}
func ExampleCloudWatch_DescribeAlarmHistory() {
svc := cloudwatch.New(session.New())
params := &cloudwatch.DescribeAlarmHistoryInput{
AlarmName: aws.String("AlarmName"),
EndDate: aws.Time(time.Now()),
HistoryItemType: aws.String("HistoryItemType"),
MaxRecords: aws.Int64(1),
NextToken: aws.String("NextToken"),
StartDate: aws.Time(time.Now()),
}
resp, err := svc.DescribeAlarmHistory(params)
if err != nil {
// Print the error, cast err to awserr.Error to get the Code and
// Message from an error.
fmt.Println(err.Error())
return
}
// Pretty-print the response data.
fmt.Println(resp)
}
func ExampleCloudWatch_DescribeAlarms() {
svc := cloudwatch.New(session.New())
params := &cloudwatch.DescribeAlarmsInput{
ActionPrefix: aws.String("ActionPrefix"),
AlarmNamePrefix: aws.String("AlarmNamePrefix"),
AlarmNames: []*string{
aws.String("AlarmName"), // Required
// More values...
},
MaxRecords: aws.Int64(1),
NextToken: aws.String("NextToken"),
StateValue: aws.String("StateValue"),
}
resp, err := svc.DescribeAlarms(params)
if err != nil {
// Print the error, cast err to awserr.Error to get the Code and
// Message from an error.
fmt.Println(err.Error())
return
}
// Pretty-print the response data.
fmt.Println(resp)
}
func ExampleCloudWatch_DescribeAlarmsForMetric() {
svc := cloudwatch.New(session.New())
params := &cloudwatch.DescribeAlarmsForMetricInput{
MetricName: aws.String("MetricName"), // Required
Namespace: aws.String("Namespace"), // Required
Dimensions: []*cloudwatch.Dimension{
{ // Required
Name: aws.String("DimensionName"), // Required
Value: aws.String("DimensionValue"), // Required
},
// More values...
},
Period: aws.Int64(1),
Statistic: aws.String("Statistic"),
Unit: aws.String("StandardUnit"),
}
resp, err := svc.DescribeAlarmsForMetric(params)
if err != nil {
// Print the error, cast err to awserr.Error to get the Code and
// Message from an error.
fmt.Println(err.Error())
return
}
// Pretty-print the response data.
fmt.Println(resp)
}
func ExampleCloudWatch_DisableAlarmActions() {
svc := cloudwatch.New(session.New())
params := &cloudwatch.DisableAlarmActionsInput{
AlarmNames: []*string{ // Required
aws.String("AlarmName"), // Required
// More values...
},
}
resp, err := svc.DisableAlarmActions(params)
if err != nil {
// Print the error, cast err to awserr.Error to get the Code and
// Message from an error.
fmt.Println(err.Error())
return
}
// Pretty-print the response data.
fmt.Println(resp)
}
func ExampleCloudWatch_EnableAlarmActions() {
svc := cloudwatch.New(session.New())
params := &cloudwatch.EnableAlarmActionsInput{
AlarmNames: []*string{ // Required
aws.String("AlarmName"), // Required
// More values...
},
}
resp, err := svc.EnableAlarmActions(params)
if err != nil {
// Print the error, cast err to awserr.Error to get the Code and
// Message from an error.
fmt.Println(err.Error())
return
}
// Pretty-print the response data.
fmt.Println(resp)
}
func ExampleCloudWatch_GetMetricStatistics() {
svc := cloudwatch.New(session.New())
params := &cloudwatch.GetMetricStatisticsInput{
EndTime: aws.Time(time.Now()), // Required
MetricName: aws.String("MetricName"), // Required
Namespace: aws.String("Namespace"), // Required
Period: aws.Int64(1), // Required
StartTime: aws.Time(time.Now()), // Required
Statistics: []*string{ // Required
aws.String("Statistic"), // Required
// More values...
},
Dimensions: []*cloudwatch.Dimension{
{ // Required
Name: aws.String("DimensionName"), // Required
Value: aws.String("DimensionValue"), // Required
},
// More values...
},
Unit: aws.String("StandardUnit"),
}
resp, err := svc.GetMetricStatistics(params)
if err != nil {
// Print the error, cast err to awserr.Error to get the Code and
// Message from an error.
fmt.Println(err.Error())
return
}
// Pretty-print the response data.
fmt.Println(resp)
}
func ExampleCloudWatch_ListMetrics() {
svc := cloudwatch.New(session.New())
params := &cloudwatch.ListMetricsInput{
Dimensions: []*cloudwatch.DimensionFilter{
{ // Required
Name: aws.String("DimensionName"), // Required
Value: aws.String("DimensionValue"),
},
// More values...
},
MetricName: aws.String("MetricName"),
Namespace: aws.String("Namespace"),
NextToken: aws.String("NextToken"),
}
resp, err := svc.ListMetrics(params)
if err != nil {
// Print the error, cast err to awserr.Error to get the Code and
// Message from an error.
fmt.Println(err.Error())
return
}
// Pretty-print the response data.
fmt.Println(resp)
}
func ExampleCloudWatch_PutMetricAlarm() {
svc := cloudwatch.New(session.New())
params := &cloudwatch.PutMetricAlarmInput{
AlarmName: aws.String("AlarmName"), // Required
ComparisonOperator: aws.String("ComparisonOperator"), // Required
EvaluationPeriods: aws.Int64(1), // Required
MetricName: aws.String("MetricName"), // Required
Namespace: aws.String("Namespace"), // Required
Period: aws.Int64(1), // Required
Statistic: aws.String("Statistic"), // Required
Threshold: aws.Float64(1.0), // Required
ActionsEnabled: aws.Bool(true),
AlarmActions: []*string{
aws.String("ResourceName"), // Required
// More values...
},
AlarmDescription: aws.String("AlarmDescription"),
Dimensions: []*cloudwatch.Dimension{
{ // Required
Name: aws.String("DimensionName"), // Required
Value: aws.String("DimensionValue"), // Required
},
// More values...
},
InsufficientDataActions: []*string{
aws.String("ResourceName"), // Required
// More values...
},
OKActions: []*string{
aws.String("ResourceName"), // Required
// More values...
},
Unit: aws.String("StandardUnit"),
}
resp, err := svc.PutMetricAlarm(params)
if err != nil {
// Print the error, cast err to awserr.Error to get the Code and
// Message from an error.
fmt.Println(err.Error())
return
}
// Pretty-print the response data.
fmt.Println(resp)
}
func ExampleCloudWatch_PutMetricData() {
svc := cloudwatch.New(session.New())
params := &cloudwatch.PutMetricDataInput{
MetricData: []*cloudwatch.MetricDatum{ // Required
{ // Required
MetricName: aws.String("MetricName"), // Required
Dimensions: []*cloudwatch.Dimension{
{ // Required
Name: aws.String("DimensionName"), // Required
Value: aws.String("DimensionValue"), // Required
},
// More values...
},
StatisticValues: &cloudwatch.StatisticSet{
Maximum: aws.Float64(1.0), // Required
Minimum: aws.Float64(1.0), // Required
SampleCount: aws.Float64(1.0), // Required
Sum: aws.Float64(1.0), // Required
},
Timestamp: aws.Time(time.Now()),
Unit: aws.String("StandardUnit"),
Value: aws.Float64(1.0),
},
// More values...
},
Namespace: aws.String("Namespace"), // Required
}
resp, err := svc.PutMetricData(params)
if err != nil {
// Print the error, cast err to awserr.Error to get the Code and
// Message from an error.
fmt.Println(err.Error())
return
}
// Pretty-print the response data.
fmt.Println(resp)
}
func ExampleCloudWatch_SetAlarmState() {
svc := cloudwatch.New(session.New())
params := &cloudwatch.SetAlarmStateInput{
AlarmName: aws.String("AlarmName"), // Required
StateReason: aws.String("StateReason"), // Required
StateValue: aws.String("StateValue"), // Required
StateReasonData: aws.String("StateReasonData"),
}
resp, err := svc.SetAlarmState(params)
if err != nil {
// Print the error, cast err to awserr.Error to get the Code and
// Message from an error.
fmt.Println(err.Error())
return
}
// Pretty-print the response data.
fmt.Println(resp)
}
@@ -1,125 +0,0 @@
// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
package cloudwatch
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/client"
"github.com/aws/aws-sdk-go/aws/client/metadata"
"github.com/aws/aws-sdk-go/aws/request"
"github.com/aws/aws-sdk-go/private/protocol/query"
"github.com/aws/aws-sdk-go/private/signer/v4"
)
// This is the Amazon CloudWatch API Reference. This guide provides detailed
// information about Amazon CloudWatch actions, data types, parameters, and
// errors. For detailed information about Amazon CloudWatch features and their
// associated API calls, go to the Amazon CloudWatch Developer Guide (http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide).
//
// Amazon CloudWatch is a web service that enables you to publish, monitor,
// and manage various metrics, as well as configure alarm actions based on data
// from metrics. For more information about this product go to http://aws.amazon.com/cloudwatch
// (http://aws.amazon.com/cloudwatch).
//
// For information about the namespace, metric names, and dimensions that
// other Amazon Web Services products use to send metrics to Cloudwatch, go
// to Amazon CloudWatch Metrics, Namespaces, and Dimensions Reference (http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/CW_Support_For_AWS.html)
// in the Amazon CloudWatch Developer Guide.
//
// Use the following links to get started using the Amazon CloudWatch API Reference:
//
// Actions (http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_Operations.html):
// An alphabetical list of all Amazon CloudWatch actions. Data Types (http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_Types.html):
// An alphabetical list of all Amazon CloudWatch data types. Common Parameters
// (http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/CommonParameters.html):
// Parameters that all Query actions can use. Common Errors (http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/CommonErrors.html):
// Client and server errors that all actions can return. Regions and Endpoints
// (http://docs.aws.amazon.com/general/latest/gr/index.html?rande.html): Itemized
// regions and endpoints for all AWS products. WSDL Location (http://monitoring.amazonaws.com/doc/2010-08-01/CloudWatch.wsdl):
// http://monitoring.amazonaws.com/doc/2010-08-01/CloudWatch.wsdl In addition
// to using the Amazon CloudWatch API, you can also use the following SDKs and
// third-party libraries to access Amazon CloudWatch programmatically.
//
// AWS SDK for Java Documentation (http://aws.amazon.com/documentation/sdkforjava/)
// AWS SDK for .NET Documentation (http://aws.amazon.com/documentation/sdkfornet/)
// AWS SDK for PHP Documentation (http://aws.amazon.com/documentation/sdkforphp/)
// AWS SDK for Ruby Documentation (http://aws.amazon.com/documentation/sdkforruby/)
// Developers in the AWS developer community also provide their own libraries,
// which you can find at the following AWS developer centers:
//
// AWS Java Developer Center (http://aws.amazon.com/java/) AWS PHP Developer
// Center (http://aws.amazon.com/php/) AWS Python Developer Center (http://aws.amazon.com/python/)
// AWS Ruby Developer Center (http://aws.amazon.com/ruby/) AWS Windows and .NET
// Developer Center (http://aws.amazon.com/net/)
//The service client's operations are safe to be used concurrently.
// It is not safe to mutate any of the client's properties though.
type CloudWatch struct {
*client.Client
}
// Used for custom client initialization logic
var initClient func(*client.Client)
// Used for custom request initialization logic
var initRequest func(*request.Request)
// A ServiceName is the name of the service the client will make API calls to.
const ServiceName = "monitoring"
// New creates a new instance of the CloudWatch client with a session.
// If additional configuration is needed for the client instance use the optional
// aws.Config parameter to add your extra config.
//
// Example:
// // Create a CloudWatch client from just a session.
// svc := cloudwatch.New(mySession)
//
// // Create a CloudWatch client with additional configuration
// svc := cloudwatch.New(mySession, aws.NewConfig().WithRegion("us-west-2"))
func New(p client.ConfigProvider, cfgs ...*aws.Config) *CloudWatch {
c := p.ClientConfig(ServiceName, cfgs...)
return newClient(*c.Config, c.Handlers, c.Endpoint, c.SigningRegion)
}
// newClient creates, initializes and returns a new service client instance.
func newClient(cfg aws.Config, handlers request.Handlers, endpoint, signingRegion string) *CloudWatch {
svc := &CloudWatch{
Client: client.New(
cfg,
metadata.ClientInfo{
ServiceName: ServiceName,
SigningRegion: signingRegion,
Endpoint: endpoint,
APIVersion: "2010-08-01",
},
handlers,
),
}
// Handlers
svc.Handlers.Sign.PushBack(v4.Sign)
svc.Handlers.Build.PushBack(query.Build)
svc.Handlers.Unmarshal.PushBack(query.Unmarshal)
svc.Handlers.UnmarshalMeta.PushBack(query.UnmarshalMeta)
svc.Handlers.UnmarshalError.PushBack(query.UnmarshalError)
// Run custom client initialization if present
if initClient != nil {
initClient(svc.Client)
}
return svc
}
// newRequest creates a new request for a CloudWatch operation and runs any
// custom request initialization.
func (c *CloudWatch) newRequest(op *request.Operation, params, data interface{}) *request.Request {
req := c.NewRequest(op, params, data)
// Run custom request initialization if present
if initRequest != nil {
initRequest(req)
}
return req
}
File diff suppressed because it is too large Load Diff
@@ -1,35 +0,0 @@
package ec2_test
import (
"io/ioutil"
"net/url"
"testing"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/awstesting/unit"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/stretchr/testify/assert"
)
func TestCopySnapshotPresignedURL(t *testing.T) {
svc := ec2.New(unit.Session, &aws.Config{Region: aws.String("us-west-2")})
assert.NotPanics(t, func() {
// Doesn't panic on nil input
req, _ := svc.CopySnapshotRequest(nil)
req.Sign()
})
req, _ := svc.CopySnapshotRequest(&ec2.CopySnapshotInput{
SourceRegion: aws.String("us-west-1"),
SourceSnapshotId: aws.String("snap-id"),
})
req.Sign()
b, _ := ioutil.ReadAll(req.HTTPRequest.Body)
q, _ := url.ParseQuery(string(b))
u, _ := url.QueryUnescape(q.Get("PresignedUrl"))
assert.Equal(t, "us-west-2", q.Get("DestinationRegion"))
assert.Equal(t, "us-west-1", q.Get("SourceRegion"))
assert.Regexp(t, `^https://ec2\.us-west-1\.amazonaws\.com/.+&DestinationRegion=us-west-2`, u)
}
File diff suppressed because it is too large Load Diff
@@ -1,24 +0,0 @@
# Compiled Object files, Static and Dynamic libs (Shared Objects)
*.o
*.a
*.so
# Folders
_obj
_test
# Architecture specific extensions/prefixes
*.[568vq]
[568vq].out
*.cgo1.go
*.cgo2.c
_cgo_defun.c
_cgo_gotypes.go
_cgo_export.*
_testmain.go
*.exe
src
-8
View File
@@ -1,8 +0,0 @@
language: go
go:
- 1.5.3
- tip
notifications:
email:
- ionathan@gmail.com
- marcosnils@gmail.com
-3
View File
@@ -1,3 +0,0 @@
test:
go get -v -d -t ./...
go test -v
-444
View File
@@ -1,444 +0,0 @@
[![Build Status](https://img.shields.io/travis/franela/goreq/master.svg)](https://travis-ci.org/franela/goreq)
[![GoDoc](https://godoc.org/github.com/franela/goreq?status.svg)](https://godoc.org/github.com/franela/goreq)
GoReq
=======
Simple and sane HTTP request library for Go language.
**Table of Contents**
- [Why GoReq?](#user-content-why-goreq)
- [How do I install it?](#user-content-how-do-i-install-it)
- [What can I do with it?](#user-content-what-can-i-do-with-it)
- [Making requests with different methods](#user-content-making-requests-with-different-methods)
- [GET](#user-content-get)
- [Tags](#user-content-tags)
- [POST](#user-content-post)
- [Sending payloads in the Body](#user-content-sending-payloads-in-the-body)
- [Specifiying request headers](#user-content-specifiying-request-headers)
- [Sending Cookies](#cookie-support)
- [Setting timeouts](#user-content-setting-timeouts)
- [Using the Response and Error](#user-content-using-the-response-and-error)
- [Receiving JSON](#user-content-receiving-json)
- [Sending/Receiving Compressed Payloads](#user-content-sendingreceiving-compressed-payloads)
- [Using gzip compression:](#user-content-using-gzip-compression)
- [Using deflate compression:](#user-content-using-deflate-compression)
- [Using compressed responses:](#user-content-using-compressed-responses)
- [Proxy](#proxy)
- [Debugging requests](#debug)
- [Getting raw Request & Response](#getting-raw-request--response)
- [TODO:](#user-content-todo)
Why GoReq?
==========
Go has very nice native libraries that allows you to do lots of cool things. But sometimes those libraries are too low level, which means that to do a simple thing, like an HTTP Request, it takes some time. And if you want to do something as simple as adding a timeout to a request, you will end up writing several lines of code.
This is why we think GoReq is useful. Because you can do all your HTTP requests in a very simple and comprehensive way, while enabling you to do more advanced stuff by giving you access to the native API.
How do I install it?
====================
```bash
go get github.com/franela/goreq
```
What can I do with it?
======================
## Making requests with different methods
#### GET
```go
res, err := goreq.Request{ Uri: "http://www.google.com" }.Do()
```
GoReq default method is GET.
You can also set value to GET method easily
```go
type Item struct {
Limit int
Skip int
Fields string
}
item := Item {
Limit: 3,
Skip: 5,
Fields: "Value",
}
res, err := goreq.Request{
Uri: "http://localhost:3000/",
QueryString: item,
}.Do()
```
The sample above will send `http://localhost:3000/?limit=3&skip=5&fields=Value`
Alternatively the `url` tag can be used in struct fields to customize encoding properties
```go
type Item struct {
TheLimit int `url:"the_limit"`
TheSkip string `url:"the_skip,omitempty"`
TheFields string `url:"-"`
}
item := Item {
TheLimit: 3,
TheSkip: "",
TheFields: "Value",
}
res, err := goreq.Request{
Uri: "http://localhost:3000/",
QueryString: item,
}.Do()
```
The sample above will send `http://localhost:3000/?the_limit=3`
QueryString also support url.Values
```go
item := url.Values{}
item.Set("Limit", 3)
item.Add("Field", "somefield")
item.Add("Field", "someotherfield")
res, err := goreq.Request{
Uri: "http://localhost:3000/",
QueryString: item,
}.Do()
```
The sample above will send `http://localhost:3000/?limit=3&field=somefield&field=someotherfield`
### Tags
Struct field `url` tag is mainly used as the request parameter name.
Tags can be comma separated multiple values, 1st value is for naming and rest has special meanings.
- special tag for 1st value
- `-`: value is ignored if set this
- special tag for rest 2nd value
- `omitempty`: zero-value is ignored if set this
- `squash`: the fields of embedded struct is used for parameter
#### Tag Examples
```go
type Place struct {
Country string `url:"country"`
City string `url:"city"`
ZipCode string `url:"zipcode,omitempty"`
}
type Person struct {
Place `url:",squash"`
FirstName string `url:"first_name"`
LastName string `url:"last_name"`
Age string `url:"age,omitempty"`
Password string `url:"-"`
}
johnbull := Person{
Place: Place{ // squash the embedded struct value
Country: "UK",
City: "London",
ZipCode: "SW1",
},
FirstName: "John",
LastName: "Doe",
Age: "35",
Password: "my-secret", // ignored for parameter
}
goreq.Request{
Uri: "http://localhost/",
QueryString: johnbull,
}.Do()
// => `http://localhost/?first_name=John&last_name=Doe&age=35&country=UK&city=London&zip_code=SW1`
// age and zipcode will be ignored because of `omitempty`
// but firstname isn't.
samurai := Person{
Place: Place{ // squash the embedded struct value
Country: "Japan",
City: "Tokyo",
},
LastName: "Yagyu",
}
goreq.Request{
Uri: "http://localhost/",
QueryString: samurai,
}.Do()
// => `http://localhost/?first_name=&last_name=yagyu&country=Japan&city=Tokyo`
```
#### POST
```go
res, err := goreq.Request{ Method: "POST", Uri: "http://www.google.com" }.Do()
```
## Sending payloads in the Body
You can send ```string```, ```Reader``` or ```interface{}``` in the body. The first two will be sent as text. The last one will be marshalled to JSON, if possible.
```go
type Item struct {
Id int
Name string
}
item := Item{ Id: 1111, Name: "foobar" }
res, err := goreq.Request{
Method: "POST",
Uri: "http://www.google.com",
Body: item,
}.Do()
```
## Specifiying request headers
We think that most of the times the request headers that you use are: ```Host```, ```Content-Type```, ```Accept``` and ```User-Agent```. This is why we decided to make it very easy to set these headers.
```go
res, err := goreq.Request{
Uri: "http://www.google.com",
Host: "foobar.com",
Accept: "application/json",
ContentType: "application/json",
UserAgent: "goreq",
}.Do()
```
But sometimes you need to set other headers. You can still do it.
```go
req := goreq.Request{ Uri: "http://www.google.com" }
req.AddHeader("X-Custom", "somevalue")
req.Do()
```
Alternatively you can use the `WithHeader` function to keep the syntax short
```go
res, err = goreq.Request{ Uri: "http://www.google.com" }.WithHeader("X-Custom", "somevalue").Do()
```
## Cookie support
Cookies can be either set at the request level by sending a [CookieJar](http://golang.org/pkg/net/http/cookiejar/) in the `CookieJar` request field
or you can use goreq's one-liner WithCookie method as shown below
```go
res, err := goreq.Request{
Uri: "http://www.google.com",
}.
WithCookie(&http.Cookie{Name: "c1", Value: "v1"}).
Do()
```
## Setting timeouts
GoReq supports 2 kind of timeouts. A general connection timeout and a request specific one. By default the connection timeout is of 1 second. There is no default for request timeout, which means it will wait forever.
You can change the connection timeout doing:
```go
goreq.SetConnectTimeout(100 * time.Millisecond)
```
And specify the request timeout doing:
```go
res, err := goreq.Request{
Uri: "http://www.google.com",
Timeout: 500 * time.Millisecond,
}.Do()
```
## Using the Response and Error
GoReq will always return 2 values: a ```Response``` and an ```Error```.
If ```Error``` is not ```nil``` it means that an error happened while doing the request and you shouldn't use the ```Response``` in any way.
You can check what happened by getting the error message:
```go
fmt.Println(err.Error())
```
And to make it easy to know if it was a timeout error, you can ask the error or return it:
```go
if serr, ok := err.(*goreq.Error); ok {
if serr.Timeout() {
...
}
}
return err
```
If you don't get an error, you can safely use the ```Response```.
```go
res.Uri // return final URL location of the response (fulfilled after redirect was made)
res.StatusCode // return the status code of the response
res.Body // gives you access to the body
res.Body.ToString() // will return the body as a string
res.Header.Get("Content-Type") // gives you access to all the response headers
```
Remember that you should **always** close `res.Body` if it's not `nil`
## Receiving JSON
GoReq will help you to receive and unmarshal JSON.
```go
type Item struct {
Id int
Name string
}
var item Item
res.Body.FromJsonTo(&item)
```
## Sending/Receiving Compressed Payloads
GoReq supports gzip, deflate and zlib compression of requests' body and transparent decompression of responses provided they have a correct `Content-Encoding` header.
#####Using gzip compression:
```go
res, err := goreq.Request{
Method: "POST",
Uri: "http://www.google.com",
Body: item,
Compression: goreq.Gzip(),
}.Do()
```
#####Using deflate/zlib compression:
```go
res, err := goreq.Request{
Method: "POST",
Uri: "http://www.google.com",
Body: item,
Compression: goreq.Deflate(),
}.Do()
```
#####Using compressed responses:
If servers replies a correct and matching `Content-Encoding` header (gzip requires `Content-Encoding: gzip` and deflate `Content-Encoding: deflate`) goreq transparently decompresses the response so the previous example should always work:
```go
type Item struct {
Id int
Name string
}
res, err := goreq.Request{
Method: "POST",
Uri: "http://www.google.com",
Body: item,
Compression: goreq.Gzip(),
}.Do()
var item Item
res.Body.FromJsonTo(&item)
```
If no `Content-Encoding` header is replied by the server GoReq will return the crude response.
## Proxy
If you need to use a proxy for your requests GoReq supports the standard `http_proxy` env variable as well as manually setting the proxy for each request
```go
res, err := goreq.Request{
Method: "GET",
Proxy: "http://myproxy:myproxyport",
Uri: "http://www.google.com",
}.Do()
```
### Proxy basic auth is also supported
```go
res, err := goreq.Request{
Method: "GET",
Proxy: "http://user:pass@myproxy:myproxyport",
Uri: "http://www.google.com",
}.Do()
```
## Debug
If you need to debug your http requests, it can print the http request detail.
```go
res, err := goreq.Request{
Method: "GET",
Uri: "http://www.google.com",
Compression: goreq.Gzip(),
ShowDebug: true,
}.Do()
fmt.Println(res, err)
```
and it will print the log:
```
GET / HTTP/1.1
Host: www.google.com
Accept:
Accept-Encoding: gzip
Content-Encoding: gzip
Content-Type:
```
### Getting raw Request & Response
To get the Request:
```go
req := goreq.Request{
Host: "foobar.com",
}
//req.Request will return a new instance of an http.Request so you can safely use it for something else
request, _ := req.NewRequest()
```
To get the Response:
```go
res, err := goreq.Request{
Method: "GET",
Uri: "http://www.google.com",
Compression: goreq.Gzip(),
ShowDebug: true,
}.Do()
// res.Response will contain the original http.Response structure
fmt.Println(res.Response, err)
```
TODO:
-----
We do have a couple of [issues](https://github.com/franela/goreq/issues) pending we'll be addressing soon. But feel free to
contribute and send us PRs (with tests please :smile:).
-491
View File
@@ -1,491 +0,0 @@
package goreq
import (
"bufio"
"bytes"
"compress/gzip"
"compress/zlib"
"crypto/tls"
"encoding/json"
"errors"
"fmt"
"io"
"io/ioutil"
"log"
"net"
"net/http"
"net/http/httputil"
"net/url"
"reflect"
"strings"
"time"
)
type itimeout interface {
Timeout() bool
}
type Request struct {
headers []headerTuple
cookies []*http.Cookie
Method string
Uri string
Body interface{}
QueryString interface{}
Timeout time.Duration
ContentType string
Accept string
Host string
UserAgent string
Insecure bool
MaxRedirects int
RedirectHeaders bool
Proxy string
Compression *compression
BasicAuthUsername string
BasicAuthPassword string
CookieJar http.CookieJar
ShowDebug bool
OnBeforeRequest func(goreq *Request, httpreq *http.Request)
}
type compression struct {
writer func(buffer io.Writer) (io.WriteCloser, error)
reader func(buffer io.Reader) (io.ReadCloser, error)
ContentEncoding string
}
type Response struct {
*http.Response
Uri string
Body *Body
req *http.Request
}
func (r Response) CancelRequest() {
cancelRequest(DefaultTransport, r.req)
}
func cancelRequest(transport interface{}, r *http.Request) {
if tp, ok := transport.(transportRequestCanceler); ok {
tp.CancelRequest(r)
}
}
type headerTuple struct {
name string
value string
}
type Body struct {
reader io.ReadCloser
compressedReader io.ReadCloser
}
type Error struct {
timeout bool
Err error
}
type transportRequestCanceler interface {
CancelRequest(*http.Request)
}
func (e *Error) Timeout() bool {
return e.timeout
}
func (e *Error) Error() string {
return e.Err.Error()
}
func (b *Body) Read(p []byte) (int, error) {
if b.compressedReader != nil {
return b.compressedReader.Read(p)
}
return b.reader.Read(p)
}
func (b *Body) Close() error {
err := b.reader.Close()
if b.compressedReader != nil {
return b.compressedReader.Close()
}
return err
}
func (b *Body) FromJsonTo(o interface{}) error {
return json.NewDecoder(b).Decode(o)
}
func (b *Body) ToString() (string, error) {
body, err := ioutil.ReadAll(b)
if err != nil {
return "", err
}
return string(body), nil
}
func Gzip() *compression {
reader := func(buffer io.Reader) (io.ReadCloser, error) {
return gzip.NewReader(buffer)
}
writer := func(buffer io.Writer) (io.WriteCloser, error) {
return gzip.NewWriter(buffer), nil
}
return &compression{writer: writer, reader: reader, ContentEncoding: "gzip"}
}
func Deflate() *compression {
reader := func(buffer io.Reader) (io.ReadCloser, error) {
return zlib.NewReader(buffer)
}
writer := func(buffer io.Writer) (io.WriteCloser, error) {
return zlib.NewWriter(buffer), nil
}
return &compression{writer: writer, reader: reader, ContentEncoding: "deflate"}
}
func Zlib() *compression {
return Deflate()
}
func paramParse(query interface{}) (string, error) {
switch query.(type) {
case url.Values:
return query.(url.Values).Encode(), nil
case *url.Values:
return query.(*url.Values).Encode(), nil
default:
var v = &url.Values{}
err := paramParseStruct(v, query)
return v.Encode(), err
}
}
func paramParseStruct(v *url.Values, query interface{}) error {
var (
s = reflect.ValueOf(query)
t = reflect.TypeOf(query)
)
for t.Kind() == reflect.Ptr || t.Kind() == reflect.Interface {
s = s.Elem()
t = s.Type()
}
if t.Kind() != reflect.Struct {
return errors.New("Can not parse QueryString.")
}
for i := 0; i < t.NumField(); i++ {
var name string
field := s.Field(i)
typeField := t.Field(i)
if !field.CanInterface() {
continue
}
urlTag := typeField.Tag.Get("url")
if urlTag == "-" {
continue
}
name, opts := parseTag(urlTag)
var omitEmpty, squash bool
omitEmpty = opts.Contains("omitempty")
squash = opts.Contains("squash")
if squash {
err := paramParseStruct(v, field.Interface())
if err != nil {
return err
}
continue
}
if urlTag == "" {
name = strings.ToLower(typeField.Name)
}
if val := fmt.Sprintf("%v", field.Interface()); !(omitEmpty && len(val) == 0) {
v.Add(name, val)
}
}
return nil
}
func prepareRequestBody(b interface{}) (io.Reader, error) {
switch b.(type) {
case string:
// treat is as text
return strings.NewReader(b.(string)), nil
case io.Reader:
// treat is as text
return b.(io.Reader), nil
case []byte:
//treat as byte array
return bytes.NewReader(b.([]byte)), nil
case nil:
return nil, nil
default:
// try to jsonify it
j, err := json.Marshal(b)
if err == nil {
return bytes.NewReader(j), nil
}
return nil, err
}
}
var DefaultDialer = &net.Dialer{Timeout: 1000 * time.Millisecond}
var DefaultTransport http.RoundTripper = &http.Transport{Dial: DefaultDialer.Dial, Proxy: http.ProxyFromEnvironment}
var DefaultClient = &http.Client{Transport: DefaultTransport}
var proxyTransport http.RoundTripper
var proxyClient *http.Client
func SetConnectTimeout(duration time.Duration) {
DefaultDialer.Timeout = duration
}
func (r *Request) AddHeader(name string, value string) {
if r.headers == nil {
r.headers = []headerTuple{}
}
r.headers = append(r.headers, headerTuple{name: name, value: value})
}
func (r Request) WithHeader(name string, value string) Request {
r.AddHeader(name, value)
return r
}
func (r *Request) AddCookie(c *http.Cookie) {
r.cookies = append(r.cookies, c)
}
func (r Request) WithCookie(c *http.Cookie) Request {
r.AddCookie(c)
return r
}
func (r Request) Do() (*Response, error) {
var client = DefaultClient
var transport = DefaultTransport
var resUri string
var redirectFailed bool
r.Method = valueOrDefault(r.Method, "GET")
// use a client with a cookie jar if necessary. We create a new client not
// to modify the default one.
if r.CookieJar != nil {
client = &http.Client{
Transport: transport,
Jar: r.CookieJar,
}
}
if r.Proxy != "" {
proxyUrl, err := url.Parse(r.Proxy)
if err != nil {
// proxy address is in a wrong format
return nil, &Error{Err: err}
}
//If jar is specified new client needs to be built
if proxyTransport == nil || client.Jar != nil {
proxyTransport = &http.Transport{Dial: DefaultDialer.Dial, Proxy: http.ProxyURL(proxyUrl)}
proxyClient = &http.Client{Transport: proxyTransport, Jar: client.Jar}
} else if proxyTransport, ok := proxyTransport.(*http.Transport); ok {
proxyTransport.Proxy = http.ProxyURL(proxyUrl)
}
transport = proxyTransport
client = proxyClient
}
client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
if len(via) > r.MaxRedirects {
redirectFailed = true
return errors.New("Error redirecting. MaxRedirects reached")
}
resUri = req.URL.String()
//By default Golang will not redirect request headers
// https://code.google.com/p/go/issues/detail?id=4800&q=request%20header
if r.RedirectHeaders {
for key, val := range via[0].Header {
req.Header[key] = val
}
}
return nil
}
if transport, ok := transport.(*http.Transport); ok {
if r.Insecure {
if transport.TLSClientConfig != nil {
transport.TLSClientConfig.InsecureSkipVerify = true
} else {
transport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
}
} else if transport.TLSClientConfig != nil {
// the default TLS client (when transport.TLSClientConfig==nil) is
// already set to verify, so do nothing in that case
transport.TLSClientConfig.InsecureSkipVerify = false
}
}
req, err := r.NewRequest()
if err != nil {
// we couldn't parse the URL.
return nil, &Error{Err: err}
}
timeout := false
if r.Timeout > 0 {
client.Timeout = r.Timeout
}
if r.ShowDebug {
dump, err := httputil.DumpRequest(req, true)
if err != nil {
log.Println(err)
}
log.Println(string(dump))
}
if r.OnBeforeRequest != nil {
r.OnBeforeRequest(&r, req)
}
res, err := client.Do(req)
if err != nil {
if !timeout {
if t, ok := err.(itimeout); ok {
timeout = t.Timeout()
}
if ue, ok := err.(*url.Error); ok {
if t, ok := ue.Err.(itimeout); ok {
timeout = t.Timeout()
}
}
}
var response *Response
//If redirect fails we still want to return response data
if redirectFailed {
if res != nil {
response = &Response{res, resUri, &Body{reader: res.Body}, req}
} else {
response = &Response{res, resUri, nil, req}
}
}
//If redirect fails and we haven't set a redirect count we shouldn't return an error
if redirectFailed && r.MaxRedirects == 0 {
return response, nil
}
return response, &Error{timeout: timeout, Err: err}
}
if r.Compression != nil && strings.Contains(res.Header.Get("Content-Encoding"), r.Compression.ContentEncoding) {
compressedReader, err := r.Compression.reader(res.Body)
if err != nil {
return nil, &Error{Err: err}
}
return &Response{res, resUri, &Body{reader: res.Body, compressedReader: compressedReader}, req}, nil
}
return &Response{res, resUri, &Body{reader: res.Body}, req}, nil
}
func (r Request) addHeaders(headersMap http.Header) {
if len(r.UserAgent) > 0 {
headersMap.Add("User-Agent", r.UserAgent)
}
if r.Accept != "" {
headersMap.Add("Accept", r.Accept)
}
if r.ContentType != "" {
headersMap.Add("Content-Type", r.ContentType)
}
}
func (r Request) NewRequest() (*http.Request, error) {
b, e := prepareRequestBody(r.Body)
if e != nil {
// there was a problem marshaling the body
return nil, &Error{Err: e}
}
if r.QueryString != nil {
param, e := paramParse(r.QueryString)
if e != nil {
return nil, &Error{Err: e}
}
r.Uri = r.Uri + "?" + param
}
var bodyReader io.Reader
if b != nil && r.Compression != nil {
buffer := bytes.NewBuffer([]byte{})
readBuffer := bufio.NewReader(b)
writer, err := r.Compression.writer(buffer)
if err != nil {
return nil, &Error{Err: err}
}
_, e = readBuffer.WriteTo(writer)
writer.Close()
if e != nil {
return nil, &Error{Err: e}
}
bodyReader = buffer
} else {
bodyReader = b
}
req, err := http.NewRequest(r.Method, r.Uri, bodyReader)
if err != nil {
return nil, err
}
// add headers to the request
req.Host = r.Host
r.addHeaders(req.Header)
if r.Compression != nil {
req.Header.Add("Content-Encoding", r.Compression.ContentEncoding)
req.Header.Add("Accept-Encoding", r.Compression.ContentEncoding)
}
if r.headers != nil {
for _, header := range r.headers {
req.Header.Add(header.name, header.value)
}
}
//use basic auth if required
if r.BasicAuthUsername != "" {
req.SetBasicAuth(r.BasicAuthUsername, r.BasicAuthPassword)
}
for _, c := range r.cookies {
req.AddCookie(c)
}
return req, nil
}
// Return value if nonempty, def otherwise.
func valueOrDefault(value, def string) string {
if value != "" {
return value
}
return def
}
-64
View File
@@ -1,64 +0,0 @@
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package goreq
import (
"strings"
"unicode"
)
// tagOptions is the string following a comma in a struct field's "json"
// tag, or the empty string. It does not include the leading comma.
type tagOptions string
// parseTag splits a struct field's json tag into its name and
// comma-separated options.
func parseTag(tag string) (string, tagOptions) {
if idx := strings.Index(tag, ","); idx != -1 {
return tag[:idx], tagOptions(tag[idx+1:])
}
return tag, tagOptions("")
}
// Contains reports whether a comma-separated list of options
// contains a particular substr flag. substr must be surrounded by a
// string boundary or commas.
func (o tagOptions) Contains(optionName string) bool {
if len(o) == 0 {
return false
}
s := string(o)
for s != "" {
var next string
i := strings.Index(s, ",")
if i >= 0 {
s, next = s[:i], s[i+1:]
}
if s == optionName {
return true
}
s = next
}
return false
}
func isValidTag(s string) bool {
if s == "" {
return false
}
for _, c := range s {
switch {
case strings.ContainsRune("!#$%&()*+-./:<=>?@[]^_{|}~ ", c):
// Backslash and quote chars are reserved, but
// otherwise any punctuation chars are allowed
// in a tag name.
default:
if !unicode.IsLetter(c) && !unicode.IsDigit(c) {
return false
}
}
}
return true
}
File diff suppressed because it is too large Load Diff
-512
View File
@@ -1,512 +0,0 @@
// Copyright 2014 Unknwon
//
// Licensed 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.
package ini
import (
"fmt"
"strings"
"testing"
"time"
. "github.com/smartystreets/goconvey/convey"
)
func Test_Version(t *testing.T) {
Convey("Get version", t, func() {
So(Version(), ShouldEqual, _VERSION)
})
}
const _CONF_DATA = `
; Package name
NAME = ini
; Package version
VERSION = v1
; Package import path
IMPORT_PATH = gopkg.in/%(NAME)s.%(VERSION)s
# Information about package author
# Bio can be written in multiple lines.
[author]
NAME = Unknwon # Succeeding comment
E-MAIL = fake@localhost
GITHUB = https://github.com/%(NAME)s
BIO = """Gopher.
Coding addict.
Good man.
""" # Succeeding comment
[package]
CLONE_URL = https://%(IMPORT_PATH)s
[package.sub]
UNUSED_KEY = should be deleted
[features]
-: Support read/write comments of keys and sections
-: Support auto-increment of key names
-: Support load multiple files to overwrite key values
[types]
STRING = str
BOOL = true
BOOL_FALSE = false
FLOAT64 = 1.25
INT = 10
TIME = 2015-01-01T20:17:05Z
DURATION = 2h45m
UINT = 3
[array]
STRINGS = en, zh, de
FLOAT64S = 1.1, 2.2, 3.3
INTS = 1, 2, 3
UINTS = 1, 2, 3
TIMES = 2015-01-01T20:17:05Z,2015-01-01T20:17:05Z,2015-01-01T20:17:05Z
[note]
empty_lines = next line is empty\
[advance]
value with quotes = "some value"
value quote2 again = 'some value'
true = """"2+3=5""""
"1+1=2" = true
"""6+1=7""" = true
"""` + "`" + `5+5` + "`" + `""" = 10
""""6+6"""" = 12
` + "`" + `7-2=4` + "`" + ` = false
ADDRESS = ` + "`" + `404 road,
NotFound, State, 50000` + "`" + `
two_lines = how about \
continuation lines?
lots_of_lines = 1 \
2 \
3 \
4 \
`
func Test_Load(t *testing.T) {
Convey("Load from data sources", t, func() {
Convey("Load with empty data", func() {
So(Empty(), ShouldNotBeNil)
})
Convey("Load with multiple data sources", func() {
cfg, err := Load([]byte(_CONF_DATA), "testdata/conf.ini")
So(err, ShouldBeNil)
So(cfg, ShouldNotBeNil)
})
})
Convey("Bad load process", t, func() {
Convey("Load from invalid data sources", func() {
_, err := Load(_CONF_DATA)
So(err, ShouldNotBeNil)
_, err = Load("testdata/404.ini")
So(err, ShouldNotBeNil)
_, err = Load(1)
So(err, ShouldNotBeNil)
_, err = Load([]byte(""), 1)
So(err, ShouldNotBeNil)
})
Convey("Load with empty section name", func() {
_, err := Load([]byte("[]"))
So(err, ShouldNotBeNil)
})
Convey("Load with bad keys", func() {
_, err := Load([]byte(`"""name`))
So(err, ShouldNotBeNil)
_, err = Load([]byte(`"""name"""`))
So(err, ShouldNotBeNil)
_, err = Load([]byte(`""=1`))
So(err, ShouldNotBeNil)
_, err = Load([]byte(`=`))
So(err, ShouldNotBeNil)
_, err = Load([]byte(`name`))
So(err, ShouldNotBeNil)
})
Convey("Load with bad values", func() {
_, err := Load([]byte(`name="""Unknwon`))
So(err, ShouldNotBeNil)
_, err = Load([]byte(`key = "value`))
So(err, ShouldNotBeNil)
})
})
}
func Test_Values(t *testing.T) {
Convey("Test getting and setting values", t, func() {
cfg, err := Load([]byte(_CONF_DATA), "testdata/conf.ini")
So(err, ShouldBeNil)
So(cfg, ShouldNotBeNil)
Convey("Get values in default section", func() {
sec := cfg.Section("")
So(sec, ShouldNotBeNil)
So(sec.Key("NAME").Value(), ShouldEqual, "ini")
So(sec.Key("NAME").String(), ShouldEqual, "ini")
So(sec.Key("NAME").Validate(func(in string) string {
return in
}), ShouldEqual, "ini")
So(sec.Key("NAME").Comment, ShouldEqual, "; Package name")
So(sec.Key("IMPORT_PATH").String(), ShouldEqual, "gopkg.in/ini.v1")
})
Convey("Get values in non-default section", func() {
sec := cfg.Section("author")
So(sec, ShouldNotBeNil)
So(sec.Key("NAME").String(), ShouldEqual, "Unknwon")
So(sec.Key("GITHUB").String(), ShouldEqual, "https://github.com/Unknwon")
sec = cfg.Section("package")
So(sec, ShouldNotBeNil)
So(sec.Key("CLONE_URL").String(), ShouldEqual, "https://gopkg.in/ini.v1")
})
Convey("Get auto-increment key names", func() {
keys := cfg.Section("features").Keys()
for i, k := range keys {
So(k.Name(), ShouldEqual, fmt.Sprintf("#%d", i+1))
}
})
Convey("Get overwrite value", func() {
So(cfg.Section("author").Key("E-MAIL").String(), ShouldEqual, "u@gogs.io")
})
Convey("Get sections", func() {
sections := cfg.Sections()
for i, name := range []string{DEFAULT_SECTION, "author", "package", "package.sub", "features", "types", "array", "note", "advance"} {
So(sections[i].Name(), ShouldEqual, name)
}
})
Convey("Get parent section value", func() {
So(cfg.Section("package.sub").Key("CLONE_URL").String(), ShouldEqual, "https://gopkg.in/ini.v1")
})
Convey("Get multiple line value", func() {
So(cfg.Section("author").Key("BIO").String(), ShouldEqual, "Gopher.\nCoding addict.\nGood man.\n")
})
Convey("Get values with type", func() {
sec := cfg.Section("types")
v1, err := sec.Key("BOOL").Bool()
So(err, ShouldBeNil)
So(v1, ShouldBeTrue)
v1, err = sec.Key("BOOL_FALSE").Bool()
So(err, ShouldBeNil)
So(v1, ShouldBeFalse)
v2, err := sec.Key("FLOAT64").Float64()
So(err, ShouldBeNil)
So(v2, ShouldEqual, 1.25)
v3, err := sec.Key("INT").Int()
So(err, ShouldBeNil)
So(v3, ShouldEqual, 10)
v4, err := sec.Key("INT").Int64()
So(err, ShouldBeNil)
So(v4, ShouldEqual, 10)
v5, err := sec.Key("UINT").Uint()
So(err, ShouldBeNil)
So(v5, ShouldEqual, 3)
v6, err := sec.Key("UINT").Uint64()
So(err, ShouldBeNil)
So(v6, ShouldEqual, 3)
t, err := time.Parse(time.RFC3339, "2015-01-01T20:17:05Z")
So(err, ShouldBeNil)
v7, err := sec.Key("TIME").Time()
So(err, ShouldBeNil)
So(v7.String(), ShouldEqual, t.String())
Convey("Must get values with type", func() {
So(sec.Key("STRING").MustString("404"), ShouldEqual, "str")
So(sec.Key("BOOL").MustBool(), ShouldBeTrue)
So(sec.Key("FLOAT64").MustFloat64(), ShouldEqual, 1.25)
So(sec.Key("INT").MustInt(), ShouldEqual, 10)
So(sec.Key("INT").MustInt64(), ShouldEqual, 10)
So(sec.Key("UINT").MustUint(), ShouldEqual, 3)
So(sec.Key("UINT").MustUint64(), ShouldEqual, 3)
So(sec.Key("TIME").MustTime().String(), ShouldEqual, t.String())
dur, err := time.ParseDuration("2h45m")
So(err, ShouldBeNil)
So(sec.Key("DURATION").MustDuration().Seconds(), ShouldEqual, dur.Seconds())
Convey("Must get values with default value", func() {
So(sec.Key("STRING_404").MustString("404"), ShouldEqual, "404")
So(sec.Key("BOOL_404").MustBool(true), ShouldBeTrue)
So(sec.Key("FLOAT64_404").MustFloat64(2.5), ShouldEqual, 2.5)
So(sec.Key("INT_404").MustInt(15), ShouldEqual, 15)
So(sec.Key("INT_404").MustInt64(15), ShouldEqual, 15)
So(sec.Key("UINT_404").MustUint(6), ShouldEqual, 6)
So(sec.Key("UINT_404").MustUint64(6), ShouldEqual, 6)
t, err := time.Parse(time.RFC3339, "2014-01-01T20:17:05Z")
So(err, ShouldBeNil)
So(sec.Key("TIME_404").MustTime(t).String(), ShouldEqual, t.String())
So(sec.Key("DURATION_404").MustDuration(dur).Seconds(), ShouldEqual, dur.Seconds())
})
})
})
Convey("Get value with candidates", func() {
sec := cfg.Section("types")
So(sec.Key("STRING").In("", []string{"str", "arr", "types"}), ShouldEqual, "str")
So(sec.Key("FLOAT64").InFloat64(0, []float64{1.25, 2.5, 3.75}), ShouldEqual, 1.25)
So(sec.Key("INT").InInt(0, []int{10, 20, 30}), ShouldEqual, 10)
So(sec.Key("INT").InInt64(0, []int64{10, 20, 30}), ShouldEqual, 10)
So(sec.Key("UINT").InUint(0, []uint{3, 6, 9}), ShouldEqual, 3)
So(sec.Key("UINT").InUint64(0, []uint64{3, 6, 9}), ShouldEqual, 3)
zt, err := time.Parse(time.RFC3339, "0001-01-01T01:00:00Z")
So(err, ShouldBeNil)
t, err := time.Parse(time.RFC3339, "2015-01-01T20:17:05Z")
So(err, ShouldBeNil)
So(sec.Key("TIME").InTime(zt, []time.Time{t, time.Now(), time.Now().Add(1 * time.Second)}).String(), ShouldEqual, t.String())
Convey("Get value with candidates and default value", func() {
So(sec.Key("STRING_404").In("str", []string{"str", "arr", "types"}), ShouldEqual, "str")
So(sec.Key("FLOAT64_404").InFloat64(1.25, []float64{1.25, 2.5, 3.75}), ShouldEqual, 1.25)
So(sec.Key("INT_404").InInt(10, []int{10, 20, 30}), ShouldEqual, 10)
So(sec.Key("INT64_404").InInt64(10, []int64{10, 20, 30}), ShouldEqual, 10)
So(sec.Key("UINT_404").InUint(3, []uint{3, 6, 9}), ShouldEqual, 3)
So(sec.Key("UINT_404").InUint64(3, []uint64{3, 6, 9}), ShouldEqual, 3)
So(sec.Key("TIME_404").InTime(t, []time.Time{time.Now(), time.Now(), time.Now().Add(1 * time.Second)}).String(), ShouldEqual, t.String())
})
})
Convey("Get values in range", func() {
sec := cfg.Section("types")
So(sec.Key("FLOAT64").RangeFloat64(0, 1, 2), ShouldEqual, 1.25)
So(sec.Key("INT").RangeInt(0, 10, 20), ShouldEqual, 10)
So(sec.Key("INT").RangeInt64(0, 10, 20), ShouldEqual, 10)
minT, err := time.Parse(time.RFC3339, "0001-01-01T01:00:00Z")
So(err, ShouldBeNil)
midT, err := time.Parse(time.RFC3339, "2013-01-01T01:00:00Z")
So(err, ShouldBeNil)
maxT, err := time.Parse(time.RFC3339, "9999-01-01T01:00:00Z")
So(err, ShouldBeNil)
t, err := time.Parse(time.RFC3339, "2015-01-01T20:17:05Z")
So(err, ShouldBeNil)
So(sec.Key("TIME").RangeTime(t, minT, maxT).String(), ShouldEqual, t.String())
Convey("Get value in range with default value", func() {
So(sec.Key("FLOAT64").RangeFloat64(5, 0, 1), ShouldEqual, 5)
So(sec.Key("INT").RangeInt(7, 0, 5), ShouldEqual, 7)
So(sec.Key("INT").RangeInt64(7, 0, 5), ShouldEqual, 7)
So(sec.Key("TIME").RangeTime(t, minT, midT).String(), ShouldEqual, t.String())
})
})
Convey("Get values into slice", func() {
sec := cfg.Section("array")
So(strings.Join(sec.Key("STRINGS").Strings(","), ","), ShouldEqual, "en,zh,de")
So(len(sec.Key("STRINGS_404").Strings(",")), ShouldEqual, 0)
vals1 := sec.Key("FLOAT64S").Float64s(",")
for i, v := range []float64{1.1, 2.2, 3.3} {
So(vals1[i], ShouldEqual, v)
}
vals2 := sec.Key("INTS").Ints(",")
for i, v := range []int{1, 2, 3} {
So(vals2[i], ShouldEqual, v)
}
vals3 := sec.Key("INTS").Int64s(",")
for i, v := range []int64{1, 2, 3} {
So(vals3[i], ShouldEqual, v)
}
vals4 := sec.Key("UINTS").Uints(",")
for i, v := range []uint{1, 2, 3} {
So(vals4[i], ShouldEqual, v)
}
vals5 := sec.Key("UINTS").Uint64s(",")
for i, v := range []uint64{1, 2, 3} {
So(vals5[i], ShouldEqual, v)
}
t, err := time.Parse(time.RFC3339, "2015-01-01T20:17:05Z")
So(err, ShouldBeNil)
vals6 := sec.Key("TIMES").Times(",")
for i, v := range []time.Time{t, t, t} {
So(vals6[i].String(), ShouldEqual, v.String())
}
})
Convey("Get key hash", func() {
cfg.Section("").KeysHash()
})
Convey("Set key value", func() {
k := cfg.Section("author").Key("NAME")
k.SetValue("无闻")
So(k.String(), ShouldEqual, "无闻")
})
Convey("Get key strings", func() {
So(strings.Join(cfg.Section("types").KeyStrings(), ","), ShouldEqual, "STRING,BOOL,BOOL_FALSE,FLOAT64,INT,TIME,DURATION,UINT")
})
Convey("Delete a key", func() {
cfg.Section("package.sub").DeleteKey("UNUSED_KEY")
_, err := cfg.Section("package.sub").GetKey("UNUSED_KEY")
So(err, ShouldNotBeNil)
})
Convey("Get section strings", func() {
So(strings.Join(cfg.SectionStrings(), ","), ShouldEqual, "DEFAULT,author,package,package.sub,features,types,array,note,advance")
})
Convey("Delete a section", func() {
cfg.DeleteSection("")
So(cfg.SectionStrings()[0], ShouldNotEqual, DEFAULT_SECTION)
})
Convey("Create new sections", func() {
cfg.NewSections("test", "test2")
_, err := cfg.GetSection("test")
So(err, ShouldBeNil)
_, err = cfg.GetSection("test2")
So(err, ShouldBeNil)
})
})
Convey("Test getting and setting bad values", t, func() {
cfg, err := Load([]byte(_CONF_DATA), "testdata/conf.ini")
So(err, ShouldBeNil)
So(cfg, ShouldNotBeNil)
Convey("Create new key with empty name", func() {
k, err := cfg.Section("").NewKey("", "")
So(err, ShouldNotBeNil)
So(k, ShouldBeNil)
})
Convey("Create new section with empty name", func() {
s, err := cfg.NewSection("")
So(err, ShouldNotBeNil)
So(s, ShouldBeNil)
})
Convey("Create new sections with empty name", func() {
So(cfg.NewSections(""), ShouldNotBeNil)
})
Convey("Get section that not exists", func() {
s, err := cfg.GetSection("404")
So(err, ShouldNotBeNil)
So(s, ShouldBeNil)
s = cfg.Section("404")
So(s, ShouldNotBeNil)
})
})
}
func Test_File_Append(t *testing.T) {
Convey("Append data sources", t, func() {
cfg, err := Load([]byte(""))
So(err, ShouldBeNil)
So(cfg, ShouldNotBeNil)
So(cfg.Append([]byte(""), []byte("")), ShouldBeNil)
Convey("Append bad data sources", func() {
So(cfg.Append(1), ShouldNotBeNil)
So(cfg.Append([]byte(""), 1), ShouldNotBeNil)
})
})
}
func Test_File_SaveTo(t *testing.T) {
Convey("Save file", t, func() {
cfg, err := Load([]byte(_CONF_DATA), "testdata/conf.ini")
So(err, ShouldBeNil)
So(cfg, ShouldNotBeNil)
cfg.Section("").Key("NAME").Comment = "Package name"
cfg.Section("author").Comment = `Information about package author
# Bio can be written in multiple lines.`
cfg.Section("advanced").Key("val w/ pound").SetValue("my#password")
So(cfg.SaveTo("testdata/conf_out.ini"), ShouldBeNil)
cfg.Section("author").Key("NAME").Comment = "This is author name"
So(cfg.SaveToIndent("testdata/conf_out.ini", "\t"), ShouldBeNil)
})
}
func Benchmark_Key_Value(b *testing.B) {
c, _ := Load([]byte(_CONF_DATA))
for i := 0; i < b.N; i++ {
c.Section("").Key("NAME").Value()
}
}
func Benchmark_Key_String(b *testing.B) {
c, _ := Load([]byte(_CONF_DATA))
for i := 0; i < b.N; i++ {
c.Section("").Key("NAME").String()
}
}
func Benchmark_Key_Value_NonBlock(b *testing.B) {
c, _ := Load([]byte(_CONF_DATA))
c.BlockMode = false
for i := 0; i < b.N; i++ {
c.Section("").Key("NAME").Value()
}
}
func Benchmark_Key_String_NonBlock(b *testing.B) {
c, _ := Load([]byte(_CONF_DATA))
c.BlockMode = false
for i := 0; i < b.N; i++ {
c.Section("").Key("NAME").String()
}
}
func Benchmark_Key_SetValue(b *testing.B) {
c, _ := Load([]byte(_CONF_DATA))
for i := 0; i < b.N; i++ {
c.Section("").Key("NAME").SetValue("10")
}
}
-239
View File
@@ -1,239 +0,0 @@
// Copyright 2014 Unknwon
//
// Licensed 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.
package ini
import (
"strings"
"testing"
"time"
. "github.com/smartystreets/goconvey/convey"
)
type testNested struct {
Cities []string `delim:"|"`
Visits []time.Time
Note string
Unused int `ini:"-"`
}
type testEmbeded struct {
GPA float64
}
type testStruct struct {
Name string `ini:"NAME"`
Age int
Male bool
Money float64
Born time.Time
Time time.Duration `ini:"Duration"`
Others testNested
*testEmbeded `ini:"grade"`
Unused int `ini:"-"`
Unsigned uint
}
const _CONF_DATA_STRUCT = `
NAME = Unknwon
Age = 21
Male = true
Money = 1.25
Born = 1993-10-07T20:17:05Z
Duration = 2h45m
Unsigned = 3
[Others]
Cities = HangZhou|Boston
Visits = 1993-10-07T20:17:05Z, 1993-10-07T20:17:05Z
Note = Hello world!
[grade]
GPA = 2.8
[foo.bar]
Here = there
When = then
`
type unsupport struct {
Byte byte
}
type unsupport2 struct {
Others struct {
Cities byte
}
}
type unsupport3 struct {
Cities byte
}
type unsupport4 struct {
*unsupport3 `ini:"Others"`
}
type defaultValue struct {
Name string
Age int
Male bool
Money float64
Born time.Time
Cities []string
}
type fooBar struct {
Here, When string
}
const _INVALID_DATA_CONF_STRUCT = `
Name =
Age = age
Male = 123
Money = money
Born = nil
Cities =
`
func Test_Struct(t *testing.T) {
Convey("Map to struct", t, func() {
Convey("Map file to struct", func() {
ts := new(testStruct)
So(MapTo(ts, []byte(_CONF_DATA_STRUCT)), ShouldBeNil)
So(ts.Name, ShouldEqual, "Unknwon")
So(ts.Age, ShouldEqual, 21)
So(ts.Male, ShouldBeTrue)
So(ts.Money, ShouldEqual, 1.25)
So(ts.Unsigned, ShouldEqual, 3)
t, err := time.Parse(time.RFC3339, "1993-10-07T20:17:05Z")
So(err, ShouldBeNil)
So(ts.Born.String(), ShouldEqual, t.String())
dur, err := time.ParseDuration("2h45m")
So(err, ShouldBeNil)
So(ts.Time.Seconds(), ShouldEqual, dur.Seconds())
So(strings.Join(ts.Others.Cities, ","), ShouldEqual, "HangZhou,Boston")
So(ts.Others.Visits[0].String(), ShouldEqual, t.String())
So(ts.Others.Note, ShouldEqual, "Hello world!")
So(ts.testEmbeded.GPA, ShouldEqual, 2.8)
})
Convey("Map section to struct", func() {
foobar := new(fooBar)
f, err := Load([]byte(_CONF_DATA_STRUCT))
So(err, ShouldBeNil)
So(f.Section("foo.bar").MapTo(foobar), ShouldBeNil)
So(foobar.Here, ShouldEqual, "there")
So(foobar.When, ShouldEqual, "then")
})
Convey("Map to non-pointer struct", func() {
cfg, err := Load([]byte(_CONF_DATA_STRUCT))
So(err, ShouldBeNil)
So(cfg, ShouldNotBeNil)
So(cfg.MapTo(testStruct{}), ShouldNotBeNil)
})
Convey("Map to unsupported type", func() {
cfg, err := Load([]byte(_CONF_DATA_STRUCT))
So(err, ShouldBeNil)
So(cfg, ShouldNotBeNil)
cfg.NameMapper = func(raw string) string {
if raw == "Byte" {
return "NAME"
}
return raw
}
So(cfg.MapTo(&unsupport{}), ShouldNotBeNil)
So(cfg.MapTo(&unsupport2{}), ShouldNotBeNil)
So(cfg.MapTo(&unsupport4{}), ShouldNotBeNil)
})
Convey("Map from invalid data source", func() {
So(MapTo(&testStruct{}, "hi"), ShouldNotBeNil)
})
Convey("Map to wrong types and gain default values", func() {
cfg, err := Load([]byte(_INVALID_DATA_CONF_STRUCT))
So(err, ShouldBeNil)
t, err := time.Parse(time.RFC3339, "1993-10-07T20:17:05Z")
So(err, ShouldBeNil)
dv := &defaultValue{"Joe", 10, true, 1.25, t, []string{"HangZhou", "Boston"}}
So(cfg.MapTo(dv), ShouldBeNil)
So(dv.Name, ShouldEqual, "Joe")
So(dv.Age, ShouldEqual, 10)
So(dv.Male, ShouldBeTrue)
So(dv.Money, ShouldEqual, 1.25)
So(dv.Born.String(), ShouldEqual, t.String())
So(strings.Join(dv.Cities, ","), ShouldEqual, "HangZhou,Boston")
})
})
Convey("Reflect from struct", t, func() {
type Embeded struct {
Dates []time.Time `delim:"|"`
Places []string
None []int
}
type Author struct {
Name string `ini:"NAME"`
Male bool
Age int
GPA float64
NeverMind string `ini:"-"`
*Embeded `ini:"infos"`
}
a := &Author{"Unknwon", true, 21, 2.8, "",
&Embeded{
[]time.Time{time.Now(), time.Now()},
[]string{"HangZhou", "Boston"},
[]int{},
}}
cfg := Empty()
So(ReflectFrom(cfg, a), ShouldBeNil)
cfg.SaveTo("testdata/conf_reflect.ini")
Convey("Reflect from non-point struct", func() {
So(ReflectFrom(cfg, Author{}), ShouldNotBeNil)
})
})
}
type testMapper struct {
PackageName string
}
func Test_NameGetter(t *testing.T) {
Convey("Test name mappers", t, func() {
So(MapToWithMapper(&testMapper{}, TitleUnderscore, []byte("packag_name=ini")), ShouldBeNil)
cfg, err := Load([]byte("PACKAGE_NAME=ini"))
So(err, ShouldBeNil)
So(cfg, ShouldNotBeNil)
cfg.NameMapper = AllCapsUnderscore
tg := new(testMapper)
So(cfg.MapTo(tg), ShouldBeNil)
So(tg.PackageName, ShouldEqual, "ini")
})
}
-2
View File
@@ -1,2 +0,0 @@
[author]
E-MAIL = u@gogs.io
Binary file not shown.

Before

Width:  |  Height:  |  Size: 238 KiB

@@ -1,22 +0,0 @@
# Compiled Object files, Static and Dynamic libs (Shared Objects)
*.o
*.a
*.so
# Folders
_obj
_test
# Architecture specific extensions/prefixes
*.[568vq]
[568vq].out
*.cgo1.go
*.cgo2.c
_cgo_defun.c
_cgo_gotypes.go
_cgo_export.*
_testmain.go
*.exe
-20
View File
@@ -1,20 +0,0 @@
language: go
sudo: false
matrix:
include:
- go: 1.2
- go: 1.3
- go: 1.4
- go: 1.5
- go: 1.6
- go: tip
install:
- go get golang.org/x/tools/cmd/vet
script:
- go get -t -v ./...
- diff -u <(echo -n) <(gofmt -d .)
- go vet .
- go test -v -race ./...
-44
View File
@@ -1,44 +0,0 @@
// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package websocket
import (
"crypto/rand"
"crypto/sha1"
"encoding/base64"
"io"
"net/http"
"strings"
)
// tokenListContainsValue returns true if the 1#token header with the given
// name contains token.
func tokenListContainsValue(header http.Header, name string, value string) bool {
for _, v := range header[name] {
for _, s := range strings.Split(v, ",") {
if strings.EqualFold(value, strings.TrimSpace(s)) {
return true
}
}
}
return false
}
var keyGUID = []byte("258EAFA5-E914-47DA-95CA-C5AB0DC85B11")
func computeAcceptKey(challengeKey string) string {
h := sha1.New()
h.Write([]byte(challengeKey))
h.Write(keyGUID)
return base64.StdEncoding.EncodeToString(h.Sum(nil))
}
func generateChallengeKey() (string, error) {
p := make([]byte, 16)
if _, err := io.ReadFull(rand.Reader, p); err != nil {
return "", err
}
return base64.StdEncoding.EncodeToString(p), nil
}
-201
View File
@@ -1,201 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {yyyy} {name of copyright owner}
Licensed 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.
@@ -1,35 +0,0 @@
package commands
import (
"github.com/codegangsta/cli"
)
type CommandLine interface {
ShowHelp()
ShowVersion()
Application() *cli.App
Args() cli.Args
Bool(name string) bool
Int(name string) int
String(name string) string
StringSlice(name string) []string
GlobalString(name string) string
FlagNames() (names []string)
Generic(name string) interface{}
}
type contextCommandLine struct {
*cli.Context
}
func (c *contextCommandLine) ShowHelp() {
cli.ShowCommandHelp(c.Context, c.Command.Name)
}
func (c *contextCommandLine) ShowVersion() {
cli.ShowVersion(c.Context)
}
func (c *contextCommandLine) Application() *cli.App {
return c.App
}
@@ -1,48 +0,0 @@
package commands
import (
"github.com/codegangsta/cli"
"github.com/grafana/grafana-cli/pkg/log"
)
func runCommand(command func(commandLine CommandLine) error) func(context *cli.Context) {
return func(context *cli.Context) {
cmd := &contextCommandLine{context}
if err := command(cmd); err != nil {
log.Errorf("%v\n\n", err)
cmd.ShowHelp()
} else {
log.Info("Restart grafana after installing plugins . <service grafana-server restart>\n")
}
}
}
var Commands = []cli.Command{
{
Name: "install",
Usage: "installs stuff",
Action: runCommand(installCommand),
}, {
Name: "list-remote",
Usage: "list remote available plugins",
Action: runCommand(listremoteCommand),
}, {
Name: "upgrade",
Usage: "upgrades one plugin",
Action: runCommand(upgradeCommand),
}, {
Name: "upgrade-all",
Usage: "upgrades all your installed plugins",
Action: runCommand(upgradeAllCommand),
}, {
Name: "ls",
Usage: "list all installed plugins",
Action: runCommand(lsCommand),
}, {
Name: "remove",
Usage: "removes stuff",
Action: runCommand(removeCommand),
},
}
@@ -1,95 +0,0 @@
package commandstest
import (
"github.com/codegangsta/cli"
)
type FakeFlagger struct {
Data map[string]interface{}
}
type FakeCommandLine struct {
LocalFlags, GlobalFlags *FakeFlagger
HelpShown, VersionShown bool
CliArgs []string
}
func (ff FakeFlagger) String(key string) string {
if value, ok := ff.Data[key]; ok {
return value.(string)
}
return ""
}
func (ff FakeFlagger) StringSlice(key string) []string {
if value, ok := ff.Data[key]; ok {
return value.([]string)
}
return []string{}
}
func (ff FakeFlagger) Int(key string) int {
if value, ok := ff.Data[key]; ok {
return value.(int)
}
return 0
}
func (ff FakeFlagger) Bool(key string) bool {
if value, ok := ff.Data[key]; ok {
return value.(bool)
}
return false
}
func (fcli *FakeCommandLine) String(key string) string {
return fcli.LocalFlags.String(key)
}
func (fcli *FakeCommandLine) StringSlice(key string) []string {
return fcli.LocalFlags.StringSlice(key)
}
func (fcli *FakeCommandLine) Int(key string) int {
return fcli.LocalFlags.Int(key)
}
func (fcli *FakeCommandLine) Bool(key string) bool {
if fcli.LocalFlags == nil {
return false
}
return fcli.LocalFlags.Bool(key)
}
func (fcli *FakeCommandLine) GlobalString(key string) string {
return fcli.GlobalFlags.String(key)
}
func (fcli *FakeCommandLine) Generic(name string) interface{} {
return fcli.LocalFlags.Data[name]
}
func (fcli *FakeCommandLine) FlagNames() []string {
flagNames := []string{}
for key := range fcli.LocalFlags.Data {
flagNames = append(flagNames, key)
}
return flagNames
}
func (fcli *FakeCommandLine) ShowHelp() {
fcli.HelpShown = true
}
func (fcli *FakeCommandLine) Application() *cli.App {
return cli.NewApp()
}
func (fcli *FakeCommandLine) Args() cli.Args {
return fcli.CliArgs
}
func (fcli *FakeCommandLine) ShowVersion() {
fcli.VersionShown = true
}
@@ -1,55 +0,0 @@
package commandstest
import (
"os"
"time"
)
type FakeIoUtil struct {
FakeReadDir []os.FileInfo
FakeIsDirectory bool
}
func (util *FakeIoUtil) Stat(path string) (os.FileInfo, error) {
return FakeFileInfo{IsDirectory: util.FakeIsDirectory}, nil
}
func (util *FakeIoUtil) RemoveAll(path string) error {
return nil
}
func (util *FakeIoUtil) ReadDir(path string) ([]os.FileInfo, error) {
return util.FakeReadDir, nil
}
func (i *FakeIoUtil) ReadFile(filename string) ([]byte, error) {
return make([]byte, 0), nil
}
type FakeFileInfo struct {
IsDirectory bool
}
func (ffi FakeFileInfo) IsDir() bool {
return ffi.IsDirectory
}
func (ffi FakeFileInfo) Size() int64 {
return 1
}
func (ffi FakeFileInfo) Mode() os.FileMode {
return 0777
}
func (ffi FakeFileInfo) Name() string {
return ""
}
func (ffi FakeFileInfo) ModTime() time.Time {
return time.Time{}
}
func (ffi FakeFileInfo) Sys() interface{} {
return nil
}
@@ -1,146 +0,0 @@
package commands
import (
"archive/zip"
"bytes"
"errors"
"github.com/grafana/grafana-cli/pkg/log"
m "github.com/grafana/grafana-cli/pkg/models"
services "github.com/grafana/grafana-cli/pkg/services"
"io"
"io/ioutil"
"net/http"
"os"
"path"
"regexp"
)
func validateInput(c CommandLine, pluginFolder string) error {
arg := c.Args().First()
if arg == "" {
return errors.New("please specify plugin to install")
}
pluginDir := c.GlobalString("path")
if pluginDir == "" {
return errors.New("missing path flag")
}
fileinfo, err := os.Stat(pluginDir)
if err != nil && !fileinfo.IsDir() {
return errors.New("path is not a directory")
}
return nil
}
func installCommand(c CommandLine) error {
pluginFolder := c.GlobalString("path")
if err := validateInput(c, pluginFolder); err != nil {
return err
}
pluginToInstall := c.Args().First()
version := c.Args().Get(1)
log.Infof("version: %v\n", version)
return InstallPlugin(pluginToInstall, pluginFolder, version)
}
func InstallPlugin(pluginName, pluginFolder, version string) error {
plugin, err := services.GetPlugin(pluginName)
if err != nil {
return err
}
v, err := SelectVersion(plugin, version)
if err != nil {
return err
}
url := v.Url
commit := v.Commit
downloadURL := url + "/archive/" + commit + ".zip"
log.Infof("installing %v @ %v\n", plugin.Id, version)
log.Infof("from url: %v\n", downloadURL)
log.Infof("on commit: %v\n", commit)
log.Infof("into: %v\n", pluginFolder)
err = downloadFile(plugin.Id, pluginFolder, downloadURL)
if err == nil {
log.Info("Installed %s successfully ✔\n", plugin.Id)
}
res := services.ReadPlugin(pluginFolder, pluginName)
for _, v := range res.Dependency.Plugins {
log.Infof("Depends on %s install!\n", v.Id)
//Todo: uncomment this code once the repo is more correct.
//InstallPlugin(v.Id, pluginFolder, "")
}
return err
}
func SelectVersion(plugin m.Plugin, version string) (m.Version, error) {
if version == "" {
return plugin.Versions[0], nil
}
for _, v := range plugin.Versions {
if v.Version == version {
return v, nil
}
}
return m.Version{}, errors.New("Could not find the version your looking for")
}
func RemoveGitBuildFromname(pluginname, filename string) string {
r := regexp.MustCompile("^[a-zA-Z0-9_.-]*/")
return r.ReplaceAllString(filename, pluginname+"/")
}
func downloadFile(pluginName, filepath, url string) (err error) {
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
r, err := zip.NewReader(bytes.NewReader(body), resp.ContentLength)
if err != nil {
return err
}
for _, zf := range r.File {
newfile := path.Join(filepath, RemoveGitBuildFromname(pluginName, zf.Name))
if zf.FileInfo().IsDir() {
os.Mkdir(newfile, 0777)
} else {
dst, err := os.Create(newfile)
if err != nil {
log.Errorf("%v", err)
}
defer dst.Close()
src, err := zf.Open()
if err != nil {
log.Errorf("%v", err)
}
defer src.Close()
io.Copy(dst, src)
}
}
return nil
}
@@ -1,20 +0,0 @@
package commands
import (
"github.com/grafana/grafana-cli/pkg/log"
"github.com/grafana/grafana-cli/pkg/services"
)
func listremoteCommand(c CommandLine) error {
plugin, err := services.ListAllPlugins()
if err != nil {
return err
}
for _, i := range plugin.Plugins {
log.Infof("id: %v version:\n", i.Id)
}
return nil
}
@@ -1,49 +0,0 @@
package commands
import (
"errors"
"github.com/grafana/grafana-cli/pkg/log"
m "github.com/grafana/grafana-cli/pkg/models"
s "github.com/grafana/grafana-cli/pkg/services"
)
var getPlugins func(path string) []m.InstalledPlugin
var GetStat m.IoUtil
func init() {
getPlugins = s.GetLocalPlugins
GetStat = s.IoUtil
}
func validateCommand(pluginDir string) error {
if pluginDir == "" {
return errors.New("missing path flag")
}
log.Info("plugindir: " + pluginDir + "\n")
pluginDirInfo, err := GetStat.Stat(pluginDir)
if err != nil {
return errors.New("missing path flag")
}
if pluginDirInfo.IsDir() == false {
return errors.New("plugin path is not a directory")
}
return nil
}
func lsCommand(c CommandLine) error {
pluginDir := c.GlobalString("path")
if err := validateCommand(pluginDir); err != nil {
return err
}
for _, plugin := range getPlugins(pluginDir) {
log.Infof("plugin: %s @ %s \n", plugin.Name, plugin.Info.Version)
}
return nil
}

Some files were not shown because too many files have changed in this diff Show More