Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,13 @@ docker compose up -d
| **Ko-fi** | One-time / Recurring | [Donate using Ko-fi](https://ko-fi.com/FortuneN) |
| **Liberapay** | Recurring | [Donate using Liberapay](https://liberapay.com/FortuneN) |

## Recognition

| Source | Description |
|-----------|-------------|
| [Keycloak Extensions](https://www.keycloak.org/extensions) | Official Keycloak extensions directory |
| [Awesome Keycloak](https://github.com/thomasdarimont/awesome-keycloak) | Community-curated list of Keycloak resources |

## Credits

| Library | Description |
Expand Down
25 changes: 25 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -923,6 +923,11 @@
<pattern>org.apache.commons.logging</pattern>
<shadedPattern>kete.org.apache.commons.logging</shadedPattern>
</relocation>
<!-- Commons Compress (avro transitive) -->
<relocation>
<pattern>org.apache.commons.compress</pattern>
<shadedPattern>kete.org.apache.commons.compress</shadedPattern>
</relocation>
<!-- Javassist (reflections transitive) -->
<relocation>
<pattern>javassist</pattern>
Expand Down Expand Up @@ -1069,6 +1074,11 @@
<pattern>com.microsoft.aad</pattern>
<shadedPattern>kete.com.microsoft.aad</shadedPattern>
</relocation>
<!-- JNA (azure-identity → msal4j-persistence-extension transitive) -->
<relocation>
<pattern>com.sun.jna</pattern>
<shadedPattern>kete.com.sun.jna</shadedPattern>
</relocation>
<!-- Google API Client / HTTP Client / Services -->
<relocation>
<pattern>com.google.api.client</pattern>
Expand All @@ -1078,6 +1088,16 @@
<pattern>com.google.api.services</pattern>
<shadedPattern>kete.com.google.api.services</shadedPattern>
</relocation>
<!-- Google API parent package (proto-google-common-protos has classes in com.google.api directly) -->
<relocation>
<pattern>com.google.api</pattern>
<shadedPattern>kete.com.google.api</shadedPattern>
</relocation>
<!-- Apache HttpComponents (google-http-client-apache-v2 transitive) -->
<relocation>
<pattern>org.apache.http</pattern>
<shadedPattern>kete.org.apache.http</shadedPattern>
</relocation>
<!-- Google Cloud Tasks gRPC stubs + protobuf types -->
<relocation>
<pattern>com.google.cloud</pattern>
Expand Down Expand Up @@ -1131,6 +1151,11 @@
<pattern>io.grpc</pattern>
<shadedPattern>kete.io.grpc</shadedPattern>
</relocation>
<!-- Animal Sniffer annotations (grpc transitive) -->
<relocation>
<pattern>org.codehaus.mojo.animal_sniffer</pattern>
<shadedPattern>kete.org.codehaus.mojo.animal_sniffer</shadedPattern>
</relocation>
<!-- Auto Value annotations (google-auth-library transitive) -->
<relocation>
<pattern>com.google.auto.value</pattern>
Expand Down
2 changes: 1 addition & 1 deletion run-on-develop-push.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ if ($testsPassed) {
}
}
$color = if ($coveragePercent -ge 80) { "brightgreen" } elseif ($coveragePercent -ge 60) { "green" } elseif ($coveragePercent -ge 40) { "yellow" } else { "red" }
$badgeJson = @{ schemaVersion = 1; label = "coverage"; message = "$coveragePercent%"; color = $color } | ConvertTo-Json
$badgeJson = @{ schemaVersion = 1; label = "Coverage"; message = "$coveragePercent%"; color = $color } | ConvertTo-Json
Set-Content -Path "coverage-badge.json" -Value $badgeJson -Encoding UTF8
Write-TaskResult "Coverage: $coveragePercent% (badge updated)" $true
}
Expand Down
22 changes: 18 additions & 4 deletions run-on-release-push.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ if ($testsPassed) {
}
}
$color = if ($coveragePercent -ge 80) { "brightgreen" } elseif ($coveragePercent -ge 60) { "green" } elseif ($coveragePercent -ge 40) { "yellow" } else { "red" }
$badgeJson = @{ schemaVersion = 1; label = "coverage"; message = "$coveragePercent%"; color = $color } | ConvertTo-Json
$badgeJson = @{ schemaVersion = 1; label = "Coverage"; message = "$coveragePercent%"; color = $color } | ConvertTo-Json
Set-Content -Path "coverage-badge.json" -Value $badgeJson -Encoding UTF8
Write-TaskResult "Coverage: $coveragePercent% (badge updated)" $true
}
Expand Down Expand Up @@ -373,13 +373,22 @@ if (-not (Test-PreviousStepsPassed)) {
$tagName = "$($script:Version)"

Write-Task "Creating Git tag $tagName..."
git tag -a $tagName -m "Release $tagName" 2>&1 | Out-Null
$tagOutput = git tag -a $tagName -m "Release $tagName" 2>&1
$tagCreated = $LASTEXITCODE -eq 0

if (-not $tagCreated) {
Write-Host " Tag creation error: $tagOutput" -ForegroundColor Red
}

if ($tagCreated) {
Write-Task "Pushing tag to origin..."
git push origin $tagName 2>&1 | Out-Null
$pushOutput = git push origin $tagName 2>&1
$tagPushed = $LASTEXITCODE -eq 0

if (-not $tagPushed) {
Write-Host " Tag push error: $pushOutput" -ForegroundColor Red
}

Write-TaskResult "Git tag $tagName" $tagPushed
$script:Results["5. Git Tag"] = $tagPushed
} else {
Expand All @@ -390,8 +399,13 @@ if (-not (Test-PreviousStepsPassed)) {
if ($script:Results["5. Git Tag"]) {
Write-Task "Creating GitHub Release..."
$releaseNotes = ""
gh release create $tagName --title "$tagName" --notes $releaseNotes "target/$script:JarName" 2>&1 | Out-Null
$releaseOutput = gh release create $tagName --title "$tagName" --notes $releaseNotes "target/$script:JarName" 2>&1
$releaseCreated = $LASTEXITCODE -eq 0

if (-not $releaseCreated) {
Write-Host " Release creation error: $releaseOutput" -ForegroundColor Red
}

Write-TaskResult "GitHub Release $tagName" $releaseCreated
$script:Results["5. GitHub Release"] = $releaseCreated
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

import java.util.concurrent.TimeUnit;

import com.google.cloud.tasks.v2.CloudTasksGrpc;
import com.google.cloud.tasks.v2.CreateTaskRequest;
import com.google.cloud.tasks.v2.GetQueueRequest;
import com.google.cloud.tasks.v2.HttpMethod;
import com.google.cloud.tasks.v2.HttpRequest;
import com.google.cloud.tasks.v2.ListQueuesRequest;
Expand All @@ -23,7 +23,11 @@
import io.github.fortunen.kete.utils.TemplateUtils;
import io.github.fortunen.kete.utils.ValidationUtils;
import io.grpc.ManagedChannel;
import io.grpc.Metadata;
import io.grpc.Status;
import io.grpc.StatusRuntimeException;
import io.grpc.auth.MoreCallCredentials;
import io.grpc.stub.MetadataUtils;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
Expand Down Expand Up @@ -68,14 +72,32 @@ public void doInitialize() {

// verify connection

var parent = "projects/" + config.getProject() + "/locations/" + config.getLocation();
var deadlinedStub = stub.withDeadlineAfter(timeout.toSeconds(), TimeUnit.SECONDS);

var listRequest = ListQueuesRequest.newBuilder()
.setParent(parent)
.setPageSize(1)
.build();
try {

if (isQueueTemplated) {
var parent = "projects/" + config.getProject() + "/locations/" + config.getLocation();
var listRequest = ListQueuesRequest.newBuilder().setParent(parent).setPageSize(1).build();
var metadata = new Metadata();
metadata.put(Metadata.Key.of("x-goog-request-params", Metadata.ASCII_STRING_MARSHALLER), "parent=" + parent);
deadlinedStub.withInterceptors(MetadataUtils.newAttachHeadersInterceptor(metadata)).listQueues(listRequest);
} else {
var queueName = parentPathPrefix + queue;
var getRequest = GetQueueRequest.newBuilder().setName(queueName).build();
var metadata = new Metadata();
metadata.put(Metadata.Key.of("x-goog-request-params", Metadata.ASCII_STRING_MARSHALLER), "name=" + queueName);
deadlinedStub.withInterceptors(MetadataUtils.newAttachHeadersInterceptor(metadata)).getQueue(getRequest);
}

stub.withDeadlineAfter(timeout.toSeconds(), TimeUnit.SECONDS).listQueues(listRequest);
} catch (StatusRuntimeException exception) {

if (exception.getStatus().getCode() != Status.Code.PERMISSION_DENIED) {
throw exception;
}

// connected but no read permission, no problem
}
}

@Override
Expand Down Expand Up @@ -126,7 +148,9 @@ public void doSend(EventMessage message) {
.setParent(parentPath)
.build();

stub.createTask(request);
var metadata = new Metadata();
metadata.put(Metadata.Key.of("x-goog-request-params", Metadata.ASCII_STRING_MARSHALLER), "parent=" + parentPath);
stub.withInterceptors(MetadataUtils.newAttachHeadersInterceptor(metadata)).createTask(request);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

import com.google.api.client.http.GenericUrl;
import org.apache.http.HttpStatus;

import com.google.api.client.http.HttpResponseException;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.pubsub.Pubsub;
import com.google.api.services.pubsub.model.PublishRequest;
Expand Down Expand Up @@ -67,10 +69,22 @@ public void doInitialize() {

// verify connection

httpTransport
.createRequestFactory()
.buildGetRequest(new GenericUrl(config.getUrl()))
.execute();
try {

if (isTopicTemplated) {
pubsub.projects().topics().list("projects/" + config.getProject()).setPageSize(1).execute();
} else {
pubsub.projects().topics().get(publishTopicPrefix + topic).execute();
}

} catch (HttpResponseException exception) {

if (exception.getStatusCode() != HttpStatus.SC_FORBIDDEN) {
throw exception;
}

// connected but no read permission, no problem
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.catchThrowable;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import java.nio.charset.StandardCharsets;
import java.util.Set;
Expand All @@ -17,6 +19,7 @@
import com.google.cloud.tasks.v2.CreateTaskRequest;

import io.github.fortunen.kete.Constants;
import io.grpc.ClientInterceptor;
import io.github.fortunen.kete.EventMessage;
import io.github.fortunen.kete.destinations.gcpcloudtasks.GcpCloudTasksDestination;
import io.github.fortunen.kete.destinations.gcpcloudtasks.GcpCloudTasksDestinationConfig;
Expand All @@ -42,6 +45,7 @@ public void shouldCreateTaskWithCorrectFields() {
// arrange

var stub = mock(CloudTasksGrpc.CloudTasksBlockingStub.class);
when(stub.withInterceptors(any(ClientInterceptor[].class))).thenReturn(stub);
destination.setConfig(mock(GcpCloudTasksDestinationConfig.class));
destination.setStub(stub);
destination.setQueue("my-queue");
Expand Down
Loading