Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
740e06b
chore: router ci improvement
miklosbarabas Sep 18, 2025
56c5e62
chore: router ci improvement
miklosbarabas Sep 18, 2025
34acf08
chore: router ci improvement
miklosbarabas Sep 18, 2025
9f9f334
chore: router ci improvement
miklosbarabas Sep 18, 2025
ed21e7b
chore: router ci improvement
miklosbarabas Sep 18, 2025
91db34d
chore: router ci improvement
miklosbarabas Sep 18, 2025
d8ae1eb
chore: router ci improvement
miklosbarabas Sep 18, 2025
b696681
chore(docs): fix typo in README.md for simple-router example (#2228)
rsi2m Sep 18, 2025
adeb091
chore: router ci improvement
miklosbarabas Sep 18, 2025
ab750c5
chore: router ci improvement
miklosbarabas Sep 18, 2025
ffa4ceb
chore: router ci improvement
miklosbarabas Sep 18, 2025
26c7eab
chore: router ci improvement
miklosbarabas Sep 18, 2025
793b45b
chore: router ci improvement
miklosbarabas Sep 18, 2025
6aaeb0a
chore: router ci improvement
miklosbarabas Sep 18, 2025
3c33945
chore: router ci improvement
miklosbarabas Sep 18, 2025
25ed8b9
chore: router ci improvement
miklosbarabas Sep 18, 2025
6347798
chore: router ci improvement
miklosbarabas Sep 18, 2025
578f6b4
chore: router ci improvement
miklosbarabas Sep 18, 2025
773bcd9
chore: router ci improvement
miklosbarabas Sep 19, 2025
b7ce925
chore: router ci improvement
miklosbarabas Sep 19, 2025
cc6a75d
chore: router ci improvement
miklosbarabas Sep 19, 2025
0021bdc
chore: router ci improvement
miklosbarabas Sep 19, 2025
882988f
chore: router ci improvement
miklosbarabas Sep 19, 2025
6b32a02
chore: router ci improvement
miklosbarabas Sep 19, 2025
94d26f4
chore: router ci improvement
miklosbarabas Sep 19, 2025
feff256
chore: router ci improvement
miklosbarabas Sep 19, 2025
05151dd
chore: router ci improvement
miklosbarabas Sep 19, 2025
7abd5d6
chore: router ci improvement
miklosbarabas Sep 19, 2025
2723a0c
chore: router ci improvement
miklosbarabas Sep 19, 2025
df33dea
chore: router ci improvement
miklosbarabas Sep 19, 2025
bc1fea3
chore: router ci improvement
miklosbarabas Sep 19, 2025
e6228a6
chore: router ci improvement
miklosbarabas Sep 19, 2025
01b7dc5
chore: router ci improvement
miklosbarabas Sep 19, 2025
e00ff26
chore: router ci improvement
miklosbarabas Sep 19, 2025
c355ae9
chore: router ci improvement
miklosbarabas Sep 19, 2025
6032723
chore: router ci improvement
miklosbarabas Sep 19, 2025
17c9fd3
chore: router ci improvement
miklosbarabas Sep 19, 2025
fe41836
fix: print client schema with select directives (#2232)
Aenimus Sep 19, 2025
ae65619
chore: update axios (#2233)
wilsonrivera Sep 19, 2025
f9f51e5
chore: router ci improvement
miklosbarabas Sep 18, 2025
46fd164
chore: router ci improvement
miklosbarabas Sep 18, 2025
e438c94
chore: router ci improvement
miklosbarabas Sep 18, 2025
85b380b
chore: router ci improvement
miklosbarabas Sep 18, 2025
38fcb26
chore: router ci improvement
miklosbarabas Sep 18, 2025
4eb9971
chore: router ci improvement
miklosbarabas Sep 18, 2025
adeb222
chore: router ci improvement
miklosbarabas Sep 18, 2025
99df8e2
chore: router ci improvement
miklosbarabas Sep 18, 2025
1d2898b
chore: router ci improvement
miklosbarabas Sep 18, 2025
b18ca50
chore: router ci improvement
miklosbarabas Sep 18, 2025
c813c8c
chore: router ci improvement
miklosbarabas Sep 18, 2025
2e8508b
chore: router ci improvement
miklosbarabas Sep 18, 2025
5d16095
chore: router ci improvement
miklosbarabas Sep 18, 2025
f97a970
chore: router ci improvement
miklosbarabas Sep 18, 2025
e25c679
chore: router ci improvement
miklosbarabas Sep 18, 2025
a727b78
chore: router ci improvement
miklosbarabas Sep 18, 2025
3228fb7
chore: router ci improvement
miklosbarabas Sep 18, 2025
e88e7e3
chore: router ci improvement
miklosbarabas Sep 19, 2025
07f8920
chore: router ci improvement
miklosbarabas Sep 19, 2025
3a9b10f
chore: router ci improvement
miklosbarabas Sep 19, 2025
db81d4b
chore: router ci improvement
miklosbarabas Sep 19, 2025
de41832
chore: router ci improvement
miklosbarabas Sep 19, 2025
caf3269
chore: router ci improvement
miklosbarabas Sep 19, 2025
c91f9b4
chore: router ci improvement
miklosbarabas Sep 19, 2025
6923578
chore: router ci improvement
miklosbarabas Sep 19, 2025
acba6ee
chore: router ci improvement
miklosbarabas Sep 19, 2025
65cdfe3
chore: router ci improvement
miklosbarabas Sep 19, 2025
aef56a8
chore: router ci improvement
miklosbarabas Sep 19, 2025
babc857
chore: router ci improvement
miklosbarabas Sep 19, 2025
d8d94f4
chore: router ci improvement
miklosbarabas Sep 19, 2025
7251a49
chore: router ci improvement
miklosbarabas Sep 19, 2025
15de105
chore: router ci improvement
miklosbarabas Sep 19, 2025
a97fce6
chore: router ci improvement
miklosbarabas Sep 19, 2025
7f8c0c2
chore: router ci improvement
miklosbarabas Sep 19, 2025
8e512f6
chore: router ci improvement
miklosbarabas Sep 19, 2025
7dc1038
chore: router ci improvement
miklosbarabas Sep 19, 2025
7f222fa
chore: router ci improvement
miklosbarabas Sep 22, 2025
67d72d0
Merge remote-tracking branch 'origin/miklos/chore-router-ci-improveme…
miklosbarabas Sep 22, 2025
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
109 changes: 90 additions & 19 deletions .github/workflows/router-ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -181,17 +181,55 @@ jobs:
- 6222:6222
redis:
image: redis:7
# Set health checks to wait until redis has started
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
credentials:
username: ${{secrets.DOCKER_USERNAME}}
password: ${{secrets.DOCKER_PASSWORD}}
ports:
- 6379:6379
redis-0:
image: bitnamilegacy/redis-cluster:7.2
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
env:
ALLOW_EMPTY_PASSWORD: "yes"
REDIS_NODES: "redis-0 redis-1 redis-2"
REDIS_CLUSTER_REPLICAS: "0"
REDIS_CLUSTER_CREATOR: "no"
ports:
- 7001:6379
redis-1:
image: bitnamilegacy/redis-cluster:7.2
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
env:
ALLOW_EMPTY_PASSWORD: "yes"
REDIS_NODES: "redis-0 redis-1 redis-2"
REDIS_CLUSTER_REPLICAS: "0"
REDIS_CLUSTER_CREATOR: "no"
ports:
- 7002:6379
redis-2:
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
image: bitnamilegacy/redis-cluster:7.2
env:
ALLOW_EMPTY_PASSWORD: "yes"
REDIS_NODES: "redis-0 redis-1 redis-2"
REDIS_CLUSTER_REPLICAS: "0"
REDIS_CLUSTER_CREATOR: "yes"
ports:
- 7003:6379
kafka:
image: bitnamilegacy/kafka:3.7.0
options: >-
Expand All @@ -214,6 +252,45 @@ jobs:
ports:
- '9092:9092'
steps:
- name: Wait for Redis Cluster
run: |
echo "[CHECK] Waiting for Redis Cluster to become healthy..."
cluster_containers=$(docker ps --quiet --filter "ancestor=bitnamilegacy/redis-cluster:7.2")

success=0
for i in {1..30}; do
if [ $i -eq 1 ]; then
echo "[INIT] Forcing cluster creation..."
# pick one container as the "creator"
creator=$(echo $cluster_containers | awk '{print $1}')
# run the cluster create command inside it
docker exec "$creator" redis-cli --cluster create redis-0:6379 redis-1:6379 redis-2:6379 --cluster-replicas 0 --cluster-yes || true
fi

for cid in $cluster_containers; do
docker exec "$cid" redis-cli -p 6379 cluster info
if docker exec "$cid" redis-cli -p 6379 cluster info 2>/dev/null | grep -q "cluster_state:ok"; then
echo "[SUCCESS] Redis Cluster is ready (reported by $cid)"
success=1
break 2
fi
done

echo "[WAITING] Cluster not ready yet (attempt $i)..."
sleep 2
done

if [ $success -eq 0 ]; then
echo "[ERROR] Redis Cluster did not become healthy in time"
for cid in $cluster_containers; do
echo "--- Cluster info for $cid ---"
docker exec "$cid" redis-cli -p 6379 cluster info || true
docker exec "$cid" redis-cli -p 6379 cluster nodes || true
echo "--- Logs for $cid ---"
docker logs "$cid" | tail -n 100
done
exit 1
fi
- uses: actions/checkout@v4
- uses: ./.github/actions/go
with:
Expand All @@ -224,26 +301,20 @@ jobs:
- name: Install dependencies
working-directory: ./router-tests
run: go mod download
- name: Setup Redis Cluster (for Cluster tests)
uses: vishnudxb/redis-cluster@1.0.9
with:
master1-port: 7001
master2-port: 7002
master3-port: 7003
slave1-port: 7004
slave2-port: 7005
slave3-port: 7006
sleep-duration: 5
- name: Configure Redis Authentication & ACL
run: |
sudo apt-get install -y redis-tools
docker ps -a
# Set a password for each master node
for port in 7001 7002 7003; do
redis-cli -h 127.0.0.1 -p $port ACL SETUSER cosmo on ">test" "~*" "+@all"
redis-cli -u "redis://cosmo:test@127.0.0.1:$port" ping
echo "ACL user 'cosmo' created with full access on port $port"
for cid in $(docker ps --format "{{.ID}} {{.Image}}" | grep "redis-cluster" | awk '{print $1}'); do
echo "Configuring ACLs in container $cid"
docker exec "$cid" redis-cli -p 6379 ACL SETUSER cosmo on ">test" "~*" "+@all"
docker exec "$cid" redis-cli -p 6379 ping
done
cid=$(docker ps --format "{{.ID}} {{.Image}}" | grep "redis:7" | awk '{print $1}')
# Sanity checks
docker exec "$cid" redis-cli -p 6379 ping
docker exec "$cid" redis-cli -u "redis://cosmo:test@redis-0:6379" ping
docker exec "$cid" redis-cli -u "redis://cosmo:test@redis-0:6379" cluster nodes
- name: Run Integration tests ${{ matrix.test_target }}
working-directory: ./router-tests
run: make test test_params="-run '^Test[^(Flaky)]' --timeout=5m -p 1 --parallel 10" test_target="${{ matrix.test_target }}"
Expand Down
2 changes: 1 addition & 1 deletion cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
"@wundergraph/cosmo-shared": "workspace:*",
"@wundergraph/protographic": "workspace:*",
"ajv": "^8.17.1",
"axios": "^1.11.0",
"axios": "^1.12.2",
"boxen": "^7.1.1",
"cli-progress": "^3.12.0",
"cli-table3": "^0.6.3",
Expand Down
2 changes: 1 addition & 1 deletion composition/src/schema-building/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@ export function getClientPersistedDirectiveNodes<T extends NodeData>(nodeData: T
);
continue;
}
// Only include @deprecated and @semanticNonNull in the client schema.
// Only include @deprecated, @oneOf, and @semanticNonNull in the client schema.
if (!PERSISTED_CLIENT_DIRECTIVES.has(directiveName)) {
continue;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
MAX_OR_SCOPES,
orScopesLimitError,
parse,
QUERY,
ROUTER_COMPATIBILITY_VERSION_ONE,
Subgraph,
} from '../../../src';
Expand Down Expand Up @@ -525,20 +526,23 @@ describe('Authorization directives tests', () => {
});
});

