Forráskód Böngészése

Merge pull request #11990 from mtanda/issue_11925

fix "Cloudwatch panel does not allow arbitrary variable values in query"
Daniel Lee 7 éve
szülő
commit
b2187b70a7

+ 27 - 17
public/app/plugins/datasource/cloudwatch/datasource.ts

@@ -374,23 +374,33 @@ export default class CloudWatchDatasource {
   getExpandedVariables(target, dimensionKey, variable, templateSrv) {
     /* if the all checkbox is marked we should add all values to the targets */
     var allSelected = _.find(variable.options, { selected: true, text: 'All' });
-    return _.chain(variable.options)
-      .filter(v => {
-        if (allSelected) {
-          return v.text !== 'All';
-        } else {
-          return v.selected;
-        }
-      })
-      .map(v => {
-        var t = angular.copy(target);
-        var scopedVar = {};
-        scopedVar[variable.name] = v;
-        t.refId = target.refId + '_' + v.value;
-        t.dimensions[dimensionKey] = templateSrv.replace(t.dimensions[dimensionKey], scopedVar);
-        return t;
-      })
-      .value();
+    var selectedVariables = _.filter(variable.options, v => {
+      if (allSelected) {
+        return v.text !== 'All';
+      } else {
+        return v.selected;
+      }
+    });
+    var currentVariables = !_.isArray(variable.current.value)
+      ? [variable.current]
+      : variable.current.value.map(v => {
+          return {
+            text: v,
+            value: v,
+          };
+        });
+    let useSelectedVariables =
+      selectedVariables.some(s => {
+        return s.value === currentVariables[0].value;
+      }) || currentVariables[0].value === '$__all';
+    return (useSelectedVariables ? selectedVariables : currentVariables).map(v => {
+      var t = angular.copy(target);
+      var scopedVar = {};
+      scopedVar[variable.name] = v;
+      t.refId = target.refId + '_' + v.value;
+      t.dimensions[dimensionKey] = templateSrv.replace(t.dimensions[dimensionKey], scopedVar);
+      return t;
+    });
   }
 
   expandTemplateVariable(targets, scopedVars, templateSrv) {

+ 51 - 0
public/app/plugins/datasource/cloudwatch/specs/datasource_specs.ts

@@ -135,6 +135,10 @@ describe('CloudWatchDatasource', function() {
               { text: 'i-23456789', value: 'i-23456789', selected: false },
               { text: 'i-34567890', value: 'i-34567890', selected: true },
             ],
+            current: {
+              text: 'i-34567890',
+              value: 'i-34567890',
+            },
           },
         ],
         replace: function(target, scopedVars) {
@@ -171,6 +175,53 @@ describe('CloudWatchDatasource', function() {
       var result = ctx.ds.expandTemplateVariable(targets, {}, templateSrv);
       expect(result[0].dimensions.InstanceId).to.be('i-34567890');
     });
+
+    it('should generate the correct targets by expanding template variables from url', function() {
+      var templateSrv = {
+        variables: [
+          {
+            name: 'instance_id',
+            options: [
+              { text: 'i-23456789', value: 'i-23456789', selected: false },
+              { text: 'i-34567890', value: 'i-34567890', selected: false },
+            ],
+            current: 'i-45678901',
+          },
+        ],
+        replace: function(target, scopedVars) {
+          if (target === '$instance_id') {
+            return 'i-45678901';
+          } else {
+            return '';
+          }
+        },
+        getVariableName: function(e) {
+          return 'instance_id';
+        },
+        variableExists: function(e) {
+          return true;
+        },
+        containsVariable: function(str, variableName) {
+          return str.indexOf('$' + variableName) !== -1;
+        },
+      };
+
+      var targets = [
+        {
+          region: 'us-east-1',
+          namespace: 'AWS/EC2',
+          metricName: 'CPUUtilization',
+          dimensions: {
+            InstanceId: '$instance_id',
+          },
+          statistics: ['Average'],
+          period: 300,
+        },
+      ];
+
+      var result = ctx.ds.expandTemplateVariable(targets, {}, templateSrv);
+      expect(result[0].dimensions.InstanceId).to.be('i-45678901');
+    });
   });
 
   describe('When query region is "default"', function() {