public async deleteConnectionFromGreengrassDefinitions()

in source/lambda/lib/greengrass-handler.ts [579:666]


  public async deleteConnectionFromGreengrassDefinitions(greengrassGroupVersion: Greengrass.GetGroupVersionResponse): Promise<GreengrassHandlerTypes.DeleteConnectionFromGreengrassDefinitionResponse> {
    try {
      logger.log(LoggingLevel.DEBUG, `Deleting connection from Greengrass definitionss: ${JSON.stringify(greengrassGroupVersion, null, 2)}`);

      const newDefinitionVersionArns: { [key: string]: string | undefined } = {};
      const lambdaFunctionNames: string[] = [];

      const solutionGreengrassDefaultDefinitions = this.getSolutionGreengrassDefaultDefinitions({});
      const defitionsToDelete: GreengrassHandlerTypes.GreengrassDefinitions[] = [
        GreengrassHandlerTypes.GreengrassDefinitions.FUNCTION,
        GreengrassHandlerTypes.GreengrassDefinitions.SUBSCRIPTION
      ];

      for (let definition of defitionsToDelete) {
        const latestDefinitionVersionArn = greengrassGroupVersion.Definition[`${definition}DefinitionVersionArn`];
        const greengrassDefinition = await this.findGreengrassDefinition(latestDefinitionVersionArn, definition);
        let greengrassDefinitionVersion = await this.getGreengrassDefinitionVersion(greengrassDefinition.Id, greengrassDefinition.LatestVersion, definition);

        logger.log(LoggingLevel.DEBUG, `definition: ${definition}, latestDefinitionVersionArn: ${latestDefinitionVersionArn}`);

        if (definition === GreengrassHandlerTypes.GreengrassDefinitions.FUNCTION) {
          const lambdaFunctionIds = [
            `Function-id-${this.connectionName}-collector`,
            `Function-id-${this.connectionName}-publisher`
          ];

          // Gets the Lambda function ARNs.
          const lambdaFunctions = (<Greengrass.Function[]>greengrassDefinitionVersion)
            .filter(func => lambdaFunctionIds.includes(func.Id));

          for (let lambdaFunction of lambdaFunctions) {
            /**
             * Since Greengrass definition version has Lambda function alias ARN ending with the function name,
             * the function ARN from the Greengrass definition version can't be used directly.
             */
            lambdaFunctionNames.push(lambdaFunction.FunctionArn.split(':').pop());
          }

          // Removes the to-be-deleted funtions from the Greengrass definition version.
          greengrassDefinitionVersion = (<Greengrass.Function[]>greengrassDefinitionVersion)
            .filter(func => !(lambdaFunctionIds.includes(func.Id)));
        } else {
          const subscriptions = [
            `${this.connectionName}-to-cloud`,
            `${this.connectionName}-from-collector`,
            `${this.connectionName}-from-publisher`
          ];

          // Removes the to-be-deleted subscriptions from the Greengrass definition version.
          greengrassDefinitionVersion = (<Greengrass.Subscription[]>greengrassDefinitionVersion)
            .filter(subscription => !subscriptions.includes(subscription.Id));
        }

        // Combines the current version Greengrass definitions and the default Greengrass definitions.
        let newDefinitions: any[] = solutionGreengrassDefaultDefinitions[definition];
        this.combineDefinitions(definition, newDefinitions, greengrassDefinitionVersion);

        // Only creates a definition when `m2c2-greengrass-${definition}Definition` does not exist.
        let definitionId = greengrassDefinition.Id;
        if (!greengrassDefinition.Name || greengrassDefinition.Name !== `m2c2-greengrass-${definition}Definition`) {
          const newDefinition = await this.createGreengrassDefinition(definition);
          definitionId = newDefinition.Id;
        }

        const newDefinitionVersion = await this.createGreengrassDefinitionVersion(definitionId, newDefinitions, definition);
        newDefinitionVersionArns[`${definition}DefinitionVersionArn`] = newDefinitionVersion.Arn;
      }

      // Sets other definitions' ARN and creates a new Greengrass version
      newDefinitionVersionArns.ConnectorDefinitionVersionArn = greengrassGroupVersion.Definition.ConnectorDefinitionVersionArn;
      newDefinitionVersionArns.CoreDefinitionVersionArn = greengrassGroupVersion.Definition.CoreDefinitionVersionArn;
      newDefinitionVersionArns.DeviceDefinitionVersionArn = greengrassGroupVersion.Definition.DeviceDefinitionVersionArn;
      newDefinitionVersionArns.LoggerDefinitionVersionArn = greengrassGroupVersion.Definition.LoggerDefinitionVersionArn;
      newDefinitionVersionArns.ResourceDefinitionVersionArn = greengrassGroupVersion.Definition.ResourceDefinitionVersionArn;

      return {
        newDefinitionVersionArns,
        lambdaFunctionNames
      };
    } catch (error) {
      logger.log(LoggingLevel.ERROR, '[deleteConnectionFromGreengrassDefinitions] Error: ', error);

      throw new LambdaError({
        message: error instanceof LambdaError ? error.message : 'Failed to delete a connection completely.',
        name: error instanceof LambdaError ? error.name : GreengrassHandlerTypes.ErrorTypes.DELETE_CONNECTION_FROM_GREENGRASS_DEFINITIONS_ERROR
      });
    }
  }