jeudi 13 septembre 2018

Implementing Multiple functions in If_Else condition For Loop?

Usecase

I have function1 which calls API1 and giveS output like below

{ Buckets:
   [ { Name: 'ONE',
       CreationDate: 2018-09-12T11:32:04.000Z },
     { Name: 'SEVEN',
       CreationDate: 2018-09-12T10:06:44.000Z },
     { Name: 'THREE',
       CreationDate: 2018-09-12T10:06:56.000Z },
     { Name: 'FOUR',
       CreationDate: 2018-09-12T10:07:06.000Z },
     { Name: 'FIVE',
       CreationDate: 2018-09-12T10:07:18.000Z },
     { Name: 'SIX',
       CreationDate: 2018-09-12T10:07:28.000Z },
     { Name: 'TWO',
       CreationDate: 2018-09-12T10:07:39.000Z } ],
}

And function2 which will take the bucket names from function 1 and pass dynamically to params1 based on each iteration in for loop.

{"ResponseMetadata":{"RequestId":"a7c64a98-b735-11e"},"MetricDataResults":[{"Id":"m17","Label":"BucketSizeBytes","Timestamps":["2018-09-04T18:30:00.000Z"],"Values":[2048717],"StatusCode":"Complete","Messages":[]}]
{"ResponseMetadata":{"RequestId":"a7c64a98-b735-11e"},"MetricDataResults":[{"Id":"m17","Label":"BucketSizeBytes","Timestamps":["2018-09-04T18:30:00.000Z"],"Values":[2048718],"StatusCode":"Complete","Messages":[]}]
{"ResponseMetadata":{"RequestId":"a7c64a98-b735-11e"},"MetricDataResults":[{"Id":"m17","Label":"BucketSizeBytes","Timestamps":["2018-09-04T18:30:00.000Z"],"Values":[2048719],"StatusCode":"Complete","Messages":[]}]
{"ResponseMetadata":{"RequestId":"a7c64a98-b735-11e"},"MetricDataResults":[{"Id":"m17","Label":"BucketSizeBytes","Timestamps":["2018-09-04T18:30:00.000Z"],"Values":[2048720],"StatusCode":"Complete","Messages":[]}]
{"ResponseMetadata":{"RequestId":"a7c64a98-b735-11e"},"MetricDataResults":[{"Id":"m17","Label":"BucketSizeBytes","Timestamps":["2018-09-04T18:30:00.000Z"],"Values":[2048721],"StatusCode":"Complete","Messages":[]}]
{"ResponseMetadata":{"RequestId":"a7c64a98-b735-11e"},"MetricDataResults":[{"Id":"m17","Label":"BucketSizeBytes","Timestamps":["2018-09-04T18:30:00.000Z"],"Values":[2048722],"StatusCode":"Complete","Messages":[]}]
{"ResponseMetadata":{"RequestId":"a7c64a98-b735-11e"},"MetricDataResults":[{"Id":"m17","Label":"BucketSizeBytes","Timestamps":["2018-09-04T18:30:00.000Z"],"Values":[2048723],"StatusCode":"Complete","Messages":[]}]

Which means for every name in function 1 it will give a Response like above(i.e.7) . Rightnow i am merging these two jsons into one json which is like this

{"Name":"test-pics-folder-two","CreationDate":"2018-09-12T10:07:39.000Z","ResponseMetadata":{"RequestId":"fc77226d-b72c-11e8-ad06-0dea5c42ce8a"},"MetricDataResults":[{"Id":"m17","Label":"BucketSizeBytes","Timestamps":["2018-09-04T18:30:00.000Z"],"Values":[2048717],"StatusCode":"Complete","Messages":[]}]}

For achieving this i had written NODE.JS code like below

var AWS = require('aws-sdk');
// Set the region 
AWS.config.update({
    region: "ap-south-1"
   });

// Create S3 service object
s3 = new AWS.S3();
var cloudwatch = new AWS.CloudWatch({apiVersion: '2010-08-01'});
var params= {};
 s3.listBuckets(params, bucketList); -->Trigger function1
function bucketList(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else   
  {   
      var size = Object.keys(data.Buckets).length; -->Where data has the function 1 output like i mentioned above. And i am taking length of it(i.e.7)
    for(var i = 0; i < size;i++){
       var Json1 = data.Buckets[i]
         console.log(Json1)
       var BucketName = data.Buckets[i].Name
       var params1 = {
        EndTime: 1536128999, /* required */
        MetricDataQueries: [ /* required */
            {
                Id: 'm17', /* required */
                MetricStat: {
                  Metric: { /* required */
                    Dimensions: [
                    //   {
                    //     Name: 'BucketName', /* required */
                    //     Value: 'test-pics-folder' /* required */
                    //   },
                      {
                        Name: 'BucketName', /* required */
                        Value: BucketName /* required */
                      },
                      {
                        Name: 'StorageType', /* required */
                        Value: 'StandardStorage' /* required */
                      }
                      /* more items */
                    ],
                    MetricName: 'BucketSizeBytes',
                    Namespace: 'AWS/S3'
                  },
                  Period: 86400, /* required */
                  Stat: 'Sum', /* required */
                  Unit: 'Bytes'
                },
                ReturnData: true
              },
              /* more items */
            ],
            StartTime: 1536085800, /* required */

            // ScanBy: TimestampDescending | TimestampAscending
          };

            cloudwatch.getMetricData(params1,metricAll) -->Trigger function2
            function metricAll(err, data1) {
              if (err) {
                  console.log(err, err.stack); 
              }
              else     
              {
                  var Json2 = data1  -->The function2 output as in the above mentioned format
               var obj = Object.assign(Json1, Json2);
               console.log(JSON.stringify(obj))       
              }        
            };        

    }
 }       
}

I am getting output like this

    {"Name":"TWO","CreationDate":"2018-09-12T10:07:39.000Z","ResponseMetadata":{"RequestId":"a7c64a98-b735-11e"},"MetricDataResults":[{"Id":"m17","Label":"BucketSizeBytes","Timestamps":["2018-09-04T18:30:00.000Z"],"Values":[2048717],"StatusCode":"Complete","Messages":[]}]
    {"Name":"TWO","CreationDate":"2018-09-12T10:07:39.000Z","ResponseMetadata":{"RequestId":"a7c64a98-b735-11e"},"MetricDataResults":[{"Id":"m17","Label":"BucketSizeBytes","Timestamps":["2018-09-04T18:30:00.000Z"],"Values":[2048718],"StatusCode":"Complete","Messages":[]}]
    {"Name":"TWO","CreationDate":"2018-09-12T10:07:39.000Z","ResponseMetadata":{"RequestId":"a7c64a98-b735-11e"},"MetricDataResults":[{"Id":"m17","Label":"BucketSizeBytes","Timestamps":["2018-09-04T18:30:00.000Z"],"Values":[2048719],"StatusCode":"Complete","Messages":[]}]
    {"Name":"TWO","CreationDate":"2018-09-12T10:07:39.000Z","ResponseMetadata":{"RequestId":"a7c64a98-b735-11e"},"MetricDataResults":[{"Id":"m17","Label":"BucketSizeBytes","Timestamps":["2018-09-04T18:30:00.000Z"],"Values":[2048720],"StatusCode":"Complete","Messages":[]}]
    {"Name":"TWO","CreationDate":"2018-09-12T10:07:39.000Z","ResponseMetadata":{"RequestId":"a7c64a98-b735-11e"},"MetricDataResults":[{"Id":"m17","Label":"BucketSizeBytes","Timestamps":["2018-09-04T18:30:00.000Z"],"Values":[2048721],"StatusCode":"Complete","Messages":[]}]
    {"Name":"TWO","CreationDate":"2018-09-12T10:07:39.000Z","ResponseMetadata":{"RequestId":"a7c64a98-b735-11e"},"MetricDataResults":[{"Id":"m17","Label":"BucketSizeBytes","Timestamps":["2018-09-04T18:30:00.000Z"],"Values":[2048722],"StatusCode":"Complete","Messages":[]}]
    {"Name":"TWO","CreationDate":"2018-09-12T10:07:39.000Z","ResponseMetadata":{"RequestId":"a7c64a98-b735-11e"},"MetricDataResults":[{"Id":"m17","Label":"BucketSizeBytes","Timestamps":["2018-09-04T18:30:00.000Z"],"Values":[2048723],"StatusCode":"Complete","Messages":[]}]

Where it is appending the last BucketName of function 1 and assigning it to all the results of function2. When kept the console.log(i) in

function metricAll(err, data1) {
          if (err) {
              console.log(err, err.stack); 
          }
          else     
          {
                  console.log(i)     
          }        
        };

I got a weird output of [ 7 7 7 7 7 7 7] . Which means it is passing only the last value of the for loop into this. I dont know why ?

Any help is appreciated

Thanks

Aucun commentaire:

Enregistrer un commentaire