@Override
    public Integer call() throws Exception {
        WorkflowContext context = new WorkflowContextBuilder(null).
                withAuthConfig(authConfigBuilder.getAuthConfig()).get();

        if (!clusterValidator.validate(context)) {
            WorkflowLogger.logPersistedActivities();
            return ToolConstants.INVALID_INPUT_ERROR_CODE;
        }
        WorkflowLogger.header(ControllerActivity.APPLICATION_DETAILS);
        List<AppMetadata> appInfoList = null;
        try {
            appInfoList = deployer.getAppsMetadata(context.getAuthConfig());
        } catch (HyscaleException e) {
            WorkflowLogger.error(ControllerActivity.ERROR_WHILE_FETCHING_DEPLOYMENTS);
            throw e;
        }

        if (appInfoList == null || appInfoList.isEmpty()) {
            WorkflowLogger.info(ControllerActivity.NO_DEPLOYMENTS);
            WorkflowLogger.footer();
            return ToolConstants.HYSCALE_SUCCESS_CODE;
        }

        appInfoList = appInfoList.stream().filter(appInfo -> {
            if (appInfo == null || StringUtils.isBlank(appInfo.getAppName())
                    || K8SRuntimeConstants.SYSTEM_NAMESPACE.contains(appInfo.getNamespace())) {
                return false;
            }
            return true;
        }).sorted(Comparator.comparing(AppMetadata::getAppName)).collect(Collectors.toList());

        if (appInfoList.isEmpty()) {
            WorkflowLogger.info(ControllerActivity.NO_DEPLOYMENTS);
            WorkflowLogger.footer();
            return ToolConstants.HYSCALE_SUCCESS_CODE;
        }


        Builder tableBuilder = new TableFormatter.Builder()
                .addField(TableFields.APPLICATION.getFieldName())
                .addField(TableFields.PROFILE.getFieldName())
                .addField(TableFields.NAMESPACE.getFieldName());

        if (wide) {
            tableBuilder.addField(TableFields.SERVICES.getFieldName(), TableFields.SERVICES.getLength());
        }
        TableFormatter table = tableBuilder.build();

        appInfoList.forEach(appInfo -> {
            String services = appInfo.getServices() == null || appInfo.getServices().isEmpty() ? null
                    : appInfo.getServices().toString().replace("[", "").replace("]", "");
            String[] row = new String[]{appInfo.getAppName(), appInfo.getEnvName(), appInfo.getNamespace(), services};
            table.addRow(row);
        });
        WorkflowLogger.logTable(table);
        WorkflowLogger.footer();
        return ToolConstants.HYSCALE_SUCCESS_CODE;
    }
This class executes 'hyscale get apps' command.
It is a sub-command of the 'hyscale get' command

@author tushar
@see io.hyscale.controller.commands.get.HyscaleGetCommand .
It also act as parent command to perform app level operation like get status
@see HyscaleAppStatusCommand
Every command/sub-command has to implement the {@link Callable} so that
whenever the command is executed the {@link #call()}
method will be invoked
<p>
Eg: hyscale get apps
<p>
Displays all the apps along with namespace deployed on the cluster.
Ignores system namespace {@link K8SRuntimeConstants#SYSTEM_NAMESPACE} on the cluster
workflow-controller/controller-service/src/main/java/io/hyscale/controller/commands/get/app/HyscaleGetAppsCommand.java