describe('Federation Tests', () => {
describe('Federation tests', () => {
test('that @authenticated is persisted in the federated schema', () => {
const result = federateSubgraphsSuccess([faa, fab], ROUTER_COMPATIBILITY_VERSION_ONE);
expect(result.fieldConfigurations).toStrictEqual([
const { fieldConfigurations, federatedGraphClientSchema, federatedGraphSchema } = federateSubgraphsSuccess(
[faa, fab],
ROUTER_COMPATIBILITY_VERSION_ONE,
);
expect(fieldConfigurations).toStrictEqual([
{
argumentNames: [],
fieldName: 'object',
typeName: 'Query',
typeName: QUERY,
requiresAuthentication: true,
requiredScopes: [],
requiredScopesByOR: [],
},
]);
expect(schemaToSortedNormalizedString(result.federatedGraphSchema)).toBe(
expect(schemaToSortedNormalizedString(federatedGraphSchema)).toBe(
normalizeString(
versionTwoRouterDefinitions +
`
Expand All @@ -556,21 +560,40 @@ describe('Authorization directives tests', () => {
`,
),
);
expect(schemaToSortedNormalizedString(federatedGraphClientSchema)).toBe(
normalizeString(
schemaQueryDefinition +
`
type Object {
age: Int!
id: ID!
name: String!
}

type Query {
object: Object!
}
`,
),
);
});

test('that @requiresScopes is persisted in the federated schema', () => {
const result = federateSubgraphsSuccess([fab, fac], ROUTER_COMPATIBILITY_VERSION_ONE);
expect(result.fieldConfigurations).toStrictEqual([
const { fieldConfigurations, federatedGraphClientSchema, federatedGraphSchema } = federateSubgraphsSuccess(
[fab, fac],
ROUTER_COMPATIBILITY_VERSION_ONE,
);
expect(fieldConfigurations).toStrictEqual([
{
argumentNames: [],
fieldName: 'object',
typeName: 'Query',
typeName: QUERY,
requiresAuthentication: false,
requiredScopes: [['b']],
requiredScopesByOR: [['b']],
},
]);
expect(schemaToSortedNormalizedString(result.federatedGraphSchema)).toBe(
expect(schemaToSortedNormalizedString(federatedGraphSchema)).toBe(
normalizeString(
versionTwoRouterDefinitions +
`
Expand All @@ -588,6 +611,22 @@ describe('Authorization directives tests', () => {
`,
),
);
expect(schemaToSortedNormalizedString(federatedGraphClientSchema)).toBe(
normalizeString(
schemaQueryDefinition +
`
type Object {
age: Int!
id: ID!
name: String!
}

type Query {
object: Object!
}
`,
),
);
});

test('that authorization directives generate the correct router configuration', () => {
Expand Down
2 changes: 1 addition & 1 deletion controlplane/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@
"@wundergraph/cosmo-connect": "workspace:*",
"@wundergraph/cosmo-shared": "workspace:*",
"@wundergraph/protographic": "workspace:*",
"axios": "^1.11.0",
"axios": "^1.12.2",
"axios-retry": "^4.5.0",
"bullmq": "^5.10.0",
"cookie": "^0.7.2",
Expand Down
6 changes: 3 additions & 3 deletions controlplane/src/core/composition/composer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@ import {
} from '@wundergraph/composition';
import {
buildRouterConfig,
ComposedSubgraph as IComposedSubgraph,
ComposedSubgraphGRPC,
ComposedSubgraphPlugin,
ComposedSubgraph as IComposedSubgraph,
SubgraphKind,
} from '@wundergraph/cosmo-shared';
import { FastifyBaseLogger } from 'fastify';
import { DocumentNode, GraphQLSchema, parse, printSchema } from 'graphql';
import { DocumentNode, GraphQLSchema, parse } from 'graphql';
import {
FeatureFlagRouterExecutionConfig,
FeatureFlagRouterExecutionConfigs,
Expand Down Expand Up @@ -220,7 +220,7 @@ export function mapResultToComposedGraph(
namespace: federatedGraph.namespace,
namespaceId: federatedGraph.namespaceId,
composedSchema: result.success ? printSchemaWithDirectives(result.federatedGraphSchema) : undefined,
federatedClientSchema: result.success ? printSchema(result.federatedGraphClientSchema) : undefined,
federatedClientSchema: result.success ? printSchemaWithDirectives(result.federatedGraphClientSchema) : undefined,
shouldIncludeClientSchema: result.success ? result.shouldIncludeClientSchema : false,
errors: result.success ? [] : result.errors,
subgraphs: subgraphDTOsToComposedSubgraphs(federatedGraph.organizationId, subgraphs, result),
Expand Down
Loading
Loading